diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1d52342 --- /dev/null +++ b/.gitignore @@ -0,0 +1,96 @@ +NetBirdSDK.xcframework/ +Netbird.xcframework/ +GoogleService-Info*.plist +.DS_Store +xcuserdata/ + +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +## Obj-C/Swift specific +*.hmap + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +# *.xcodeproj +# +# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata +# hence it is not needed unless you have added a package configuration file to your project +# .swiftpm + +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ +# +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build/ + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..b4a1a61 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,132 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +community@netbird.io. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f1972fb --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright © 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. + + {one line to give the program's name and a brief idea of what it does.} + Copyright © {year} {name of author} + + 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: + + {project} Copyright © {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/NetBird-Bridging-Header.h b/NetBird-Bridging-Header.h new file mode 100644 index 0000000..df5d602 --- /dev/null +++ b/NetBird-Bridging-Header.h @@ -0,0 +1,7 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + + +#import +#import "WireGuardKitC/WireGuardKitC.h" diff --git a/NetBird.xcodeproj/project.pbxproj b/NetBird.xcodeproj/project.pbxproj new file mode 100644 index 0000000..52cad03 --- /dev/null +++ b/NetBird.xcodeproj/project.pbxproj @@ -0,0 +1,977 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 50003BBC2AFBCA6B00E5EB6B /* FirebasePerformance in Frameworks */ = {isa = PBXBuildFile; productRef = 50003BBB2AFBCA6B00E5EB6B /* FirebasePerformance */; }; + 50003BBE2AFBCA7900E5EB6B /* FirebasePerformance in Frameworks */ = {isa = PBXBuildFile; productRef = 50003BBD2AFBCA7900E5EB6B /* FirebasePerformance */; }; + 50003BC42AFBD7D500E5EB6B /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A562A80431C0034792B /* PacketTunnelProvider.swift */; }; + 50003BC72AFBD7F200E5EB6B /* NetBirdAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C727EB2A824812006E898D /* NetBirdAdapter.swift */; }; + 50003BCA2AFD2F5E00E5EB6B /* ConnectionListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50003BC82AFD2F0C00E5EB6B /* ConnectionListener.swift */; }; + 50003BCC2AFD3B0C00E5EB6B /* ClientState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50003BCB2AFD3B0C00E5EB6B /* ClientState.swift */; }; + 50003BCD2AFD3B2B00E5EB6B /* ClientState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50003BCB2AFD3B0C00E5EB6B /* ClientState.swift */; }; + 50003BCE2AFD405600E5EB6B /* ConnectionListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50003BC82AFD2F0C00E5EB6B /* ConnectionListener.swift */; }; + 50051DE02AE69A8100AFBDC4 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = 50051DDF2AE69A8100AFBDC4 /* FirebaseCrashlytics */; }; + 501B0DCD2AE04DDE004BE7A7 /* button-disconnecting.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC52AE04DDE004BE7A7 /* button-disconnecting.json */; }; + 501B0DCE2AE04DDE004BE7A7 /* button-disconnecting.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC52AE04DDE004BE7A7 /* button-disconnecting.json */; }; + 501B0DCF2AE04DDE004BE7A7 /* button-connecting-loop.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC62AE04DDE004BE7A7 /* button-connecting-loop.json */; }; + 501B0DD02AE04DDE004BE7A7 /* button-connecting-loop.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC62AE04DDE004BE7A7 /* button-connecting-loop.json */; }; + 501B0DD12AE04DDE004BE7A7 /* logo_NetBird.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC72AE04DDE004BE7A7 /* logo_NetBird.json */; }; + 501B0DD22AE04DDE004BE7A7 /* logo_NetBird.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC72AE04DDE004BE7A7 /* logo_NetBird.json */; }; + 501B0DD32AE04DDE004BE7A7 /* loading.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC82AE04DDE004BE7A7 /* loading.json */; }; + 501B0DD42AE04DDE004BE7A7 /* loading.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC82AE04DDE004BE7A7 /* loading.json */; }; + 501B0DD52AE04DDE004BE7A7 /* button-start-connecting.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC92AE04DDE004BE7A7 /* button-start-connecting.json */; }; + 501B0DD62AE04DDE004BE7A7 /* button-start-connecting.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DC92AE04DDE004BE7A7 /* button-start-connecting.json */; }; + 501B0DD72AE04DDE004BE7A7 /* button-full2.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCA2AE04DDE004BE7A7 /* button-full2.json */; }; + 501B0DD82AE04DDE004BE7A7 /* button-full2.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCA2AE04DDE004BE7A7 /* button-full2.json */; }; + 501B0DD92AE04DDE004BE7A7 /* button-full.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCB2AE04DDE004BE7A7 /* button-full.json */; }; + 501B0DDA2AE04DDE004BE7A7 /* button-full.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCB2AE04DDE004BE7A7 /* button-full.json */; }; + 501B0DDB2AE04DDE004BE7A7 /* button-connected.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCC2AE04DDE004BE7A7 /* button-connected.json */; }; + 501B0DDC2AE04DDE004BE7A7 /* button-connected.json in Resources */ = {isa = PBXBuildFile; fileRef = 501B0DCC2AE04DDE004BE7A7 /* button-connected.json */; }; + 501B0E012AE27ABA004BE7A7 /* NetBirdSDK.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 501B0E002AE27ABA004BE7A7 /* NetBirdSDK.xcframework */; }; + 50213A262A8D0A870031D993 /* NetworkChangeListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A2D2A7BDC470034792B /* NetworkChangeListener.swift */; }; + 50213A2D2A8D0AA30031D993 /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A292A7BDB590034792B /* Preferences.swift */; }; + 50216D892ACB18EE009574C9 /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A292A7BDB590034792B /* Preferences.swift */; }; + 50216D8E2ACB1905009574C9 /* NetworkChangeListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A2D2A7BDC470034792B /* NetworkChangeListener.swift */; }; + 50216D932ACB2488009574C9 /* NetworkExtensionAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50216D922ACB2488009574C9 /* NetworkExtensionAdapter.swift */; }; + 502455BD2A79B0480034792B /* CustomBackButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502455BC2A79B0480034792B /* CustomBackButton.swift */; }; + 502455BF2A79B4500034792B /* SolidButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502455BE2A79B4500034792B /* SolidButton.swift */; }; + 50245A1A2A7BCE890034792B /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 50245A192A7BCE830034792B /* libresolv.tbd */; }; + 50245A542A80431B0034792B /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50245A532A80431B0034792B /* NetworkExtension.framework */; }; + 50245A572A80431C0034792B /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50245A562A80431C0034792B /* PacketTunnelProvider.swift */; }; + 50245A5C2A80431C0034792B /* NetbirdNetworkExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 50245A522A80431B0034792B /* NetbirdNetworkExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 505118CE2AD96ECA003027D3 /* x25519.c in Sources */ = {isa = PBXBuildFile; fileRef = 505118CA2AD96ECA003027D3 /* x25519.c */; }; + 505118CF2AD96ECA003027D3 /* x25519.c in Sources */ = {isa = PBXBuildFile; fileRef = 505118CA2AD96ECA003027D3 /* x25519.c */; }; + 505118D02AD96ECA003027D3 /* key.c in Sources */ = {isa = PBXBuildFile; fileRef = 505118CB2AD96ECA003027D3 /* key.c */; }; + 505118D12AD96ECA003027D3 /* key.c in Sources */ = {isa = PBXBuildFile; fileRef = 505118CB2AD96ECA003027D3 /* key.c */; }; + 5051190F2AE03F68003027D3 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 5051190E2AE03F68003027D3 /* FirebaseAnalytics */; }; + 505119112AE03F68003027D3 /* FirebaseAnalyticsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 505119102AE03F68003027D3 /* FirebaseAnalyticsSwift */; }; + 505119132AE03F68003027D3 /* FirebaseAppCheck in Frameworks */ = {isa = PBXBuildFile; productRef = 505119122AE03F68003027D3 /* FirebaseAppCheck */; }; + 506331F82AF1676B00BC8F0E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 506331F72AF1676B00BC8F0E /* GoogleService-Info.plist */; }; + 506331F92AF1676B00BC8F0E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 506331F72AF1676B00BC8F0E /* GoogleService-Info.plist */; }; + 506331FB2AF52AB900BC8F0E /* CustomLottieView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506331FA2AF52AB900BC8F0E /* CustomLottieView.swift */; }; + 506331FE2AF53CFF00BC8F0E /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 506331FD2AF53CFF00BC8F0E /* Lottie */; }; + 506332002AF9197700BC8F0E /* button-full2-dark.json in Resources */ = {isa = PBXBuildFile; fileRef = 506331FF2AF9197700BC8F0E /* button-full2-dark.json */; }; + 506332022AF9415500BC8F0E /* CustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506332012AF9415500BC8F0E /* CustomTextField.swift */; }; + 508BD8452AF04A990055E415 /* SafariView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508BD8442AF04A990055E415 /* SafariView.swift */; }; + 508BD8472AF140D50055E415 /* FirebaseAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = 508BD8462AF140D50055E415 /* FirebaseAnalytics */; }; + 508BD8492AF140D50055E415 /* FirebaseAnalyticsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 508BD8482AF140D50055E415 /* FirebaseAnalyticsSwift */; }; + 508BD84B2AF140D50055E415 /* FirebaseCrashlytics in Frameworks */ = {isa = PBXBuildFile; productRef = 508BD84A2AF140D50055E415 /* FirebaseCrashlytics */; }; + 50A8911B2A792A15007C48FC /* NetBirdApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A8911A2A792A15007C48FC /* NetBirdApp.swift */; }; + 50A8911D2A792A15007C48FC /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A8911C2A792A15007C48FC /* MainView.swift */; }; + 50A8911F2A792A16007C48FC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 50A8911E2A792A16007C48FC /* Assets.xcassets */; }; + 50C727ED2A824C10006E898D /* NetBirdAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C727EB2A824812006E898D /* NetBirdAdapter.swift */; }; + 50C78AD12A82BBFD006E898D /* Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608022A7950CB00BAF09B /* Device.swift */; }; + 50C78AEA2A82C858006E898D /* Device.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608022A7950CB00BAF09B /* Device.swift */; }; + 50C78AFA2A82D036006E898D /* libresolv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 50245A192A7BCE830034792B /* libresolv.tbd */; }; + 50CD814F2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD814E2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift */; }; + 50CD81502AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD814E2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift */; }; + 50CD81622AD0595E00CF830B /* DNSManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81612AD0595E00CF830B /* DNSManager.swift */; }; + 50CD81632AD0595E00CF830B /* DNSManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81612AD0595E00CF830B /* DNSManager.swift */; }; + 50CD81A72AD5504B00CF830B /* StatusDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81A62AD5504B00CF830B /* StatusDetails.swift */; }; + 50CD81A82AD5504B00CF830B /* StatusDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81A62AD5504B00CF830B /* StatusDetails.swift */; }; + 50CD81B02AD5B94D00CF830B /* PeerCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81AF2AD5B94D00CF830B /* PeerCard.swift */; }; + 50CD81B12AD5B94D00CF830B /* PeerCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD81AF2AD5B94D00CF830B /* PeerCard.swift */; }; + 50CD84362AD82F9400CF830B /* ServerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50CD84352AD82F9400CF830B /* ServerView.swift */; }; + 50E608132A7958B100BAF09B /* MainViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608122A7958B100BAF09B /* MainViewModel.swift */; }; + 50E608202A7979D600BAF09B /* SideDrawer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E6081F2A7979D600BAF09B /* SideDrawer.swift */; }; + 50E608242A79966600BAF09B /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608232A79966600BAF09B /* AboutView.swift */; }; + 50E608262A79968500BAF09B /* AdvancedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E608252A79968500BAF09B /* AdvancedView.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 50245A5A2A80431C0034792B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 50A8910F2A792A15007C48FC /* Project object */; + proxyType = 1; + remoteGlobalIDString = 50245A512A80431B0034792B; + remoteInfo = NetbirdNetworkExtension; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 50245A602A80431C0034792B /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 50245A5C2A80431C0034792B /* NetbirdNetworkExtension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 50003BC82AFD2F0C00E5EB6B /* ConnectionListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionListener.swift; sourceTree = ""; }; + 50003BCB2AFD3B0C00E5EB6B /* ClientState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientState.swift; sourceTree = ""; }; + 501B0DC52AE04DDE004BE7A7 /* button-disconnecting.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-disconnecting.json"; sourceTree = ""; }; + 501B0DC62AE04DDE004BE7A7 /* button-connecting-loop.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-connecting-loop.json"; sourceTree = ""; }; + 501B0DC72AE04DDE004BE7A7 /* logo_NetBird.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = logo_NetBird.json; sourceTree = ""; }; + 501B0DC82AE04DDE004BE7A7 /* loading.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = loading.json; sourceTree = ""; }; + 501B0DC92AE04DDE004BE7A7 /* button-start-connecting.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-start-connecting.json"; sourceTree = ""; }; + 501B0DCA2AE04DDE004BE7A7 /* button-full2.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-full2.json"; sourceTree = ""; }; + 501B0DCB2AE04DDE004BE7A7 /* button-full.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-full.json"; sourceTree = ""; }; + 501B0DCC2AE04DDE004BE7A7 /* button-connected.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-connected.json"; sourceTree = ""; }; + 501B0E002AE27ABA004BE7A7 /* NetBirdSDK.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = NetBirdSDK.xcframework; sourceTree = ""; }; + 50216D922ACB2488009574C9 /* NetworkExtensionAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkExtensionAdapter.swift; sourceTree = ""; }; + 502455BC2A79B0480034792B /* CustomBackButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomBackButton.swift; sourceTree = ""; }; + 502455BE2A79B4500034792B /* SolidButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SolidButton.swift; sourceTree = ""; }; + 50245A0A2A7AA9390034792B /* NetBird-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NetBird-Bridging-Header.h"; sourceTree = ""; }; + 50245A192A7BCE830034792B /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; }; + 50245A1B2A7BCF120034792B /* NetBird.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NetBird.entitlements; sourceTree = ""; }; + 50245A292A7BDB590034792B /* Preferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Preferences.swift; sourceTree = ""; }; + 50245A2D2A7BDC470034792B /* NetworkChangeListener.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkChangeListener.swift; sourceTree = ""; }; + 50245A3B2A7FD1CD0034792B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 50245A522A80431B0034792B /* NetbirdNetworkExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NetbirdNetworkExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 50245A532A80431B0034792B /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; + 50245A562A80431C0034792B /* PacketTunnelProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelProvider.swift; sourceTree = ""; }; + 50245A582A80431C0034792B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 50245A592A80431C0034792B /* NetbirdNetworkExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NetbirdNetworkExtension.entitlements; sourceTree = ""; }; + 505118C82AD96ECA003027D3 /* WireGuardKitC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WireGuardKitC.h; sourceTree = ""; }; + 505118C92AD96ECA003027D3 /* key.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = key.h; sourceTree = ""; }; + 505118CA2AD96ECA003027D3 /* x25519.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = x25519.c; sourceTree = ""; }; + 505118CB2AD96ECA003027D3 /* key.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = key.c; sourceTree = ""; }; + 505118CC2AD96ECA003027D3 /* module.modulemap */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; + 505118CD2AD96ECA003027D3 /* x25519.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x25519.h; sourceTree = ""; }; + 506331F72AF1676B00BC8F0E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; + 506331FA2AF52AB900BC8F0E /* CustomLottieView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomLottieView.swift; sourceTree = ""; }; + 506331FF2AF9197700BC8F0E /* button-full2-dark.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "button-full2-dark.json"; sourceTree = ""; }; + 506332012AF9415500BC8F0E /* CustomTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTextField.swift; sourceTree = ""; }; + 508BD8442AF04A990055E415 /* SafariView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariView.swift; sourceTree = ""; }; + 50A891172A792A15007C48FC /* NetBird.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NetBird.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 50A8911A2A792A15007C48FC /* NetBirdApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetBirdApp.swift; sourceTree = ""; }; + 50A8911C2A792A15007C48FC /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = ""; }; + 50A8911E2A792A16007C48FC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 50C727EB2A824812006E898D /* NetBirdAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetBirdAdapter.swift; sourceTree = ""; }; + 50CD814E2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelProviderSettingsManager.swift; sourceTree = ""; }; + 50CD81612AD0595E00CF830B /* DNSManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DNSManager.swift; sourceTree = ""; }; + 50CD81A62AD5504B00CF830B /* StatusDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusDetails.swift; sourceTree = ""; }; + 50CD81AF2AD5B94D00CF830B /* PeerCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerCard.swift; sourceTree = ""; }; + 50CD84352AD82F9400CF830B /* ServerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerView.swift; sourceTree = ""; }; + 50E608022A7950CB00BAF09B /* Device.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Device.swift; sourceTree = ""; }; + 50E608122A7958B100BAF09B /* MainViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewModel.swift; sourceTree = ""; }; + 50E6081F2A7979D600BAF09B /* SideDrawer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideDrawer.swift; sourceTree = ""; }; + 50E608232A79966600BAF09B /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; }; + 50E608252A79968500BAF09B /* AdvancedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedView.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 50245A4F2A80431B0034792B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 508BD8492AF140D50055E415 /* FirebaseAnalyticsSwift in Frameworks */, + 50245A542A80431B0034792B /* NetworkExtension.framework in Frameworks */, + 50003BBE2AFBCA7900E5EB6B /* FirebasePerformance in Frameworks */, + 508BD84B2AF140D50055E415 /* FirebaseCrashlytics in Frameworks */, + 50C78AFA2A82D036006E898D /* libresolv.tbd in Frameworks */, + 508BD8472AF140D50055E415 /* FirebaseAnalytics in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 50A891142A792A15007C48FC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 505119112AE03F68003027D3 /* FirebaseAnalyticsSwift in Frameworks */, + 506331FE2AF53CFF00BC8F0E /* Lottie in Frameworks */, + 50245A1A2A7BCE890034792B /* libresolv.tbd in Frameworks */, + 505119132AE03F68003027D3 /* FirebaseAppCheck in Frameworks */, + 50051DE02AE69A8100AFBDC4 /* FirebaseCrashlytics in Frameworks */, + 501B0E012AE27ABA004BE7A7 /* NetBirdSDK.xcframework in Frameworks */, + 50003BBC2AFBCA6B00E5EB6B /* FirebasePerformance in Frameworks */, + 5051190F2AE03F68003027D3 /* FirebaseAnalytics in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 501B0DC42AE04DDE004BE7A7 /* animations */ = { + isa = PBXGroup; + children = ( + 501B0DC52AE04DDE004BE7A7 /* button-disconnecting.json */, + 501B0DC62AE04DDE004BE7A7 /* button-connecting-loop.json */, + 501B0DC72AE04DDE004BE7A7 /* logo_NetBird.json */, + 501B0DC82AE04DDE004BE7A7 /* loading.json */, + 501B0DC92AE04DDE004BE7A7 /* button-start-connecting.json */, + 501B0DCA2AE04DDE004BE7A7 /* button-full2.json */, + 501B0DCB2AE04DDE004BE7A7 /* button-full.json */, + 506331FF2AF9197700BC8F0E /* button-full2-dark.json */, + 501B0DCC2AE04DDE004BE7A7 /* button-connected.json */, + ); + path = animations; + sourceTree = ""; + }; + 50245A182A7BCE830034792B /* Frameworks */ = { + isa = PBXGroup; + children = ( + 50245A192A7BCE830034792B /* libresolv.tbd */, + 50245A532A80431B0034792B /* NetworkExtension.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 50245A552A80431C0034792B /* NetbirdNetworkExtension */ = { + isa = PBXGroup; + children = ( + 50C727EB2A824812006E898D /* NetBirdAdapter.swift */, + 50245A562A80431C0034792B /* PacketTunnelProvider.swift */, + 50245A582A80431C0034792B /* Info.plist */, + 50245A592A80431C0034792B /* NetbirdNetworkExtension.entitlements */, + 50CD814E2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift */, + ); + path = NetbirdNetworkExtension; + sourceTree = ""; + }; + 505118C72AD96ECA003027D3 /* WireGuardKitC */ = { + isa = PBXGroup; + children = ( + 505118C82AD96ECA003027D3 /* WireGuardKitC.h */, + 505118C92AD96ECA003027D3 /* key.h */, + 505118CA2AD96ECA003027D3 /* x25519.c */, + 505118CB2AD96ECA003027D3 /* key.c */, + 505118CC2AD96ECA003027D3 /* module.modulemap */, + 505118CD2AD96ECA003027D3 /* x25519.h */, + ); + path = WireGuardKitC; + sourceTree = ""; + }; + 50A8910E2A792A15007C48FC = { + isa = PBXGroup; + children = ( + 506331F72AF1676B00BC8F0E /* GoogleService-Info.plist */, + 501B0E002AE27ABA004BE7A7 /* NetBirdSDK.xcframework */, + 50245A0A2A7AA9390034792B /* NetBird-Bridging-Header.h */, + 50A891192A792A15007C48FC /* NetBird */, + 50C727EA2A82479B006E898D /* NetbirdKit */, + 50245A552A80431C0034792B /* NetbirdNetworkExtension */, + 505118C72AD96ECA003027D3 /* WireGuardKitC */, + 50A891182A792A15007C48FC /* Products */, + 50245A182A7BCE830034792B /* Frameworks */, + ); + sourceTree = ""; + }; + 50A891182A792A15007C48FC /* Products */ = { + isa = PBXGroup; + children = ( + 50A891172A792A15007C48FC /* NetBird.app */, + 50245A522A80431B0034792B /* NetbirdNetworkExtension.appex */, + ); + name = Products; + sourceTree = ""; + }; + 50A891192A792A15007C48FC /* NetBird */ = { + isa = PBXGroup; + children = ( + 50245A3B2A7FD1CD0034792B /* Info.plist */, + 50245A1B2A7BCF120034792B /* NetBird.entitlements */, + 50E608082A79542D00BAF09B /* Source */, + 50A8911E2A792A16007C48FC /* Assets.xcassets */, + ); + path = NetBird; + sourceTree = ""; + }; + 50C727EA2A82479B006E898D /* NetbirdKit */ = { + isa = PBXGroup; + children = ( + 50245A292A7BDB590034792B /* Preferences.swift */, + 50245A2D2A7BDC470034792B /* NetworkChangeListener.swift */, + 50CD81612AD0595E00CF830B /* DNSManager.swift */, + 50E608022A7950CB00BAF09B /* Device.swift */, + 50216D922ACB2488009574C9 /* NetworkExtensionAdapter.swift */, + 50CD81A62AD5504B00CF830B /* StatusDetails.swift */, + 50003BC82AFD2F0C00E5EB6B /* ConnectionListener.swift */, + 50003BCB2AFD3B0C00E5EB6B /* ClientState.swift */, + ); + path = NetbirdKit; + sourceTree = ""; + }; + 50E607FF2A794F8200BAF09B /* Views */ = { + isa = PBXGroup; + children = ( + 50E608092A79557A00BAF09B /* Components */, + 50A8911C2A792A15007C48FC /* MainView.swift */, + 50E608232A79966600BAF09B /* AboutView.swift */, + 50E608252A79968500BAF09B /* AdvancedView.swift */, + 50CD84352AD82F9400CF830B /* ServerView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 50E608012A7950C000BAF09B /* ViewModels */ = { + isa = PBXGroup; + children = ( + 50E608122A7958B100BAF09B /* MainViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + 50E608082A79542D00BAF09B /* Source */ = { + isa = PBXGroup; + children = ( + 501B0DC42AE04DDE004BE7A7 /* animations */, + 50E6080A2A79568800BAF09B /* App */, + ); + path = Source; + sourceTree = ""; + }; + 50E608092A79557A00BAF09B /* Components */ = { + isa = PBXGroup; + children = ( + 50E6081F2A7979D600BAF09B /* SideDrawer.swift */, + 502455BC2A79B0480034792B /* CustomBackButton.swift */, + 502455BE2A79B4500034792B /* SolidButton.swift */, + 50CD81AF2AD5B94D00CF830B /* PeerCard.swift */, + 508BD8442AF04A990055E415 /* SafariView.swift */, + 506331FA2AF52AB900BC8F0E /* CustomLottieView.swift */, + 506332012AF9415500BC8F0E /* CustomTextField.swift */, + ); + path = Components; + sourceTree = ""; + }; + 50E6080A2A79568800BAF09B /* App */ = { + isa = PBXGroup; + children = ( + 50A8911A2A792A15007C48FC /* NetBirdApp.swift */, + 50E607FF2A794F8200BAF09B /* Views */, + 50E608012A7950C000BAF09B /* ViewModels */, + ); + path = App; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 50245A512A80431B0034792B /* NetbirdNetworkExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 50245A5D2A80431C0034792B /* Build configuration list for PBXNativeTarget "NetbirdNetworkExtension" */; + buildPhases = ( + 50245A4E2A80431B0034792B /* Sources */, + 50245A4F2A80431B0034792B /* Frameworks */, + 50245A502A80431B0034792B /* Resources */, + 508BD8522AF158F80055E415 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = NetbirdNetworkExtension; + packageProductDependencies = ( + 508BD8462AF140D50055E415 /* FirebaseAnalytics */, + 508BD8482AF140D50055E415 /* FirebaseAnalyticsSwift */, + 508BD84A2AF140D50055E415 /* FirebaseCrashlytics */, + 50003BBD2AFBCA7900E5EB6B /* FirebasePerformance */, + ); + productName = NetbirdNetworkExtension; + productReference = 50245A522A80431B0034792B /* NetbirdNetworkExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; + 50A891162A792A15007C48FC /* NetBird */ = { + isa = PBXNativeTarget; + buildConfigurationList = 50A891252A792A16007C48FC /* Build configuration list for PBXNativeTarget "NetBird" */; + buildPhases = ( + 50A891132A792A15007C48FC /* Sources */, + 50A891142A792A15007C48FC /* Frameworks */, + 50A891152A792A15007C48FC /* Resources */, + 50245A602A80431C0034792B /* Embed Foundation Extensions */, + 508BD8502AF153350055E415 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 50245A5B2A80431C0034792B /* PBXTargetDependency */, + ); + name = NetBird; + packageProductDependencies = ( + 5051190E2AE03F68003027D3 /* FirebaseAnalytics */, + 505119102AE03F68003027D3 /* FirebaseAnalyticsSwift */, + 505119122AE03F68003027D3 /* FirebaseAppCheck */, + 50051DDF2AE69A8100AFBDC4 /* FirebaseCrashlytics */, + 506331FD2AF53CFF00BC8F0E /* Lottie */, + 50003BBB2AFBCA6B00E5EB6B /* FirebasePerformance */, + ); + productName = NetBirdiOS; + productReference = 50A891172A792A15007C48FC /* NetBird.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 50A8910F2A792A15007C48FC /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1430; + LastUpgradeCheck = 1430; + TargetAttributes = { + 50245A512A80431B0034792B = { + CreatedOnToolsVersion = 14.3.1; + LastSwiftMigration = 1430; + }; + 50A891162A792A15007C48FC = { + CreatedOnToolsVersion = 14.3.1; + LastSwiftMigration = 1430; + }; + }; + }; + buildConfigurationList = 50A891122A792A15007C48FC /* Build configuration list for PBXProject "NetBird" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 50A8910E2A792A15007C48FC; + packageReferences = ( + 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, + 506331FC2AF52B8100BC8F0E /* XCRemoteSwiftPackageReference "lottie-ios" */, + ); + productRefGroup = 50A891182A792A15007C48FC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 50A891162A792A15007C48FC /* NetBird */, + 50245A512A80431B0034792B /* NetbirdNetworkExtension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 50245A502A80431B0034792B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 501B0DCE2AE04DDE004BE7A7 /* button-disconnecting.json in Resources */, + 501B0DD22AE04DDE004BE7A7 /* logo_NetBird.json in Resources */, + 501B0DDC2AE04DDE004BE7A7 /* button-connected.json in Resources */, + 501B0DD62AE04DDE004BE7A7 /* button-start-connecting.json in Resources */, + 501B0DDA2AE04DDE004BE7A7 /* button-full.json in Resources */, + 501B0DD02AE04DDE004BE7A7 /* button-connecting-loop.json in Resources */, + 506331F92AF1676B00BC8F0E /* GoogleService-Info.plist in Resources */, + 501B0DD82AE04DDE004BE7A7 /* button-full2.json in Resources */, + 501B0DD42AE04DDE004BE7A7 /* loading.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 50A891152A792A15007C48FC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 506332002AF9197700BC8F0E /* button-full2-dark.json in Resources */, + 501B0DD52AE04DDE004BE7A7 /* button-start-connecting.json in Resources */, + 50A8911F2A792A16007C48FC /* Assets.xcassets in Resources */, + 501B0DD32AE04DDE004BE7A7 /* loading.json in Resources */, + 501B0DD92AE04DDE004BE7A7 /* button-full.json in Resources */, + 501B0DCD2AE04DDE004BE7A7 /* button-disconnecting.json in Resources */, + 501B0DD12AE04DDE004BE7A7 /* logo_NetBird.json in Resources */, + 501B0DDB2AE04DDE004BE7A7 /* button-connected.json in Resources */, + 506331F82AF1676B00BC8F0E /* GoogleService-Info.plist in Resources */, + 501B0DCF2AE04DDE004BE7A7 /* button-connecting-loop.json in Resources */, + 501B0DD72AE04DDE004BE7A7 /* button-full2.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 508BD8502AF153350055E415 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist", + "$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist", + "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)", + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n\"${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\"\n"; + }; + 508BD8522AF158F80055E415 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}", + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist", + "$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist", + "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)", + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n\"${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 50245A4E2A80431B0034792B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 50CD81632AD0595E00CF830B /* DNSManager.swift in Sources */, + 50C727ED2A824C10006E898D /* NetBirdAdapter.swift in Sources */, + 50245A572A80431C0034792B /* PacketTunnelProvider.swift in Sources */, + 505118D12AD96ECA003027D3 /* key.c in Sources */, + 50213A2D2A8D0AA30031D993 /* Preferences.swift in Sources */, + 50CD81A82AD5504B00CF830B /* StatusDetails.swift in Sources */, + 50003BCA2AFD2F5E00E5EB6B /* ConnectionListener.swift in Sources */, + 50213A262A8D0A870031D993 /* NetworkChangeListener.swift in Sources */, + 50CD81502AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift in Sources */, + 50003BCD2AFD3B2B00E5EB6B /* ClientState.swift in Sources */, + 50CD81B12AD5B94D00CF830B /* PeerCard.swift in Sources */, + 50C78AD12A82BBFD006E898D /* Device.swift in Sources */, + 505118CF2AD96ECA003027D3 /* x25519.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 50A891132A792A15007C48FC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 50CD84362AD82F9400CF830B /* ServerView.swift in Sources */, + 50A8911D2A792A15007C48FC /* MainView.swift in Sources */, + 50CD814F2AD0355000CF830B /* PacketTunnelProviderSettingsManager.swift in Sources */, + 50C78AEA2A82C858006E898D /* Device.swift in Sources */, + 50A8911B2A792A15007C48FC /* NetBirdApp.swift in Sources */, + 502455BF2A79B4500034792B /* SolidButton.swift in Sources */, + 50E608202A7979D600BAF09B /* SideDrawer.swift in Sources */, + 50216D932ACB2488009574C9 /* NetworkExtensionAdapter.swift in Sources */, + 506331FB2AF52AB900BC8F0E /* CustomLottieView.swift in Sources */, + 50003BCC2AFD3B0C00E5EB6B /* ClientState.swift in Sources */, + 506332022AF9415500BC8F0E /* CustomTextField.swift in Sources */, + 50003BC42AFBD7D500E5EB6B /* PacketTunnelProvider.swift in Sources */, + 50216D8E2ACB1905009574C9 /* NetworkChangeListener.swift in Sources */, + 50CD81A72AD5504B00CF830B /* StatusDetails.swift in Sources */, + 505118CE2AD96ECA003027D3 /* x25519.c in Sources */, + 508BD8452AF04A990055E415 /* SafariView.swift in Sources */, + 505118D02AD96ECA003027D3 /* key.c in Sources */, + 50E608262A79968500BAF09B /* AdvancedView.swift in Sources */, + 50E608242A79966600BAF09B /* AboutView.swift in Sources */, + 50CD81622AD0595E00CF830B /* DNSManager.swift in Sources */, + 502455BD2A79B0480034792B /* CustomBackButton.swift in Sources */, + 50216D892ACB18EE009574C9 /* Preferences.swift in Sources */, + 50CD81B02AD5B94D00CF830B /* PeerCard.swift in Sources */, + 50003BCE2AFD405600E5EB6B /* ConnectionListener.swift in Sources */, + 50003BC72AFBD7F200E5EB6B /* NetBirdAdapter.swift in Sources */, + 50E608132A7958B100BAF09B /* MainViewModel.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 50245A5B2A80431C0034792B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 50245A512A80431B0034792B /* NetbirdNetworkExtension */; + targetProxy = 50245A5A2A80431C0034792B /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 50245A5E2A80431C0034792B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = NetbirdNetworkExtension/NetbirdNetworkExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = TA739QLA7A; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = NetbirdNetworkExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NetbirdNetworkExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = io.netbird.app.NetbirdNetworkExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "NetBird-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 50245A5F2A80431C0034792B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = NetbirdNetworkExtension/NetbirdNetworkExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = TA739QLA7A; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = NetbirdNetworkExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NetbirdNetworkExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = io.netbird.app.NetbirdNetworkExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "NetBird-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 50A891232A792A16007C48FC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_PRECOMPILE_BRIDGING_HEADER = NO; + }; + name = Debug; + }; + 50A891242A792A16007C48FC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_PRECOMPILE_BRIDGING_HEADER = NO; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 50A891262A792A16007C48FC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = NetBird/NetBird.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 3; + DEVELOPMENT_ASSET_PATHS = ""; + DEVELOPMENT_TEAM = TA739QLA7A; + ENABLE_PREVIEWS = YES; + FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/**"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = NetBird/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NetBird; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UIRequiresFullScreen = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UIUserInterfaceStyle = Automatic; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/WireGuardKitGo/out", + "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/cmd/objdump/testdata", + "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/go/internal/gcimporter/testdata/versions", + "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/go/internal/gccgoimporter/testdata", + "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge", + ); + MARKETING_VERSION = 0.0.2; + PRODUCT_BUNDLE_IDENTIFIER = io.netbird.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "NetBird-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 50A891272A792A16007C48FC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = NetBird/NetBird.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 3; + DEVELOPMENT_ASSET_PATHS = ""; + DEVELOPMENT_TEAM = TA739QLA7A; + ENABLE_PREVIEWS = YES; + FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/**"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = NetBird/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NetBird; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UIRequiresFullScreen = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UIUserInterfaceStyle = Automatic; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/WireGuardKitGo/out", + "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/cmd/objdump/testdata", + "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/go/internal/gcimporter/testdata/versions", + "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge/goroot/src/go/internal/gccgoimporter/testdata", + "$(PROJECT_DIR)/WireGuardKitGo/.tmp/wireguard-go-bridge", + ); + MARKETING_VERSION = 0.0.2; + PRODUCT_BUNDLE_IDENTIFIER = io.netbird.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "NetBird-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 50245A5D2A80431C0034792B /* Build configuration list for PBXNativeTarget "NetbirdNetworkExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 50245A5E2A80431C0034792B /* Debug */, + 50245A5F2A80431C0034792B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 50A891122A792A15007C48FC /* Build configuration list for PBXProject "NetBird" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 50A891232A792A16007C48FC /* Debug */, + 50A891242A792A16007C48FC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 50A891252A792A16007C48FC /* Build configuration list for PBXNativeTarget "NetBird" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 50A891262A792A16007C48FC /* Debug */, + 50A891272A792A16007C48FC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/firebase/firebase-ios-sdk"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 10.16.0; + }; + }; + 506331FC2AF52B8100BC8F0E /* XCRemoteSwiftPackageReference "lottie-ios" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/airbnb/lottie-ios"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.3.3; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 50003BBB2AFBCA6B00E5EB6B /* FirebasePerformance */ = { + isa = XCSwiftPackageProductDependency; + package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebasePerformance; + }; + 50003BBD2AFBCA7900E5EB6B /* FirebasePerformance */ = { + isa = XCSwiftPackageProductDependency; + package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebasePerformance; + }; + 50051DDF2AE69A8100AFBDC4 /* FirebaseCrashlytics */ = { + isa = XCSwiftPackageProductDependency; + package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseCrashlytics; + }; + 5051190E2AE03F68003027D3 /* FirebaseAnalytics */ = { + isa = XCSwiftPackageProductDependency; + package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalytics; + }; + 505119102AE03F68003027D3 /* FirebaseAnalyticsSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalyticsSwift; + }; + 505119122AE03F68003027D3 /* FirebaseAppCheck */ = { + isa = XCSwiftPackageProductDependency; + package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAppCheck; + }; + 506331FD2AF53CFF00BC8F0E /* Lottie */ = { + isa = XCSwiftPackageProductDependency; + package = 506331FC2AF52B8100BC8F0E /* XCRemoteSwiftPackageReference "lottie-ios" */; + productName = Lottie; + }; + 508BD8462AF140D50055E415 /* FirebaseAnalytics */ = { + isa = XCSwiftPackageProductDependency; + package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalytics; + }; + 508BD8482AF140D50055E415 /* FirebaseAnalyticsSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseAnalyticsSwift; + }; + 508BD84A2AF140D50055E415 /* FirebaseCrashlytics */ = { + isa = XCSwiftPackageProductDependency; + package = 5051190D2AE03F68003027D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */; + productName = FirebaseCrashlytics; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 50A8910F2A792A15007C48FC /* Project object */; +} diff --git a/NetBird.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/NetBird.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/NetBird.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/NetBird.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/NetBird.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,5 @@ + + + + + diff --git a/NetBird.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..1eaa9ab --- /dev/null +++ b/NetBird.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,122 @@ +{ + "pins" : [ + { + "identity" : "abseil-cpp-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/abseil-cpp-binary.git", + "state" : { + "revision" : "bfc0b6f81adc06ce5121eb23f628473638d67c5c", + "version" : "1.2022062300.0" + } + }, + { + "identity" : "firebase-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/firebase-ios-sdk", + "state" : { + "revision" : "837d4af6ead57cec1fc38007892500d3139c7556", + "version" : "10.16.0" + } + }, + { + "identity" : "googleappmeasurement", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleAppMeasurement.git", + "state" : { + "revision" : "56f681586ff006a7982b53dc94082eea31971acf", + "version" : "10.16.0" + } + }, + { + "identity" : "googledatatransport", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleDataTransport.git", + "state" : { + "revision" : "aae45a320fd0d11811820335b1eabc8753902a40", + "version" : "9.2.5" + } + }, + { + "identity" : "googleutilities", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/GoogleUtilities.git", + "state" : { + "revision" : "c38ce365d77b04a9a300c31061c5227589e5597b", + "version" : "7.11.5" + } + }, + { + "identity" : "grpc-binary", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/grpc-binary.git", + "state" : { + "revision" : "a673bc2937fbe886dd1f99c401b01b6d977a9c98", + "version" : "1.49.1" + } + }, + { + "identity" : "gtm-session-fetcher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/gtm-session-fetcher.git", + "state" : { + "revision" : "d415594121c9e8a4f9d79cecee0965cf35e74dbd", + "version" : "3.1.1" + } + }, + { + "identity" : "interop-ios-for-google-sdks", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/interop-ios-for-google-sdks.git", + "state" : { + "revision" : "2d12673670417654f08f5f90fdd62926dc3a2648", + "version" : "100.0.0" + } + }, + { + "identity" : "leveldb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/leveldb.git", + "state" : { + "revision" : "0706abcc6b0bd9cedfbb015ba840e4a780b5159b", + "version" : "1.22.2" + } + }, + { + "identity" : "lottie-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/airbnb/lottie-ios", + "state" : { + "revision" : "45517c3cfec9469bbdd4f86e32393c28ae9df0bc", + "version" : "4.3.3" + } + }, + { + "identity" : "nanopb", + "kind" : "remoteSourceControl", + "location" : "https://github.com/firebase/nanopb.git", + "state" : { + "revision" : "819d0a2173aff699fb8c364b6fb906f7cdb1a692", + "version" : "2.30909.0" + } + }, + { + "identity" : "promises", + "kind" : "remoteSourceControl", + "location" : "https://github.com/google/promises.git", + "state" : { + "revision" : "e70e889c0196c76d22759eb50d6a0270ca9f1d9e", + "version" : "2.3.1" + } + }, + { + "identity" : "swift-protobuf", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-protobuf.git", + "state" : { + "revision" : "3c54ab05249f59f2c6641dd2920b8358ea9ed127", + "version" : "1.24.0" + } + } + ], + "version" : 2 +} diff --git a/NetBird.xcodeproj/xcshareddata/xcschemes/NetBird.xcscheme b/NetBird.xcodeproj/xcshareddata/xcschemes/NetBird.xcscheme new file mode 100644 index 0000000..54896d3 --- /dev/null +++ b/NetBird.xcodeproj/xcshareddata/xcschemes/NetBird.xcscheme @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NetBird.xcodeproj/xcshareddata/xcschemes/NetbirdNetworkExtension.xcscheme b/NetBird.xcodeproj/xcshareddata/xcschemes/NetbirdNetworkExtension.xcscheme new file mode 100644 index 0000000..50f3e46 --- /dev/null +++ b/NetBird.xcodeproj/xcshareddata/xcschemes/NetbirdNetworkExtension.xcscheme @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NetBird/Assets.xcassets/AccentColor.colorset/Contents.json b/NetBird/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..5135698 --- /dev/null +++ b/NetBird/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x30", + "green" : "0x83", + "red" : "0xF6" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/AppIcon.appiconset/Contents.json b/NetBird/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..629c6d8 --- /dev/null +++ b/NetBird/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "appstore-white.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/AppIcon.appiconset/appstore-white.png b/NetBird/Assets.xcassets/AppIcon.appiconset/appstore-white.png new file mode 100644 index 0000000..a84e083 Binary files /dev/null and b/NetBird/Assets.xcassets/AppIcon.appiconset/appstore-white.png differ diff --git a/NetBird/Assets.xcassets/Colors/BgMenu.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgMenu.colorset/Contents.json new file mode 100644 index 0000000..e901db6 --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/BgMenu.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xEB", + "green" : "0xEB", + "red" : "0xEB" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1F", + "green" : "0x1C", + "red" : "0x1A" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/BgNavigationBar.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgNavigationBar.colorset/Contents.json new file mode 100644 index 0000000..9ea17fd --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/BgNavigationBar.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFE" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x21", + "green" : "0x1E", + "red" : "0x1C" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/BgPage.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgPage.colorset/Contents.json new file mode 100644 index 0000000..8d8394f --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/BgPage.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.140", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1D", + "green" : "0x1A", + "red" : "0x18" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/BgPrimary.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgPrimary.colorset/Contents.json new file mode 100644 index 0000000..2e2d0b9 --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/BgPrimary.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.050", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1D", + "green" : "0x1A", + "red" : "0x18" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/BgSecondary.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgSecondary.colorset/Contents.json new file mode 100644 index 0000000..c0fe7dc --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/BgSecondary.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.140", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x21", + "green" : "0x1E", + "red" : "0x1C" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/BgSideDrawer.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/BgSideDrawer.colorset/Contents.json new file mode 100644 index 0000000..0b43a67 --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/BgSideDrawer.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFE" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1F", + "green" : "0x1C", + "red" : "0x1A" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/Contents.json b/NetBird/Assets.xcassets/Colors/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/HandleBar.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/HandleBar.colorset/Contents.json new file mode 100644 index 0000000..a1dfc75 --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/HandleBar.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.080", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "0.250", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/PeerCard/BgPeerCard.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/PeerCard/BgPeerCard.colorset/Contents.json new file mode 100644 index 0000000..a71bccd --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/PeerCard/BgPeerCard.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xE0", + "green" : "0xE0", + "red" : "0xE0" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x1D", + "green" : "0x1A", + "red" : "0x18" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/PeerCard/Contents.json b/NetBird/Assets.xcassets/Colors/PeerCard/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/PeerCard/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/PeerCard/TextPeerCard.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/PeerCard/TextPeerCard.colorset/Contents.json new file mode 100644 index 0000000..e7016ef --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/PeerCard/TextPeerCard.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x4D", + "green" : "0x4D", + "red" : "0x4D" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x8F", + "green" : "0x85", + "red" : "0x7E" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/TextAlert.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/TextAlert.colorset/Contents.json new file mode 100644 index 0000000..3fe9b59 --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/TextAlert.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x00", + "green" : "0x00", + "red" : "0x00" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFE" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/TextField/BgTextField.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/TextField/BgTextField.colorset/Contents.json new file mode 100644 index 0000000..158931e --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/TextField/BgTextField.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFE" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x3D", + "green" : "0x36", + "red" : "0x32" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/TextField/BorderTextField.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/TextField/BorderTextField.colorset/Contents.json new file mode 100644 index 0000000..9a2cc8c --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/TextField/BorderTextField.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFE" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x61", + "green" : "0x59", + "red" : "0x54" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/TextField/Contents.json b/NetBird/Assets.xcassets/Colors/TextField/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/TextField/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/TextPrimary.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/TextPrimary.colorset/Contents.json new file mode 100644 index 0000000..048410b --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/TextPrimary.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x4D", + "green" : "0x4D", + "red" : "0x4D" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xFF", + "green" : "0xFF", + "red" : "0xFE" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Colors/TextSecondary.colorset/Contents.json b/NetBird/Assets.xcassets/Colors/TextSecondary.colorset/Contents.json new file mode 100644 index 0000000..eeceb68 --- /dev/null +++ b/NetBird/Assets.xcassets/Colors/TextSecondary.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x86", + "green" : "0x86", + "red" : "0x86" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x8F", + "green" : "0x85", + "red" : "0x7E" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/Contents.json b/NetBird/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/NetBird/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/backgroundIntersection.imageset/Contents.json b/NetBird/Assets.xcassets/backgroundIntersection.imageset/Contents.json new file mode 100644 index 0000000..e3a73ac --- /dev/null +++ b/NetBird/Assets.xcassets/backgroundIntersection.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "backgroundIntersection.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/backgroundIntersection.imageset/backgroundIntersection.png b/NetBird/Assets.xcassets/backgroundIntersection.imageset/backgroundIntersection.png new file mode 100644 index 0000000..64c98a7 Binary files /dev/null and b/NetBird/Assets.xcassets/backgroundIntersection.imageset/backgroundIntersection.png differ diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/Contents.json b/NetBird/Assets.xcassets/bg-bottom.imageset/Contents.json new file mode 100644 index 0000000..ead3d7f --- /dev/null +++ b/NetBird/Assets.xcassets/bg-bottom.imageset/Contents.json @@ -0,0 +1,56 @@ +{ + "images" : [ + { + "filename" : "bg-bottom 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "bg-bottom.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "bg-bottom@2x 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "bg-bottom@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "bg-bottom@3x 1.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "bg-bottom@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom 1.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom 1.png new file mode 100644 index 0000000..d65a7fd Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom 1.png differ diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom.png new file mode 100644 index 0000000..feae444 Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom.png differ diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x 1.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x 1.png new file mode 100644 index 0000000..552cf7c Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x 1.png differ diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x.png new file mode 100644 index 0000000..84e36a1 Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@2x.png differ diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x 1.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x 1.png new file mode 100644 index 0000000..c3cd6b5 Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x 1.png differ diff --git a/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x.png b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x.png new file mode 100644 index 0000000..c5a3024 Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom.imageset/bg-bottom@3x.png differ diff --git a/NetBird/Assets.xcassets/bg-bottom@4x.imageset/Contents.json b/NetBird/Assets.xcassets/bg-bottom@4x.imageset/Contents.json new file mode 100644 index 0000000..2fb9167 --- /dev/null +++ b/NetBird/Assets.xcassets/bg-bottom@4x.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "bg-bottom@4x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/bg-bottom@4x.imageset/bg-bottom@4x.png b/NetBird/Assets.xcassets/bg-bottom@4x.imageset/bg-bottom@4x.png new file mode 100644 index 0000000..2c8710c Binary files /dev/null and b/NetBird/Assets.xcassets/bg-bottom@4x.imageset/bg-bottom@4x.png differ diff --git a/NetBird/Assets.xcassets/check-circle.imageset/Contents.json b/NetBird/Assets.xcassets/check-circle.imageset/Contents.json new file mode 100644 index 0000000..7fc2f37 --- /dev/null +++ b/NetBird/Assets.xcassets/check-circle.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "check-circle.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "check-circle@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "check-circle@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/check-circle.imageset/check-circle.png b/NetBird/Assets.xcassets/check-circle.imageset/check-circle.png new file mode 100644 index 0000000..8726230 Binary files /dev/null and b/NetBird/Assets.xcassets/check-circle.imageset/check-circle.png differ diff --git a/NetBird/Assets.xcassets/check-circle.imageset/check-circle@2x.png b/NetBird/Assets.xcassets/check-circle.imageset/check-circle@2x.png new file mode 100644 index 0000000..d938c46 Binary files /dev/null and b/NetBird/Assets.xcassets/check-circle.imageset/check-circle@2x.png differ diff --git a/NetBird/Assets.xcassets/check-circle.imageset/check-circle@3x.png b/NetBird/Assets.xcassets/check-circle.imageset/check-circle@3x.png new file mode 100644 index 0000000..e2356b8 Binary files /dev/null and b/NetBird/Assets.xcassets/check-circle.imageset/check-circle@3x.png differ diff --git a/NetBird/Assets.xcassets/chevron.left.imageset/Contents.json b/NetBird/Assets.xcassets/chevron.left.imageset/Contents.json new file mode 100644 index 0000000..567a1f7 --- /dev/null +++ b/NetBird/Assets.xcassets/chevron.left.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "chevron.left.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "chevron.left@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "chevron.left@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left.png b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left.png new file mode 100644 index 0000000..551fc15 Binary files /dev/null and b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left.png differ diff --git a/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@2x.png b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@2x.png new file mode 100644 index 0000000..feeef95 Binary files /dev/null and b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@2x.png differ diff --git a/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@3x.png b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@3x.png new file mode 100644 index 0000000..6fe9d06 Binary files /dev/null and b/NetBird/Assets.xcassets/chevron.left.imageset/chevron.left@3x.png differ diff --git a/NetBird/Assets.xcassets/chevron.left@4x.imageset/Contents.json b/NetBird/Assets.xcassets/chevron.left@4x.imageset/Contents.json new file mode 100644 index 0000000..1058f45 --- /dev/null +++ b/NetBird/Assets.xcassets/chevron.left@4x.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "chevron.left@4x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/chevron.left@4x.imageset/chevron.left@4x.png b/NetBird/Assets.xcassets/chevron.left@4x.imageset/chevron.left@4x.png new file mode 100644 index 0000000..cf2940e Binary files /dev/null and b/NetBird/Assets.xcassets/chevron.left@4x.imageset/chevron.left@4x.png differ diff --git a/NetBird/Assets.xcassets/close-slider-4x.imageset/Contents.json b/NetBird/Assets.xcassets/close-slider-4x.imageset/Contents.json new file mode 100644 index 0000000..2d21ab4 --- /dev/null +++ b/NetBird/Assets.xcassets/close-slider-4x.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "close-slider-4x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/close-slider-4x.imageset/close-slider-4x.png b/NetBird/Assets.xcassets/close-slider-4x.imageset/close-slider-4x.png new file mode 100644 index 0000000..0da363d Binary files /dev/null and b/NetBird/Assets.xcassets/close-slider-4x.imageset/close-slider-4x.png differ diff --git a/NetBird/Assets.xcassets/close-slider.imageset/Contents.json b/NetBird/Assets.xcassets/close-slider.imageset/Contents.json new file mode 100644 index 0000000..a056e9f --- /dev/null +++ b/NetBird/Assets.xcassets/close-slider.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "close-slider.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "close-slider@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "close-slider@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/close-slider.imageset/close-slider.png b/NetBird/Assets.xcassets/close-slider.imageset/close-slider.png new file mode 100644 index 0000000..d914780 Binary files /dev/null and b/NetBird/Assets.xcassets/close-slider.imageset/close-slider.png differ diff --git a/NetBird/Assets.xcassets/close-slider.imageset/close-slider@2x.png b/NetBird/Assets.xcassets/close-slider.imageset/close-slider@2x.png new file mode 100644 index 0000000..e4b79e0 Binary files /dev/null and b/NetBird/Assets.xcassets/close-slider.imageset/close-slider@2x.png differ diff --git a/NetBird/Assets.xcassets/close-slider.imageset/close-slider@3x.png b/NetBird/Assets.xcassets/close-slider.imageset/close-slider@3x.png new file mode 100644 index 0000000..dc7ebcf Binary files /dev/null and b/NetBird/Assets.xcassets/close-slider.imageset/close-slider@3x.png differ diff --git a/NetBird/Assets.xcassets/close-slider@4x.imageset/Contents.json b/NetBird/Assets.xcassets/close-slider@4x.imageset/Contents.json new file mode 100644 index 0000000..305aaf1 --- /dev/null +++ b/NetBird/Assets.xcassets/close-slider@4x.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "close-slider@4x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/close-slider@4x.imageset/close-slider@4x.png b/NetBird/Assets.xcassets/close-slider@4x.imageset/close-slider@4x.png new file mode 100644 index 0000000..d0bfab5 Binary files /dev/null and b/NetBird/Assets.xcassets/close-slider@4x.imageset/close-slider@4x.png differ diff --git a/NetBird/Assets.xcassets/exclamation-circle.imageset/Contents.json b/NetBird/Assets.xcassets/exclamation-circle.imageset/Contents.json new file mode 100644 index 0000000..7ab160b --- /dev/null +++ b/NetBird/Assets.xcassets/exclamation-circle.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "exclamation-circle.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "exclamation-circle@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "exclamation-circle@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle.png b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle.png new file mode 100644 index 0000000..9d58fed Binary files /dev/null and b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle.png differ diff --git a/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@2x.png b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@2x.png new file mode 100644 index 0000000..74eb5c8 Binary files /dev/null and b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@2x.png differ diff --git a/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@3x.png b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@3x.png new file mode 100644 index 0000000..baad418 Binary files /dev/null and b/NetBird/Assets.xcassets/exclamation-circle.imageset/exclamation-circle@3x.png differ diff --git a/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/Contents.json b/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/Contents.json new file mode 100644 index 0000000..cc84866 --- /dev/null +++ b/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "exclamation-circle@4x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/exclamation-circle@4x.png b/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/exclamation-circle@4x.png new file mode 100644 index 0000000..ed6b0a9 Binary files /dev/null and b/NetBird/Assets.xcassets/exclamation-circle@4x.imageset/exclamation-circle@4x.png differ diff --git a/NetBird/Assets.xcassets/exclamation-circleY.imageset/Contents.json b/NetBird/Assets.xcassets/exclamation-circleY.imageset/Contents.json new file mode 100644 index 0000000..1349f3d --- /dev/null +++ b/NetBird/Assets.xcassets/exclamation-circleY.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "exclamation-circleY.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/exclamation-circleY.imageset/exclamation-circleY.png b/NetBird/Assets.xcassets/exclamation-circleY.imageset/exclamation-circleY.png new file mode 100644 index 0000000..d0bd0e5 Binary files /dev/null and b/NetBird/Assets.xcassets/exclamation-circleY.imageset/exclamation-circleY.png differ diff --git a/NetBird/Assets.xcassets/hamburgerMenu.imageset/Contents.json b/NetBird/Assets.xcassets/hamburgerMenu.imageset/Contents.json new file mode 100644 index 0000000..d6258f9 --- /dev/null +++ b/NetBird/Assets.xcassets/hamburgerMenu.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "hamburgerMenu.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "hamburgerMenu@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "hamburgerMenu@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu.png b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu.png new file mode 100644 index 0000000..7030fe5 Binary files /dev/null and b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu.png differ diff --git a/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@2x.png b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@2x.png new file mode 100644 index 0000000..0719b66 Binary files /dev/null and b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@2x.png differ diff --git a/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@3x.png b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@3x.png new file mode 100644 index 0000000..4f03a9e Binary files /dev/null and b/NetBird/Assets.xcassets/hamburgerMenu.imageset/hamburgerMenu@3x.png differ diff --git a/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/Contents.json b/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/Contents.json new file mode 100644 index 0000000..7a4c234 --- /dev/null +++ b/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "hamburgerMenu@4x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/hamburgerMenu@4x.png b/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/hamburgerMenu@4x.png new file mode 100644 index 0000000..2843518 Binary files /dev/null and b/NetBird/Assets.xcassets/hamburgerMenu@4x.imageset/hamburgerMenu@4x.png differ diff --git a/NetBird/Assets.xcassets/icon-empty-box.imageset/Contents.json b/NetBird/Assets.xcassets/icon-empty-box.imageset/Contents.json new file mode 100644 index 0000000..4589796 --- /dev/null +++ b/NetBird/Assets.xcassets/icon-empty-box.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "icon-empty-box.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/icon-empty-box.imageset/icon-empty-box.png b/NetBird/Assets.xcassets/icon-empty-box.imageset/icon-empty-box.png new file mode 100644 index 0000000..f51c1d2 Binary files /dev/null and b/NetBird/Assets.xcassets/icon-empty-box.imageset/icon-empty-box.png differ diff --git a/NetBird/Assets.xcassets/icon-filter-4x.imageset/Contents.json b/NetBird/Assets.xcassets/icon-filter-4x.imageset/Contents.json new file mode 100644 index 0000000..9289e26 --- /dev/null +++ b/NetBird/Assets.xcassets/icon-filter-4x.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "icon-filter-4x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/icon-filter-4x.imageset/icon-filter-4x.png b/NetBird/Assets.xcassets/icon-filter-4x.imageset/icon-filter-4x.png new file mode 100644 index 0000000..5f096ba Binary files /dev/null and b/NetBird/Assets.xcassets/icon-filter-4x.imageset/icon-filter-4x.png differ diff --git a/NetBird/Assets.xcassets/icon-filter.imageset/Contents.json b/NetBird/Assets.xcassets/icon-filter.imageset/Contents.json new file mode 100644 index 0000000..9ad85d2 --- /dev/null +++ b/NetBird/Assets.xcassets/icon-filter.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "icon-filter.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon-filter@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "icon-filter@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter.png b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter.png new file mode 100644 index 0000000..b3edb2b Binary files /dev/null and b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter.png differ diff --git a/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@2x.png b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@2x.png new file mode 100644 index 0000000..bc70615 Binary files /dev/null and b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@2x.png differ diff --git a/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@3x.png b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@3x.png new file mode 100644 index 0000000..e7ab495 Binary files /dev/null and b/NetBird/Assets.xcassets/icon-filter.imageset/icon-filter@3x.png differ diff --git a/NetBird/Assets.xcassets/icon-netbird-button.imageset/Contents.json b/NetBird/Assets.xcassets/icon-netbird-button.imageset/Contents.json new file mode 100644 index 0000000..f6774f0 --- /dev/null +++ b/NetBird/Assets.xcassets/icon-netbird-button.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "icon-netbird-button.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "icon-netbird-button@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "icon-netbird-button@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button.png b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button.png new file mode 100644 index 0000000..884e378 Binary files /dev/null and b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button.png differ diff --git a/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@2x.png b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@2x.png new file mode 100644 index 0000000..4bb45e0 Binary files /dev/null and b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@2x.png differ diff --git a/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@3x.png b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@3x.png new file mode 100644 index 0000000..021aed1 Binary files /dev/null and b/NetBird/Assets.xcassets/icon-netbird-button.imageset/icon-netbird-button@3x.png differ diff --git a/NetBird/Assets.xcassets/line.imageset/Contents.json b/NetBird/Assets.xcassets/line.imageset/Contents.json new file mode 100644 index 0000000..25625b1 --- /dev/null +++ b/NetBird/Assets.xcassets/line.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "line.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/line.imageset/line.png b/NetBird/Assets.xcassets/line.imageset/line.png new file mode 100644 index 0000000..22729dc Binary files /dev/null and b/NetBird/Assets.xcassets/line.imageset/line.png differ diff --git a/NetBird/Assets.xcassets/logo-onboarding.imageset/Contents.json b/NetBird/Assets.xcassets/logo-onboarding.imageset/Contents.json new file mode 100644 index 0000000..4bf1b80 --- /dev/null +++ b/NetBird/Assets.xcassets/logo-onboarding.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "logo-onboarding.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "logo-onboarding@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "logo-onboarding@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding.png b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding.png new file mode 100644 index 0000000..1985eb4 Binary files /dev/null and b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding.png differ diff --git a/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@2x.png b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@2x.png new file mode 100644 index 0000000..1dfc0ee Binary files /dev/null and b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@2x.png differ diff --git a/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@3x.png b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@3x.png new file mode 100644 index 0000000..7229ef4 Binary files /dev/null and b/NetBird/Assets.xcassets/logo-onboarding.imageset/logo-onboarding@3x.png differ diff --git a/NetBird/Assets.xcassets/menu-about.imageset/Contents.json b/NetBird/Assets.xcassets/menu-about.imageset/Contents.json new file mode 100644 index 0000000..fdb7a7e --- /dev/null +++ b/NetBird/Assets.xcassets/menu-about.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "menu-about.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "menu-about@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "menu-about@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/menu-about.imageset/menu-about.png b/NetBird/Assets.xcassets/menu-about.imageset/menu-about.png new file mode 100644 index 0000000..6832818 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-about.imageset/menu-about.png differ diff --git a/NetBird/Assets.xcassets/menu-about.imageset/menu-about@2x.png b/NetBird/Assets.xcassets/menu-about.imageset/menu-about@2x.png new file mode 100644 index 0000000..f7ed86c Binary files /dev/null and b/NetBird/Assets.xcassets/menu-about.imageset/menu-about@2x.png differ diff --git a/NetBird/Assets.xcassets/menu-about.imageset/menu-about@3x.png b/NetBird/Assets.xcassets/menu-about.imageset/menu-about@3x.png new file mode 100644 index 0000000..dd8f117 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-about.imageset/menu-about@3x.png differ diff --git a/NetBird/Assets.xcassets/menu-about4x.imageset/Contents.json b/NetBird/Assets.xcassets/menu-about4x.imageset/Contents.json new file mode 100644 index 0000000..38728a7 --- /dev/null +++ b/NetBird/Assets.xcassets/menu-about4x.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "menu-about4x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/menu-about4x.imageset/menu-about4x.png b/NetBird/Assets.xcassets/menu-about4x.imageset/menu-about4x.png new file mode 100644 index 0000000..dd39e47 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-about4x.imageset/menu-about4x.png differ diff --git a/NetBird/Assets.xcassets/menu-advance.imageset/Contents.json b/NetBird/Assets.xcassets/menu-advance.imageset/Contents.json new file mode 100644 index 0000000..46dcfe9 --- /dev/null +++ b/NetBird/Assets.xcassets/menu-advance.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "menu-advance.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "menu-advance@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "menu-advance@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance.png b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance.png new file mode 100644 index 0000000..678fd20 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance.png differ diff --git a/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@2x.png b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@2x.png new file mode 100644 index 0000000..3d4f279 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@2x.png differ diff --git a/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@3x.png b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@3x.png new file mode 100644 index 0000000..bfbfdcb Binary files /dev/null and b/NetBird/Assets.xcassets/menu-advance.imageset/menu-advance@3x.png differ diff --git a/NetBird/Assets.xcassets/menu-advance4x.imageset/Contents.json b/NetBird/Assets.xcassets/menu-advance4x.imageset/Contents.json new file mode 100644 index 0000000..19c1c05 --- /dev/null +++ b/NetBird/Assets.xcassets/menu-advance4x.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "menu-advance4x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/menu-advance4x.imageset/menu-advance4x.png b/NetBird/Assets.xcassets/menu-advance4x.imageset/menu-advance4x.png new file mode 100644 index 0000000..bb1368c Binary files /dev/null and b/NetBird/Assets.xcassets/menu-advance4x.imageset/menu-advance4x.png differ diff --git a/NetBird/Assets.xcassets/menu-change.imageset/Contents.json b/NetBird/Assets.xcassets/menu-change.imageset/Contents.json new file mode 100644 index 0000000..1c3abf1 --- /dev/null +++ b/NetBird/Assets.xcassets/menu-change.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "menu-change.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "menu-change@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "menu-change@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/menu-change.imageset/menu-change.png b/NetBird/Assets.xcassets/menu-change.imageset/menu-change.png new file mode 100644 index 0000000..e0ae5d8 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-change.imageset/menu-change.png differ diff --git a/NetBird/Assets.xcassets/menu-change.imageset/menu-change@2x.png b/NetBird/Assets.xcassets/menu-change.imageset/menu-change@2x.png new file mode 100644 index 0000000..4c9bcbb Binary files /dev/null and b/NetBird/Assets.xcassets/menu-change.imageset/menu-change@2x.png differ diff --git a/NetBird/Assets.xcassets/menu-change.imageset/menu-change@3x.png b/NetBird/Assets.xcassets/menu-change.imageset/menu-change@3x.png new file mode 100644 index 0000000..cf2c1f0 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-change.imageset/menu-change@3x.png differ diff --git a/NetBird/Assets.xcassets/menu-change4x.imageset/Contents.json b/NetBird/Assets.xcassets/menu-change4x.imageset/Contents.json new file mode 100644 index 0000000..ead1ed8 --- /dev/null +++ b/NetBird/Assets.xcassets/menu-change4x.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "menu-change4x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/menu-change4x.imageset/menu-change4x.png b/NetBird/Assets.xcassets/menu-change4x.imageset/menu-change4x.png new file mode 100644 index 0000000..dc66af7 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-change4x.imageset/menu-change4x.png differ diff --git a/NetBird/Assets.xcassets/menu-faq.imageset/Contents.json b/NetBird/Assets.xcassets/menu-faq.imageset/Contents.json new file mode 100644 index 0000000..37f10c0 --- /dev/null +++ b/NetBird/Assets.xcassets/menu-faq.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "menu-faq.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "menu-faq@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "menu-faq@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq.png b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq.png new file mode 100644 index 0000000..19ebddb Binary files /dev/null and b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq.png differ diff --git a/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@2x.png b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@2x.png new file mode 100644 index 0000000..f44474a Binary files /dev/null and b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@2x.png differ diff --git a/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@3x.png b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@3x.png new file mode 100644 index 0000000..5c8cbe4 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-faq.imageset/menu-faq@3x.png differ diff --git a/NetBird/Assets.xcassets/menu-faq4x.imageset/Contents.json b/NetBird/Assets.xcassets/menu-faq4x.imageset/Contents.json new file mode 100644 index 0000000..bf15d8a --- /dev/null +++ b/NetBird/Assets.xcassets/menu-faq4x.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "menu-faq4x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/menu-faq4x.imageset/menu-faq4x.png b/NetBird/Assets.xcassets/menu-faq4x.imageset/menu-faq4x.png new file mode 100644 index 0000000..c66dc97 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-faq4x.imageset/menu-faq4x.png differ diff --git a/NetBird/Assets.xcassets/menu-reset.imageset/Contents.json b/NetBird/Assets.xcassets/menu-reset.imageset/Contents.json new file mode 100644 index 0000000..26bd21c --- /dev/null +++ b/NetBird/Assets.xcassets/menu-reset.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "menu-reset.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "menu-reset@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "menu-reset@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset.png b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset.png new file mode 100644 index 0000000..7d5c925 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset.png differ diff --git a/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@2x.png b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@2x.png new file mode 100644 index 0000000..cbc1369 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@2x.png differ diff --git a/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@3x.png b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@3x.png new file mode 100644 index 0000000..2d97f65 Binary files /dev/null and b/NetBird/Assets.xcassets/menu-reset.imageset/menu-reset@3x.png differ diff --git a/NetBird/Assets.xcassets/menu-reset4x.imageset/Contents.json b/NetBird/Assets.xcassets/menu-reset4x.imageset/Contents.json new file mode 100644 index 0000000..0a71da6 --- /dev/null +++ b/NetBird/Assets.xcassets/menu-reset4x.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "menu-reset4x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/menu-reset4x.imageset/menu-reset4x.png b/NetBird/Assets.xcassets/menu-reset4x.imageset/menu-reset4x.png new file mode 100644 index 0000000..7a34e2d Binary files /dev/null and b/NetBird/Assets.xcassets/menu-reset4x.imageset/menu-reset4x.png differ diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/Contents.json b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/Contents.json new file mode 100644 index 0000000..31fff9e --- /dev/null +++ b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/Contents.json @@ -0,0 +1,56 @@ +{ + "images" : [ + { + "filename" : "netbird-logo-menu.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "netbird-logo-menu 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "netbird-logo-menu@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "netbird-logo-menu@2x 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "netbird-logo-menu@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "netbird-logo-menu@3x 1.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu 1.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu 1.png new file mode 100644 index 0000000..3119611 Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu 1.png differ diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu.png new file mode 100644 index 0000000..63eed5a Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu.png differ diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x 1.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x 1.png new file mode 100644 index 0000000..020daa6 Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x 1.png differ diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x.png new file mode 100644 index 0000000..8035730 Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@2x.png differ diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x 1.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x 1.png new file mode 100644 index 0000000..f98e90e Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x 1.png differ diff --git a/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x.png b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x.png new file mode 100644 index 0000000..7e139f3 Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu.imageset/netbird-logo-menu@3x.png differ diff --git a/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/Contents.json b/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/Contents.json new file mode 100644 index 0000000..3deacfb --- /dev/null +++ b/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "netbird-logo-menu@4x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/netbird-logo-menu@4x.png b/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/netbird-logo-menu@4x.png new file mode 100644 index 0000000..3b27ea9 Binary files /dev/null and b/NetBird/Assets.xcassets/netbird-logo-menu@4x.imageset/netbird-logo-menu@4x.png differ diff --git a/NetBird/Assets.xcassets/onboarding.imageset/Contents.json b/NetBird/Assets.xcassets/onboarding.imageset/Contents.json new file mode 100644 index 0000000..e67e783 --- /dev/null +++ b/NetBird/Assets.xcassets/onboarding.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "onboarding.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/onboarding.imageset/onboarding.png b/NetBird/Assets.xcassets/onboarding.imageset/onboarding.png new file mode 100644 index 0000000..ae4ed2b Binary files /dev/null and b/NetBird/Assets.xcassets/onboarding.imageset/onboarding.png differ diff --git a/NetBird/Assets.xcassets/search-4x.imageset/Contents.json b/NetBird/Assets.xcassets/search-4x.imageset/Contents.json new file mode 100644 index 0000000..63817b8 --- /dev/null +++ b/NetBird/Assets.xcassets/search-4x.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "search-4x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/search-4x.imageset/search-4x.png b/NetBird/Assets.xcassets/search-4x.imageset/search-4x.png new file mode 100644 index 0000000..5f51bed Binary files /dev/null and b/NetBird/Assets.xcassets/search-4x.imageset/search-4x.png differ diff --git a/NetBird/Assets.xcassets/search.imageset/Contents.json b/NetBird/Assets.xcassets/search.imageset/Contents.json new file mode 100644 index 0000000..794d658 --- /dev/null +++ b/NetBird/Assets.xcassets/search.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "filename" : "search-1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "search-2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Assets.xcassets/search.imageset/search-1x.png b/NetBird/Assets.xcassets/search.imageset/search-1x.png new file mode 100644 index 0000000..b13b071 Binary files /dev/null and b/NetBird/Assets.xcassets/search.imageset/search-1x.png differ diff --git a/NetBird/Assets.xcassets/search.imageset/search-2x.png b/NetBird/Assets.xcassets/search.imageset/search-2x.png new file mode 100644 index 0000000..ffbc0a1 Binary files /dev/null and b/NetBird/Assets.xcassets/search.imageset/search-2x.png differ diff --git a/NetBird/Assets/Preview Content/Preview Assets.xcassets/Contents.json b/NetBird/Assets/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/NetBird/Assets/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NetBird/Info.plist b/NetBird/Info.plist new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/NetBird/Info.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/NetBird/NetBird.entitlements b/NetBird/NetBird.entitlements new file mode 100644 index 0000000..476b633 --- /dev/null +++ b/NetBird/NetBird.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.developer.networking.networkextension + + packet-tunnel-provider + + com.apple.security.application-groups + + group.io.netbird.app + + + diff --git a/NetBird/Source/App/NetBirdApp.swift b/NetBird/Source/App/NetBirdApp.swift new file mode 100644 index 0000000..f7a6932 --- /dev/null +++ b/NetBird/Source/App/NetBirdApp.swift @@ -0,0 +1,44 @@ +// +// NetBirdiOSApp.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 01.08.23. +// + +import SwiftUI +import FirebaseCore +import FirebasePerformance + +class AppDelegate: NSObject, UIApplicationDelegate { + func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { + let options = FirebaseOptions(contentsOfFile: Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!) + FirebaseApp.configure(options: options!) + return true + } +} + + +@main +struct NetBirdApp: App { + @StateObject var viewModel = ViewModel() + @Environment(\.scenePhase) var scenePhase + + @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate + + var body: some Scene { + WindowGroup { + MainView() + .environmentObject(viewModel) + .onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) {_ in + print("App is active!") + viewModel.checkExtensionState() + viewModel.startPollingDetails() + } + .onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) {_ in + print("App is inactive!") + viewModel.stopPollingDetails() + } + } + } +} diff --git a/NetBird/Source/App/ViewModels/MainViewModel.swift b/NetBird/Source/App/ViewModels/MainViewModel.swift new file mode 100644 index 0000000..1f2c563 --- /dev/null +++ b/NetBird/Source/App/ViewModels/MainViewModel.swift @@ -0,0 +1,239 @@ +// +// MainViewModel.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 01.08.23. +// + +import UIKit +import NetworkExtension +import os +import Combine + +@MainActor +class ViewModel: ObservableObject { + @Published var networkExtensionAdapter = NetworkExtensionAdapter() + @Published var showSetupKeyPopup = false + @Published var showChangeServerAlert = false + @Published var showInvalidServerAlert = false + @Published var showInvalidSetupKeyHint = false + @Published var showInvalidSetupKeyAlert = false + @Published var showInvalidPresharedKeyAlert = false + @Published var showServerChangedInfo = false + @Published var showPreSharedKeyChangedInfo = false + @Published var showCopiedAlert = false + @Published var showCopiedInfoAlert = false + @Published var showAuthenticationRequired = false + @Published var presentSideDrawer = false + @Published var extensionState : NEVPNStatus = .disconnected + @Published var navigateToServerView = false + @Published var managementURL = "" + @Published var presharedKey = "" + @Published var server: String = "" + @Published var setupKey: String = "" + @Published var presharedKeySecure = true + @Published var statusDetails = StatusDetails(ip: "", fqdn: "", managementStatus: .disconnected, peerInfo: []) + @Published var statusDetailsValid = false + @Published var extensionStateText = "Disconnected" + @Published var connectPressed = false + @Published var disconnectPressed = false + var preferences = Preferences.newPreferences() + var buttonLock = false + let defaults = UserDefaults.standard + @Published var fqdn = UserDefaults.standard.string(forKey: "fqdn") ?? "" + @Published var ip = UserDefaults.standard.string(forKey: "ip") ?? "" + + private var cancellables = Set() + + init() { + $server + .removeDuplicates() + .debounce(for: .seconds(0.5), scheduler: RunLoop.main) + .map { server in + !self.isValidURL(server) + } + .assign(to: &$showInvalidServerAlert) + + $setupKey + .removeDuplicates() + .debounce(for: .seconds(0.5), scheduler: RunLoop.main) + .map { setupKey in + !self.isValidSetupKey(setupKey) + } + .assign(to: &$showInvalidSetupKeyHint) + } + + func connect() { + self.connectPressed = true + print("Connected pressed set to true") + DispatchQueue.main.async { + print("starting extension") + self.buttonLock = true + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + self.buttonLock = false + } + Task { + await self.networkExtensionAdapter.start() + print("Connected pressed set to false") + } + } + } + + func close() -> Void { + self.disconnectPressed = true + DispatchQueue.main.async { + print("Stopping extension") + self.buttonLock = true + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + self.buttonLock = false + } + self.networkExtensionAdapter.stop() + } + } + + func startPollingDetails() { + networkExtensionAdapter.startTimer { details in + let sortedPeerInfo = details.peerInfo.sorted(by: { a, b in + a.ip < b.ip + }) + + self.checkExtensionState() + if self.extensionState == .disconnected && self.extensionStateText == "Connected" { + self.showAuthenticationRequired = true + self.extensionStateText = "Disconnected" + } + + let newStatusDetails = StatusDetails(ip: details.ip, fqdn: details.fqdn, managementStatus: details.managementStatus, peerInfo: sortedPeerInfo) + if newStatusDetails.ip != self.statusDetails.ip || newStatusDetails.fqdn != self.statusDetails.fqdn || newStatusDetails.managementStatus != self.statusDetails.managementStatus || !newStatusDetails.peerInfo.elementsEqual(self.statusDetails.peerInfo, by: { a, b in + a.ip == b.ip && a.connStatus == b.connStatus + }) { + if !newStatusDetails.fqdn.isEmpty && newStatusDetails.fqdn != self.statusDetails.fqdn { + self.defaults.set(newStatusDetails.fqdn, forKey: "fqdn") + self.fqdn = details.fqdn + + } + if !newStatusDetails.ip.isEmpty && newStatusDetails.ip != self.statusDetails.ip { + self.defaults.set(newStatusDetails.ip, forKey: "ip") + self.ip = details.ip + } + + print("Status: \(newStatusDetails.managementStatus) - Extension: \(self.extensionState) - LoginRequired: \(self.networkExtensionAdapter.isLoginRequired())") + if newStatusDetails.managementStatus == .disconnected && self.extensionState == .connected && self.networkExtensionAdapter.isLoginRequired() { + self.networkExtensionAdapter.stop() + self.showAuthenticationRequired = true + } + self.statusDetails = newStatusDetails + } + self.statusDetailsValid = true + } + } + + func stopPollingDetails() { + networkExtensionAdapter.stopTimer() + } + + func checkExtensionState() { + networkExtensionAdapter.getExtensionStatus { status in + let statuses : [NEVPNStatus] = [.connected, .disconnected, .connecting, .disconnecting] + DispatchQueue.main.async { + if statuses.contains(status) && self.extensionState != status { + print("Changing extension status") + self.extensionState = status + } + } + } + } + + func updateManagementURL(url: String) -> Bool? { + let trimmedURL = url.trimmingCharacters(in: .whitespacesAndNewlines) + let newAuth = NetBirdSDKNewAuth(Preferences.configFile(), trimmedURL, nil) + self.managementURL = trimmedURL + var ssoSupported: ObjCBool = false + do { + try newAuth?.saveConfigIfSSOSupported(&ssoSupported) + if ssoSupported.boolValue { + print("SSO is supported") + return true + } else { + print("SSO is not supported. Fallback to setup key") + return false + } + } catch { + print("Failed to check SSO support") + } + return nil + } + + func clearDetails() { + self.ip = "" + self.fqdn = "" + defaults.removeObject(forKey: "ip") + defaults.removeObject(forKey: "fqdn") + } + + func setSetupKey(key: String) throws { + let newAuth = NetBirdSDKNewAuth(Preferences.configFile(), self.managementURL, nil) + try newAuth?.login(withSetupKeyAndSaveConfig: key, deviceName: Device.getName()) + self.managementURL = "" + } + + func updatePreSharedKey() { + preferences.setPreSharedKey(presharedKey) + do { + try preferences.commit() + self.close() + self.presharedKeySecure = true + self.presentSideDrawer = false + self.showPreSharedKeyChangedInfo = true + } catch { + print("Failed to update preshared key") + } + } + + func removePreSharedKey() { + presharedKey = "" + preferences.setPreSharedKey(presharedKey) + do { + try preferences.commit() + self.close() + self.presharedKeySecure = false + } catch { + print("Failed to remove preshared key") + } + } + + func loadPreSharedKey() { + self.presharedKey = preferences.getPreSharedKey(nil) + self.presharedKeySecure = self.presharedKey != "" + } + + func getDefaultStatus() -> StatusDetails { + return StatusDetails(ip: "", fqdn: "", managementStatus: .disconnected, peerInfo: []) + } + + func isValidURL(_ string: String) -> Bool { + let trimmedString = string.trimmingCharacters(in: .whitespacesAndNewlines) + if trimmedString.isEmpty { return true } + + let pattern = "^(?i)https?://(([a-zA-Z\\d]([a-zA-Z\\d-]{0,61}[a-zA-Z\\d])?\\.)*[a-zA-Z]{2,})(?::\\d{1,5})?(?:/|$)" + + let isMatch = trimmedString.range(of: pattern, options: .regularExpression, range: nil, locale: nil) != nil + return isMatch + } + + func isValidSetupKey(_ string: String) -> Bool { + if string.isEmpty { return true } + let pattern = "^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$" + let isMatch = string.range(of: pattern, options: .regularExpression, range: nil, locale: nil) != nil + return isMatch + } +} + +func printLogContents(from logURL: URL) { + do { + let logContents = try String(contentsOf: logURL, encoding: .utf8) + print(logContents) + } catch { + print("Failed to read the log file: \(error.localizedDescription)") + } +} diff --git a/NetBird/Source/App/Views/AboutView.swift b/NetBird/Source/App/Views/AboutView.swift new file mode 100644 index 0000000..4bab2e0 --- /dev/null +++ b/NetBird/Source/App/Views/AboutView.swift @@ -0,0 +1,58 @@ +// +// AboutView.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 01.08.23. +// + +import SwiftUI + +struct AboutView: View { + + @Environment(\.presentationMode) var presentationMode: Binding + + var body: some View { + ZStack { + Color("BgPage") + .edgesIgnoringSafeArea(.bottom) + VStack { + Image("netbird-logo-menu") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: UIScreen.main.bounds.width * 0.4) + .padding(.top, UIScreen.main.bounds.height * 0.05) + .padding(.bottom, UIScreen.main.bounds.height * 0.04) + HStack { + Text("Version") + .font(.system(size: 18, weight: .medium)) + .foregroundColor(Color("TextPrimary")) + Text("\(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "unknown")") + .font(.system(size: 18, weight: .regular)) + .foregroundColor(Color("TextPrimary")) + } + .padding(.bottom, UIScreen.main.bounds.height * 0.04) + Link("License agreement", destination: URL(string: "https://netbird.io/terms")!) + .padding(.bottom, UIScreen.main.bounds.height * 0.04) + .font(.system(size: 18, weight: .medium)) + Link("Privacy policy", destination: URL(string: "https://netbird.io/privacy")!) + .font(.system(size: 18, weight: .medium)) + Spacer() + Text("© 2023 NetBird all rights reserved") + .foregroundColor(Color.white) + .padding(.bottom, UIScreen.main.bounds.height * 0.01) + } + } + .navigationViewStyle(StackNavigationViewStyle()) + .navigationBarTitleDisplayMode(.inline) + .navigationBarBackButtonHidden(true) + .navigationBarItems(leading: CustomBackButton(text: "About", action: { + presentationMode.wrappedValue.dismiss() + })) + } +} + +struct AboutView_Previews: PreviewProvider { + static var previews: some View { + AboutView() + } +} diff --git a/NetBird/Source/App/Views/AdvancedView.swift b/NetBird/Source/App/Views/AdvancedView.swift new file mode 100644 index 0000000..2706369 --- /dev/null +++ b/NetBird/Source/App/Views/AdvancedView.swift @@ -0,0 +1,94 @@ +// +// AdvancedView.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 01.08.23. +// + +import SwiftUI + +struct AdvancedView: View { + @EnvironmentObject var viewModel: ViewModel + @Environment(\.presentationMode) var presentationMode: Binding + + var body: some View { + ZStack { + Color("BgPage") + .edgesIgnoringSafeArea(.bottom) + VStack (alignment: .leading){ + Text("Add a pre-shared key") + .font(.system(size: 18, weight: .bold)) + .foregroundColor(Color("TextPrimary")) + .padding(.top, UIScreen.main.bounds.height * 0.04) + Text("You will only communicate with peers that use the same key.") + .multilineTextAlignment(.leading) + .font(.system(size: 18, weight: .regular)) + .foregroundColor(Color("TextSecondary")) + .padding(.top, 3) + CustomTextField(placeholder: "Add a pre-shared key", text: $viewModel.presharedKey, secure: $viewModel.presharedKeySecure) + .padding(.top, 3) + .onChange(of: viewModel.presharedKey, perform: { value in + checkForValidPresharedKey(text: value) + }) + if viewModel.showInvalidPresharedKeyAlert { + Text("Invalid key").foregroundColor(.red) + } + SolidButton(text: viewModel.presharedKeySecure ? "Remove" : "Save") { + if !viewModel.showInvalidPresharedKeyAlert { + if viewModel.presharedKeySecure { + viewModel.removePreSharedKey() // TODO: might replace this with new implememented removal + } else { + viewModel.updatePreSharedKey() + print("save preshared key") + self.presentationMode.wrappedValue.dismiss() + } + } + } + .padding(.top, 5) + Spacer() + } + .padding([.leading, .trailing], UIScreen.main.bounds.width * 0.10) + } + .onAppear(perform: { + viewModel.loadPreSharedKey() + }) + .navigationViewStyle(StackNavigationViewStyle()) + .navigationBarTitleDisplayMode(.inline) + .navigationBarBackButtonHidden(true) + .navigationBarItems(leading: CustomBackButton(text: "Advanced", action: { + presentationMode.wrappedValue.dismiss() + })) + .onTapGesture { + UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + } + } + + func checkForValidPresharedKey(text: String) { + if isValidBase64EncodedString(text) { + viewModel.showInvalidPresharedKeyAlert = false + } else { + viewModel.showInvalidPresharedKeyAlert = true + } + } + + func isValidBase64EncodedString(_ input: String) -> Bool { + // Allow empty string as valid input + if input.isEmpty { + return true + } + + // Check if the string is valid Base64 + guard let data = Data(base64Encoded: input) else { + return false + } + + // Check if the decoded data is 32 bytes (256 bits) + return data.count == 32 + } +} + +struct AdvancedView_Previews: PreviewProvider { + static var previews: some View { + AdvancedView() + } +} diff --git a/NetBird/Source/App/Views/Components/BottomDrawer.swift b/NetBird/Source/App/Views/Components/BottomDrawer.swift new file mode 100644 index 0000000..c7cc8c7 --- /dev/null +++ b/NetBird/Source/App/Views/Components/BottomDrawer.swift @@ -0,0 +1,20 @@ +// +// BottomDrawer.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 01.08.23. +// + +import SwiftUI + +struct BottomDrawer: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +struct BottomDrawer_Previews: PreviewProvider { + static var previews: some View { + BottomDrawer() + } +} diff --git a/NetBird/Source/App/Views/Components/CustomBackButton.swift b/NetBird/Source/App/Views/Components/CustomBackButton.swift new file mode 100644 index 0000000..5e27c98 --- /dev/null +++ b/NetBird/Source/App/Views/Components/CustomBackButton.swift @@ -0,0 +1,27 @@ +// +// CustomBackButton.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 01.08.23. +// + +import SwiftUI + +struct CustomBackButton: View { + var text : String + var action: () -> Void + + var body: some View { + Button(action: { + action() + }) { + HStack { + Image("chevron.left") + Text(text) + .padding(.leading, 5) + .font(.system(size: 26, weight: .regular)) + .foregroundColor(Color("TextPrimary")) + } + } + } +} diff --git a/NetBird/Source/App/Views/Components/CustomLottieView.swift b/NetBird/Source/App/Views/Components/CustomLottieView.swift new file mode 100644 index 0000000..6400a00 --- /dev/null +++ b/NetBird/Source/App/Views/Components/CustomLottieView.swift @@ -0,0 +1,183 @@ +import Foundation +import SwiftUI +import Lottie +import NetworkExtension + +struct CustomLottieView: UIViewRepresentable { + @Environment(\.colorScheme) var colorScheme + @Binding var extensionStatus: NEVPNStatus + @Binding var engineStatus: ClientState + @Binding var connectPressed: Bool + @Binding var disconnectPressed: Bool + @StateObject var viewModel: ViewModel + + func makeUIView(context: Context) -> LottieAnimationView { + let animationView = LottieAnimationView() + animationView.animation = LottieAnimation.named(colorScheme == .dark ? "button-full2-dark" : "button-full2") + context.coordinator.colorScheme = colorScheme + animationView.contentMode = .scaleAspectFit + return animationView + } + + func updateUIView(_ uiView: LottieAnimationView, context: Context) { + // Status change check + if context.coordinator.extensionStatus != extensionStatus || context.coordinator.engineStatus != engineStatus + || context.coordinator.connectPressed != connectPressed || context.coordinator.disconnectPressed != disconnectPressed { + // Update the coordinator's state + context.coordinator.extensionStatus = extensionStatus + context.coordinator.engineStatus = engineStatus + context.coordinator.connectPressed = connectPressed + context.coordinator.disconnectPressed = disconnectPressed + + if context.coordinator.isPlaying { + print("Is still playing") + return + } + // Act based on the new status + switch extensionStatus { + case .connected: + print("Management status chnaged to \(engineStatus)") + if disconnectPressed { + DispatchQueue.main.async { + context.coordinator.playDisconnectingFadeIn(uiView: uiView, viewModel: viewModel) + } + } + switch engineStatus { + case .connected: + DispatchQueue.main.async { + viewModel.extensionStateText = "Connected" + } + uiView.currentFrame = context.coordinator.connectedFrame + case .connecting: + context.coordinator.playConnectingLoop(uiView: uiView, viewModel: viewModel) + case .disconnected: + break + case .disconnecting: + break + } + case .disconnected: + if connectPressed { + DispatchQueue.main.async { + context.coordinator.playConnectingFadeIn(uiView: uiView, viewModel: viewModel) + } + } + DispatchQueue.main.async { + viewModel.extensionStateText = "Disconnected" + } + uiView.currentFrame = context.coordinator.disconnectedFrame + case .connecting: + DispatchQueue.main.async { + context.coordinator.playConnectingFadeIn(uiView: uiView, viewModel: viewModel) + } + case .disconnecting: + DispatchQueue.main.async { + context.coordinator.playDisconnectingFadeIn(uiView: uiView, viewModel: viewModel) + } + default: + break + } + } + } + + func makeCoordinator() -> Coordinator { + Coordinator() + } + + class Coordinator: NSObject { + var isPlaying = false + var extensionStatus: NEVPNStatus? + var engineStatus: ClientState? + var connectPressed: Bool? + var disconnectPressed: Bool? + var colorScheme: ColorScheme? + + let connectedFrame: CGFloat = 142 + let disconnectedFrame: CGFloat = 339 + let connectingFadeIn: (startFrame: CGFloat, endFrame: CGFloat) = (0, 78) + let connectingLoopRange: (startFrame: CGFloat, endFrame: CGFloat) = (78, 120) + let connectingFadeOut: (startFrame: CGFloat, endFrame: CGFloat) = (121, 142) + let disconnectingLoopFadeIn: (startFrame: CGFloat, endFrame: CGFloat) = (152, 214) + let disconnectingLoopRange: (startFrame: CGFloat, endFrame: CGFloat) = (215, 258) + let disconnectingFadeOut: (startFrame: CGFloat, endFrame: CGFloat) = (259, 339) + + + func playConnectingFadeIn(uiView: LottieAnimationView, viewModel: ViewModel) { + DispatchQueue.main.async { + viewModel.extensionStateText = "Connecting..." + } + self.isPlaying = true + uiView.play(fromFrame: connectingFadeIn.startFrame, toFrame: connectingFadeIn.endFrame, loopMode: .playOnce) { [weak self] finished in + guard let self = self else { return } + if self.engineStatus == .connected { + self.playFadeOut(uiView: uiView, startFrame: self.connectingFadeOut.startFrame, endFrame: self.connectingFadeOut.endFrame, viewModel: viewModel, extensionStateText: "Connected") + } else { + // Loop the connecting animation only if the status is still connecting + playConnectingLoop(uiView: uiView, viewModel: viewModel) + } + } + } + + func playConnectingLoop(uiView: LottieAnimationView, viewModel: ViewModel) { + self.isPlaying = true + DispatchQueue.main.async { + viewModel.extensionStateText = "Connecting..." + } + uiView.play(fromFrame: self.connectingLoopRange.startFrame, toFrame: self.connectingLoopRange.endFrame, loopMode: .playOnce) {[weak self] finished in + guard let self = self else { return } + if self.engineStatus == .connected { + self.playFadeOut(uiView: uiView, startFrame: self.connectingFadeOut.startFrame, endFrame: self.connectingFadeOut.endFrame, viewModel: viewModel, extensionStateText: "Connected") + } else if (self.engineStatus == .disconnecting || self.extensionStatus == .disconnecting || self.engineStatus == .disconnected || self.extensionStatus == .disconnected) && !(self.connectPressed ?? false) { + print("Connected pressed = \(self.connectPressed?.description)") + self.playDisconnectingLoop(uiView: uiView, viewModel: viewModel) + } else { + playConnectingLoop(uiView: uiView, viewModel: viewModel) + } + } + } + + func playDisconnectingFadeIn(uiView: LottieAnimationView, viewModel: ViewModel) { + self.isPlaying = true + DispatchQueue.main.async { + viewModel.extensionStateText = "Disconnecting..." + } + uiView.play(fromFrame: disconnectingLoopFadeIn.startFrame, toFrame: disconnectingLoopFadeIn.endFrame, loopMode: .playOnce) { [weak self] finished in + guard let self = self else { return } + if self.extensionStatus == .disconnected { + self.playFadeOut(uiView: uiView, startFrame: self.disconnectingFadeOut.startFrame, endFrame: self.disconnectingFadeOut.endFrame, viewModel: viewModel, extensionStateText: "Disconnected") + } else { + DispatchQueue.main.async { + viewModel.connectPressed = false + } + playDisconnectingLoop(uiView: uiView, viewModel: viewModel) + } + } + } + + func playDisconnectingLoop(uiView: LottieAnimationView, viewModel: ViewModel) { + self.isPlaying = true + DispatchQueue.main.async { + viewModel.extensionStateText = "Disconnecting..." + } + uiView.play(fromFrame: self.disconnectingLoopRange.startFrame, toFrame: self.disconnectingLoopRange.endFrame, loopMode: .playOnce) { [weak self] finished in + guard let self = self else { return } + if self.extensionStatus == .disconnected { + self.playFadeOut(uiView: uiView, startFrame: self.disconnectingFadeOut.startFrame, endFrame: self.disconnectingFadeOut.endFrame, viewModel: viewModel, extensionStateText: "Disconnected") + } else { + playDisconnectingLoop(uiView: uiView, viewModel: viewModel) + } + } + } + + func playFadeOut(uiView: LottieAnimationView, startFrame: CGFloat, endFrame: CGFloat, viewModel: ViewModel, extensionStateText: String) { + self.isPlaying = true + uiView.play(fromFrame: startFrame, toFrame: endFrame, loopMode: .playOnce) { [weak self] finished in + DispatchQueue.main.async { + self?.isPlaying = false + viewModel.extensionStateText = extensionStateText + viewModel.connectPressed = false + viewModel.disconnectPressed = false + } + } + } + } +} diff --git a/NetBird/Source/App/Views/Components/CustomTextField.swift b/NetBird/Source/App/Views/Components/CustomTextField.swift new file mode 100644 index 0000000..dd3f112 --- /dev/null +++ b/NetBird/Source/App/Views/Components/CustomTextField.swift @@ -0,0 +1,42 @@ +// +// CustomTextField.swift +// NetBird +// +// Created by Pascal Fischer on 06.11.23. +// + +import SwiftUI + +struct CustomTextField: View { + var placeholder: String + @Binding var text: String + @Binding var secure: Bool + var foregroundColor: Color = .primary + var cornerRadius: CGFloat = 8.0 + var borderColor: Color = Color("BorderTextField") + var borderWidth: CGFloat = 1.0 + var height: CGFloat = 36.0 + + var body: some View { + ZStack { + RoundedRectangle(cornerRadius: cornerRadius) + .fill(Color("BgTextField")) + .frame(height: height) + .overlay( + RoundedRectangle(cornerRadius: cornerRadius) + .stroke(borderColor, lineWidth: borderWidth) + ) + if secure { + SecureField(placeholder, text: $text) + .foregroundColor(foregroundColor) + .padding(.horizontal, 8) + .disabled(true) + } else { + TextField(placeholder, text: $text) + .foregroundColor(foregroundColor) + .padding(.horizontal, 8) + } + } + } +} + diff --git a/NetBird/Source/App/Views/Components/PeerCard.swift b/NetBird/Source/App/Views/Components/PeerCard.swift new file mode 100644 index 0000000..89e2765 --- /dev/null +++ b/NetBird/Source/App/Views/Components/PeerCard.swift @@ -0,0 +1,35 @@ +// +// PeerCard.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 10.10.23. +// + +import SwiftUI + +struct PeerCard: View { + var peer: PeerInfo + + var body: some View { + HStack { + HStack { + RoundedRectangle(cornerRadius: 8) + .fill(peer.connStatus == "Connected" ? Color.green : Color.gray.opacity(0.5)) + .frame(width: 8, height: 40) + VStack(alignment: .leading, content: { + Text(peer.fqdn).padding(.bottom, 1).foregroundColor(Color("TextPeerCard")) + Text(peer.ip).foregroundColor(Color("TextPeerCard")) + }).padding(.leading, 5) + Spacer() + Text(peer.connStatus).foregroundColor(Color("TextPeerCard")).padding(.leading, 3) + } + .padding() + }.background( + Color("BgPeerCard") + ) + } +} + +#Preview { + PeerCard(peer: PeerInfo(ip: "123.123.123.123", fqdn: "iPhone.netbird.cloud", connStatus: "Connected")) +} diff --git a/NetBird/Source/App/Views/Components/SafariView.swift b/NetBird/Source/App/Views/Components/SafariView.swift new file mode 100644 index 0000000..9a83afa --- /dev/null +++ b/NetBird/Source/App/Views/Components/SafariView.swift @@ -0,0 +1,50 @@ +import SwiftUI +import SafariServices + +struct SafariView: UIViewControllerRepresentable { + @Binding var isPresented: Bool + let url: URL + let didFinish: () -> Void + + func makeUIViewController(context: Context) -> SFSafariViewController { + let controller = SFSafariViewController(url: url) + controller.delegate = context.coordinator + return controller + } + + func updateUIViewController(_ uiViewController: SFSafariViewController, context: Context) {} + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + class Coordinator: NSObject, SFSafariViewControllerDelegate { + let parent: SafariView + + init(_ parent: SafariView) { + self.parent = parent + } + + func safariViewController(_ controller: SFSafariViewController, initialLoadDidRedirectTo URL: URL) { + print("Url is: \(URL.absoluteString)") + if isSuccessURL(URL.absoluteString) { + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + self.parent.isPresented = false + self.parent.didFinish() + } + } + } + + func safariViewControllerDidFinish(_ controller: SFSafariViewController) { + parent.isPresented = false + parent.didFinish() + } + + func isSuccessURL(_ string: String) -> Bool { + if string.isEmpty { return true } + let pattern = "^(http|https)://(localhost:53000/\\?code=.*|[a-zA-Z0-9.-]+/device/success)$" + let isMatch = string.range(of: pattern, options: .regularExpression, range: nil, locale: nil) != nil + return isMatch + } + } +} diff --git a/NetBird/Source/App/Views/Components/SideDrawer.swift b/NetBird/Source/App/Views/Components/SideDrawer.swift new file mode 100644 index 0000000..74a84d3 --- /dev/null +++ b/NetBird/Source/App/Views/Components/SideDrawer.swift @@ -0,0 +1,143 @@ +// +// SideDrawer.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 01.08.23. +// + +import SwiftUI + +struct SideDrawer: View { + @StateObject var viewModel: ViewModel + @Binding var isShowing: Bool + var edgeTransition: AnyTransition = .move(edge: .leading) + + var body: some View { + ZStack(alignment: .leading) { + if (isShowing) { + Color.black + .opacity(0.3) + .ignoresSafeArea() + .onTapGesture { + isShowing.toggle() + } + SideMenu(viewModel: viewModel) + .transition(edgeTransition) + .background( + Color.clear + ) + } + } + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom) + .ignoresSafeArea() + .animation(.easeInOut, value: isShowing) + } +} + +struct SideMenu: View { + @StateObject var viewModel: ViewModel + + let isIpad = UIDevice.current.userInterfaceIdiom == .pad + + var body: some View { + ZStack (alignment: .leading) { + Rectangle() + .fill(Color("BgSideDrawer")) + .frame(width: UIScreen.main.bounds.width * (isIpad ? 0.4 : 0.7)) + .shadow(color: .black.opacity(0.1), radius: 5, x: 0, y: 3) + VStack(alignment: .leading, spacing: UIScreen.main.bounds.width * 0.05) { + HStack { + Spacer() + Image("netbird-logo-menu") + Spacer() + } + .padding(.top, UIScreen.main.bounds.height * 0.05) + .padding(.bottom, UIScreen.main.bounds.height * 0.11) + Group { + NavigationLink { + AdvancedView() + } label: { + HStack{ + Image("menu-advance") + .resizable() + .scaledToFit() + .frame(width: 30) + .padding(.trailing, 5) + Text("Advanced") + .font(.system(size: 20, weight: .regular)) + .foregroundColor(Color("TextPrimary")) + } + .padding(.bottom, UIScreen.main.bounds.height * 0.07) + } + NavigationLink { + AboutView() + } label: { + HStack{ + Image("menu-about") + .resizable() + .scaledToFit() + .frame(width: 30) + .padding(.trailing, 5) + Text("About") + .font(.system(size: 20, weight: .regular)) + .foregroundColor(Color("TextPrimary")) + } + .padding(.bottom, UIScreen.main.bounds.height * 0.07) + } + HStack{ + Link(destination: URL(string: "https://docs.netbird.io")!) { + Image("menu-faq") + .resizable() + .scaledToFit() + .frame(width: 30) + .padding(.trailing, 5) + Text("Docs") + .font(.system(size: 20, weight: .regular)) + .foregroundColor(Color("TextPrimary")) + } + } + .buttonStyle(PlainButtonStyle()) + .padding(.bottom, UIScreen.main.bounds.height * 0.07) + + Button { + viewModel.showChangeServerAlert = true + viewModel.presentSideDrawer = false + } label: { + HStack(alignment: .center, content: { + Image("menu-change") + .resizable() + .scaledToFit() + .frame(width: 30) + .padding(.trailing, 5) + Text("Change Server") + .font(.system(size: 20, weight: .regular)) + .foregroundColor(Color("TextPrimary")) + .padding(.top, 3) + }) + } + } + .padding(.leading, UIScreen.main.bounds.width * 0.10) + Spacer() + HStack { + Spacer() + Text("Version \(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "unknown")") + .font(.system(size: 18, weight: .regular)) + .foregroundColor(Color("TextPrimary")) + Spacer() + } + .padding(.bottom, UIScreen.main.bounds.height * 0.06) + } + .padding(.top, 10) + .frame(width: UIScreen.main.bounds.width * (isIpad ? 0.4 : 0.7)) + } + } +} + + + +struct SideDrawer_Previews: PreviewProvider { + private var isShowing = true + static var previews: some View { + SideMenu(viewModel: ViewModel()) + } +} diff --git a/NetBird/Source/App/Views/Components/SolidButton.swift b/NetBird/Source/App/Views/Components/SolidButton.swift new file mode 100644 index 0000000..5d3130c --- /dev/null +++ b/NetBird/Source/App/Views/Components/SolidButton.swift @@ -0,0 +1,49 @@ +// +// SolidButton.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 01.08.23. +// + +import SwiftUI + +struct SolidButton: View { + var text : String + var action: () -> Void + var body: some View { + Button { + action() + } label: { + Text(text) + .font(.headline) + .foregroundColor(.white) + .padding() + .frame(maxWidth: .infinity) + .background( + RoundedRectangle(cornerRadius: 3) + .fill(Color.accentColor) + .overlay( + RoundedRectangle(cornerRadius: 3) + .stroke(Color.orange.darker(), lineWidth: 2) + ) + ) + } + } +} + +extension Color { + func darker() -> Color { + let components = UIColor(self).cgColor.components! + return Color(red: Double(components[0] * 0.9), + green: Double(components[1] * 0.9), + blue: Double(components[2] * 0.9)) + } +} + +struct SolidButton_Previews: PreviewProvider { + static var previews: some View { + SolidButton(text: "save") { + print("noop") + } + } +} diff --git a/NetBird/Source/App/Views/MainView.swift b/NetBird/Source/App/Views/MainView.swift new file mode 100644 index 0000000..9007c51 --- /dev/null +++ b/NetBird/Source/App/Views/MainView.swift @@ -0,0 +1,574 @@ +// +// MainView.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 01.08.23. +// + +import SwiftUI +import Lottie + +struct MainView: View { + @EnvironmentObject var viewModel: ViewModel + @State private var isSheetshown = true + @State private var isSheetExpanded = false + @State private var animationKey: UUID = UUID() + + let isIpad = UIDevice.current.userInterfaceIdiom == .pad + + init() { + let appearance = UINavigationBarAppearance() + appearance.configureWithOpaqueBackground() + appearance.backgroundColor = UIColor(named: "BgNavigationBar") + + // Customize the title text color + appearance.titleTextAttributes = [.foregroundColor: UIColor.white] + appearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white] + + // Set the appearance for when the navigation bar is displayed regularly + UINavigationBar.appearance().standardAppearance = appearance + + // Set the appearance for when the navigation bar has a collapsed state + UINavigationBar.appearance().compactAppearance = appearance // Optional + + // Set the appearance for when the navigation bar is displayed in a scroll edge context + UINavigationBar.appearance().scrollEdgeAppearance = appearance // For iOS 15 and later + } + + var body: some View { + NavigationView { + ZStack { + if viewModel.statusDetailsValid { + VStack { + Color("BgSecondary") + .frame(height: UIScreen.main.bounds.height * 3/5) + .ignoresSafeArea(.all) + Color("BgPrimary") + .frame(height: UIScreen.main.bounds.height * 2/5) + .ignoresSafeArea(.all) + } + VStack { + Image("bg-bottom") + .resizable(resizingMode: .stretch) + .aspectRatio(contentMode: .fill) + .padding(.top, UIScreen.main.bounds.height * (isIpad ? 0.32 : 0.19)) + .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.width * 1.33) + .edgesIgnoringSafeArea(.bottom) + } + VStack { + Text(viewModel.fqdn) + .foregroundColor(Color("TextSecondary")) + .font(.system(size: 20, weight: .regular)) + .padding(.top, UIScreen.main.bounds.height * 0.11) + .padding(.bottom, 5) + Text(viewModel.ip) + .foregroundColor(Color("TextSecondary")) + .font(.system(size: 20, weight: .regular)) + Spacer() + } + VStack() { + HStack { + Button { + viewModel.presentSideDrawer = true + } label: { + Image("hamburgerMenu") + .resizable() + .frame(width: 35, height: 35) + .padding(.top, UIScreen.main.bounds.height * 0.03) + } + Spacer() + } +// Spacer() +// Button("print logs") { +// let fileManager = FileManager.default +// let groupURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.io.netbird.app") +// let logURL = groupURL?.appendingPathComponent("logfile.log") +// printLogContents(from: logURL!) +// } + Spacer() + Button(action: { + if !viewModel.buttonLock { + if viewModel.extensionState == .disconnected { + viewModel.connect() + } else if viewModel.extensionState == .connecting || viewModel.statusDetails.managementStatus == .connecting || viewModel.extensionState == .connected { + print("Trying to stop extenison") + viewModel.close() + } + } + }) { + CustomLottieView(extensionStatus: $viewModel.extensionState, engineStatus: $viewModel.statusDetails.managementStatus, connectPressed: $viewModel.connectPressed, disconnectPressed: $viewModel.disconnectPressed, viewModel: viewModel) + .id(animationKey) + .frame(width: UIScreen.main.bounds.width * 0.79, height: UIScreen.main.bounds.width * 0.79) + .onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in + withAnimation { + self.animationKey = UUID() + } + } + } + .padding(.top, -UIScreen.main.bounds.height / 27) + .padding(.bottom) + Text(viewModel.extensionStateText) + .foregroundColor(Color("TextSecondary")) + .font(.system(size: 24, weight: .regular)) + Spacer() + } + .padding() + SheetView(isSheetExpanded: $isSheetExpanded, peerInfo: viewModel.statusDetails.peerInfo) + SideDrawer(viewModel: viewModel, isShowing: $viewModel.presentSideDrawer) + NavigationLink("", destination: ServerView(), isActive: $viewModel.navigateToServerView) + .hidden() + if viewModel.networkExtensionAdapter.showBrowser && viewModel.networkExtensionAdapter.loginURL != nil && URL(string: viewModel.networkExtensionAdapter.loginURL!) != nil { + SafariView(isPresented: $viewModel.networkExtensionAdapter.showBrowser, + url: URL(string: viewModel.networkExtensionAdapter.loginURL!)!, + didFinish: { + print("Finish login") + viewModel.networkExtensionAdapter.startVPNConnection() + }) + + } + if viewModel.showChangeServerAlert { + Color.black.opacity(0.4) + .edgesIgnoringSafeArea(.all) + .onTapGesture { + viewModel.showChangeServerAlert = false + } + + ChangeServerAlert(viewModel: viewModel, isPresented: $viewModel.showChangeServerAlert) + .frame(maxWidth: UIScreen.main.bounds.width * 0.9) + } + if viewModel.showServerChangedInfo { + Color.black.opacity(0.4) + .edgesIgnoringSafeArea(.all) + .onTapGesture { + viewModel.showServerChangedInfo = false + } + + ChangeServerInfoAlert(viewModel: viewModel, isPresented: $viewModel.showServerChangedInfo) + .frame(maxWidth: UIScreen.main.bounds.width * 0.9) + } + if viewModel.showPreSharedKeyChangedInfo { + Color.black.opacity(0.4) + .edgesIgnoringSafeArea(.all) + .onTapGesture { + viewModel.showPreSharedKeyChangedInfo = false + } + + ChangePreSharedKeyAlert(viewModel: viewModel, isPresented: $viewModel.showPreSharedKeyChangedInfo) + .frame(maxWidth: UIScreen.main.bounds.width * 0.9) + } + // diabled for now as it is generating to much false positives + if viewModel.showAuthenticationRequired && false { + Color.black.opacity(0.4) + .edgesIgnoringSafeArea(.all) + .onTapGesture { + viewModel.buttonLock = true + viewModel.showAuthenticationRequired = false + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + viewModel.buttonLock = false + } + } + + AuthenticationAlert(viewModel: viewModel, isPresented: $viewModel.showAuthenticationRequired) + .frame(maxWidth: UIScreen.main.bounds.width * 0.9) + } + ZStack { + VStack { + Spacer() + if viewModel.showCopiedAlert { + HStack { + Image("logo-onboarding") + .resizable() + .frame(width: 20, height: 15) + Text("Domain name copied!") + .foregroundColor(.white) + .font(.headline) + } + .padding(5) + .background(Color.black.opacity(0.5)) + .cornerRadius(8) + .transition(AnyTransition.opacity.combined(with: .move(edge: .top))) + .animation(.default, value: viewModel.showCopiedAlert) + .zIndex(1) + } + if viewModel.showCopiedInfoAlert { + Text("Double-tap to copy!") + .foregroundColor(.white) + .font(.headline) + .padding(5) + .background(Color.black.opacity(0.5)) + .cornerRadius(8) + .transition(AnyTransition.opacity.combined(with: .move(edge: .top))) + .animation(.default, value: viewModel.showCopiedInfoAlert) + .zIndex(1) + } + } + .padding(.bottom, 40) + } + } else { + Image("netbird-logo-menu") + .resizable() + .scaledToFit() + .frame(width: UIScreen.main.bounds.width * 0.8) + } + } + .navigationBarTitleDisplayMode(.inline) + .navigationBarHidden(true) + } + .navigationViewStyle(StackNavigationViewStyle()) + } +} + +struct SheetView: View { + @EnvironmentObject var viewModel: ViewModel + + @Binding var isSheetExpanded: Bool + var peerInfo: [PeerInfo] + @GestureState private var translation: CGFloat = 0 + + @State private var peerFilter: String = "" + @State private var selectionFilter: String = "All" + @State private var showDropdown: Bool = false + + @State private var tappedPeer: PeerInfo? = nil + + let isIpad = UIDevice.current.userInterfaceIdiom == .pad + + var filteredPeers: [PeerInfo] { + return peerInfo + .filter { + switch selectionFilter { + case "All": return true + case "Connected": return $0.connStatus == "Connected" + case "Disconnected": return $0.connStatus == "Disconnected" + default: return false + } + } + .filter { + $0.fqdn.lowercased().contains(peerFilter.lowercased()) || + $0.ip.contains(peerFilter) || + peerFilter.isEmpty + } + } + + + var body: some View { + ZStack { + ZStack { + VStack { + Button { + withAnimation(.linear(duration: 0.2)) { + isSheetExpanded.toggle() + } + } label: { + Handlebar().padding(.top, 5) + } + HStack { + Text((viewModel.extensionStateText != "Connected" ? "0" : peerInfo.filter({ info in + info.connStatus == "Connected" + }).count.description) + " of " + (viewModel.extensionStateText != "Connected" ? "0" : peerInfo.count.description)).font(.system(size: 18, weight: .bold)) + .foregroundColor(Color("TextSecondary")) + Text("Peers connected") + .font(.system(size: 18, weight: .regular)) + .foregroundColor(Color("TextSecondary")) + } + .padding(.top, UIScreen.main.bounds.height * (isIpad ? 0.02 : 0.005)) + .padding(.bottom, 15) + if viewModel.extensionStateText == "Connected" && peerInfo.count > 0 { + VStack { + HStack { + CustomTextField(placeholder: "search peers", text: $peerFilter, secure: .constant(false)) + .padding([.top, .bottom], 10) + Menu { + Button(action: { selectionFilter = "All" }) { + Text("All") + } + + Button(action: { selectionFilter = "Connected" }) { + Text("Connected") + } + Button(action: { selectionFilter = "Disconnected" }) { + Text("Disconnected") + } + + } label: { + Image("icon-filter") + .padding([.leading, .trailing], 4) + } + }.padding([.leading, .trailing]) + ZStack { + ScrollView { + ForEach(filteredPeers) { peer in + ZStack { + PeerCard(peer: peer) + .opacity(tappedPeer == peer ? 0.3 : 1.0) + .onTapGesture(count: 2) { + tappedPeer = peer + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + withAnimation { + tappedPeer = nil + } + } + + print("Copied to clipboard") + UIPasteboard.general.string = peer.fqdn + viewModel.showCopiedAlert = true + + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + withAnimation { + viewModel.showCopiedAlert = false + } + } + } + .onTapGesture { + UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + print("show notication") + viewModel.showCopiedInfoAlert = true + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + withAnimation { + viewModel.showCopiedInfoAlert = false + } + } + } + .padding([.top,.bottom], 2) + } + } + } + .frame(height: UIScreen.main.bounds.height * 0.70) + .padding(.bottom, 1) + } + } + } else { + Group { + Image("icon-empty-box") + .padding(.top, UIScreen.main.bounds.height * 0.05) + Text("It looks like there are no machines that you can connect to...") + .font(.system(size: 18, weight: .regular)) + .foregroundColor(Color("TextPrimary")) + .multilineTextAlignment(.center) + .padding(.top, UIScreen.main.bounds.height * 0.04) + .padding([.leading, .trailing], UIScreen.main.bounds.width * 0.075) + Link(destination: URL(string: "https://docs.netbird.io")!) { + Text("Learn why") + .font(.headline) + .foregroundColor(.white) + .padding() + .frame(maxWidth: .infinity) // Span the whole width + .background( + RoundedRectangle(cornerRadius: 3) + .fill(Color.accentColor) + .overlay( + RoundedRectangle(cornerRadius: 3) + .stroke(Color.orange.darker(), lineWidth: 2) + ) + ) + .padding(.top, UIScreen.main.bounds.height * 0.04) + } + } + .padding([.leading, .trailing], UIScreen.main.bounds.width * 0.05) + } + Spacer() + } + if isSheetExpanded { + VStack { + HStack { + Spacer() + Button { + withAnimation { + isSheetExpanded = false + } + } label: { + Image("close-slider") + .padding(25) + } + } + Spacer() + } + } + } + .padding(.top, 3) + .padding(.bottom, 7) + .frame(maxWidth: .infinity, maxHeight: UIScreen.main.bounds.height) + .background(Color("BgMenu")) + .cornerRadius(35) + .shadow(radius: 10) + .offset(y: isSheetExpanded ? UIScreen.main.bounds.height * 0.1 : UIScreen.main.bounds.height * 0.90 + translation) + .gesture( + DragGesture() + .updating($translation, body: { value, state, _ in + state = value.translation.height + }) + .onEnded({ value in + if value.translation.height > UIScreen.main.bounds.height * 0.25 { + withAnimation { + isSheetExpanded = false + } + } else { + withAnimation { + isSheetExpanded = true + } + } + }) + ) + .onTapGesture { + UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + } + + // Add a transparent background to enable interaction with the rest of the screen when collapsed + if !isSheetExpanded { + Color.clear + .ignoresSafeArea(.container) + .onTapGesture { + withAnimation { + isSheetExpanded = true + } + } + } + } + .frame(maxHeight: .infinity) // Make sure the sheet can take up the entire screen height + .ignoresSafeArea(.keyboard) // Ignore the keyboard to prevent conflicts with the sheet layout + } +} + +struct Handlebar: View { + var body: some View { + Rectangle() + .fill(Color("HandleBar")) + .frame(width: UIScreen.main.bounds.width * 0.3, height: 7) + .cornerRadius(7) + } +} + +struct ChangeServerAlert: View { + @StateObject var viewModel: ViewModel + @Binding var isPresented: Bool + + var body: some View { + VStack(spacing: 20) { + Image("exclamation-circle") + .padding(.top, 20) + Text("Change server") + .font(.title) + .foregroundColor(Color("TextAlert")) + Text("Changing server will erase the local config and disconnect this device from the current NetBird account.") + .foregroundColor(Color("TextAlert")) + .multilineTextAlignment(.center) + SolidButton(text: "Confirm") { + viewModel.close() + viewModel.clearDetails() + isPresented.toggle() + viewModel.navigateToServerView = true + } + .padding(.top, 20) + + Button { + isPresented.toggle() + } label: { + Text("Cancel") + .font(.headline) + .foregroundColor(Color.accentColor) + .padding() + .frame(maxWidth: .infinity) // Span the whole width + .background( + RoundedRectangle(cornerRadius: 3) + .fill(Color(red: 0, green: 0, blue: 0, opacity: 0)) + .overlay( + RoundedRectangle(cornerRadius: 3) + .stroke(Color.accentColor, lineWidth: 1) + ) + ) + } + } + .padding() + .background(Color("BgSideDrawer")) + .cornerRadius(15) + .shadow(radius: 10) + } +} + +struct ChangeServerInfoAlert: View { + @StateObject var viewModel: ViewModel + @Binding var isPresented: Bool + + var body: some View { + VStack(spacing: 20) { + Image("check-circle") + .padding(.top, 20) + Text("Server was changed") + .font(.title) + .foregroundColor(Color("TextAlert")) + Text("Click on the connect button to continue.") + .multilineTextAlignment(.center) + .foregroundColor(Color("TextAlert")) + SolidButton(text: "Ok") { + viewModel.showServerChangedInfo = false + } + .padding(.top, 20) + } + .padding() + .background(Color("BgSideDrawer")) + .cornerRadius(15) + .shadow(radius: 10) + } +} + +struct ChangePreSharedKeyAlert: View { + @StateObject var viewModel: ViewModel + @Binding var isPresented: Bool + + var body: some View { + VStack(spacing: 20) { + Image("check-circle") + .padding(.top, 20) + Text("Preshared key was set") + .font(.title) + .foregroundColor(Color("TextAlert")) + Text("Click on the connect button to continue.") + .multilineTextAlignment(.center) + .foregroundColor(Color("TextAlert")) + SolidButton(text: "Ok") { + viewModel.showPreSharedKeyChangedInfo = false + } + .padding(.top, 20) + } + .padding() + .background(Color("BgSideDrawer")) + .cornerRadius(15) + .shadow(radius: 10) + } +} + +struct AuthenticationAlert: View { + @StateObject var viewModel: ViewModel + @Binding var isPresented: Bool + + var body: some View { + VStack(spacing: 20) { + Image("exclamation-circle") + .padding(.top, 20) + Text("Authentication required") + .foregroundColor(Color("TextAlert")) + .font(.title) + Text("The server requires a new authentication.") + .foregroundColor(Color("TextAlert")) + .multilineTextAlignment(.center) + SolidButton(text: "Ok") { + viewModel.buttonLock = true + viewModel.showAuthenticationRequired = false + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + viewModel.buttonLock = false + } + } + .padding(.top, 20) + } + .padding() + .background(Color("BgSideDrawer")) + .cornerRadius(15) + .shadow(radius: 10) + } +} + +struct MainView_Previews: PreviewProvider { + static var previews: some View { + MainView() + } +} diff --git a/NetBird/Source/App/Views/ServerView.swift b/NetBird/Source/App/Views/ServerView.swift new file mode 100644 index 0000000..cb1f9f9 --- /dev/null +++ b/NetBird/Source/App/Views/ServerView.swift @@ -0,0 +1,184 @@ +// +// ServerView.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 12.10.23. +// + +import SwiftUI + +struct ServerView: View { + + @EnvironmentObject var viewModel: ViewModel + + @State private var showSetupKeyField = false + @State private var isVerifyingServer = false + @State private var isVerifyingKey = false + + @Environment(\.presentationMode) var presentationMode: Binding + + var body: some View { + ZStack { + Color("BgPage") + .edgesIgnoringSafeArea(.bottom) + VStack (alignment: .leading){ + Text("Server") + .font(.system(size: 18, weight: .bold)) + .foregroundColor(Color("TextPrimary")) + .padding(.top, UIScreen.main.bounds.height * 0.04) + CustomTextField(placeholder: "https://example-api.domain.com:443", text: $viewModel.server, secure: .constant(false)) + .padding(.top, 3) + if viewModel.showInvalidServerAlert { + Text("Invalid server address").foregroundColor(.red) + } + if showSetupKeyField && !isVerifyingServer { + Text("Setup key") + .font(.system(size: 18, weight: .bold)) + .foregroundColor(Color("TextPrimary")) + CustomTextField(placeholder: "Key", text: $viewModel.setupKey, secure: .constant(false)) + .padding(.top, 3) + if viewModel.showInvalidSetupKeyHint { + Text("Invalid setup key").foregroundColor(.red) + } + } + SolidButton(text: isVerifyingServer || isVerifyingKey ? "Verifying..." : "Change") { + if viewModel.showInvalidServerAlert || viewModel.server.isEmpty || isVerifyingServer || isVerifyingKey { + return + } + if viewModel.setupKey == "" { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + isVerifyingServer = true + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + let sso = viewModel.updateManagementURL(url: viewModel.server) + switch sso { + case .none: + viewModel.showInvalidServerAlert = true + case .some(true): + viewModel.showServerChangedInfo = true + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.presentationMode.wrappedValue.dismiss() + viewModel.server = "" + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + viewModel.showServerChangedInfo = false + } + } + case .some(false): + showSetupKeyField = true + } + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + isVerifyingServer = false + } + } + } else { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + isVerifyingKey = true + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + do { + try viewModel.setSetupKey(key: viewModel.setupKey) + self.presentationMode.wrappedValue.dismiss() + viewModel.showServerChangedInfo = true + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + viewModel.showServerChangedInfo = false + } + viewModel.setupKey = "" + isVerifyingKey = false + } catch { + viewModel.showInvalidSetupKeyAlert = true + isVerifyingKey = false + } + } + } + print("use custom server") + } + .padding(.top, 5) + Button { + if !isVerifyingKey && !isVerifyingServer { + let sso = viewModel.updateManagementURL(url: "https://api.netbird.io") + print("use netbird server") + if sso ?? false { + self.presentationMode.wrappedValue.dismiss() + viewModel.showServerChangedInfo = true + DispatchQueue.main.asyncAfter(deadline: .now() + 3) { + viewModel.showServerChangedInfo = false + } + } else { + showSetupKeyField = true + } + } + } label: { + Text("Use NetBird server") + .font(.headline) + .foregroundColor(Color.accentColor) + .padding() + .frame(maxWidth: .infinity) + .background( + RoundedRectangle(cornerRadius: 3) + .fill(Color(red: 0, green: 0, blue: 0, opacity: 0)) + .overlay( + RoundedRectangle(cornerRadius: 3) + .stroke(Color.accentColor, lineWidth: 1) + ) + ) + } + Spacer() + } + .padding([.leading, .trailing], UIScreen.main.bounds.width * 0.10) + if viewModel.showInvalidSetupKeyAlert { + Color.black.opacity(0.4) + .edgesIgnoringSafeArea(.all) + .onTapGesture { + viewModel.buttonLock = true + viewModel.showInvalidSetupKeyAlert = false + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + viewModel.buttonLock = false + } + } + + WrongSetupKeyAlert(viewModel: viewModel, isPresented: $viewModel.showInvalidSetupKeyAlert) + .frame(maxWidth: UIScreen.main.bounds.width * 0.9) + } + } + .navigationViewStyle(StackNavigationViewStyle()) + .navigationBarTitleDisplayMode(.inline) + .navigationBarBackButtonHidden(true) + .navigationBarItems(leading: CustomBackButton(text: "Change Server", action: { + presentationMode.wrappedValue.dismiss() + })) + .onTapGesture { + UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) + } + } + +} + +struct WrongSetupKeyAlert: View { + @StateObject var viewModel: ViewModel + @Binding var isPresented: Bool + + var body: some View { + VStack(spacing: 20) { + Image("exclamation-circle") + .padding(.top, 20) + Text("Setup key invalid") + .font(.title) + .foregroundColor(Color("TextAlert")) + Text("The provided setup could not be used to login. Check if the key is correct.") + .foregroundColor(Color("TextAlert")) + .multilineTextAlignment(.center) + SolidButton(text: "Confirm") { + isPresented.toggle() + } + .padding(.top, 20) + } + .padding() + .background(Color("BgSideDrawer")) + .cornerRadius(15) + .shadow(radius: 10) + } +} + +#Preview { + ServerView() +} diff --git a/NetBird/Source/Framework/Ios.framework/Headers b/NetBird/Source/Framework/Ios.framework/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/NetBird/Source/Framework/Ios.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/NetBird/Source/Framework/Ios.framework/Ios b/NetBird/Source/Framework/Ios.framework/Ios new file mode 120000 index 0000000..aea1f54 --- /dev/null +++ b/NetBird/Source/Framework/Ios.framework/Ios @@ -0,0 +1 @@ +Versions/Current/Ios \ No newline at end of file diff --git a/NetBird/Source/Framework/Ios.framework/Modules b/NetBird/Source/Framework/Ios.framework/Modules new file mode 120000 index 0000000..5736f31 --- /dev/null +++ b/NetBird/Source/Framework/Ios.framework/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/NetBird/Source/Framework/Ios.framework/Resources b/NetBird/Source/Framework/Ios.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/NetBird/Source/Framework/Ios.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.h b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.h new file mode 100644 index 0000000..57a5e65 --- /dev/null +++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.h @@ -0,0 +1,13 @@ + +// Objective-C API for talking to the following Go packages +// +// github.com/netbirdio/netbird/client/ios +// +// File is generated by gomobile bind. Do not edit. +#ifndef __Ios_FRAMEWORK_H__ +#define __Ios_FRAMEWORK_H__ + +#include "Ios.objc.h" +#include "Universe.objc.h" + +#endif diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.objc.h b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.objc.h new file mode 100644 index 0000000..85e79a9 --- /dev/null +++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Ios.objc.h @@ -0,0 +1,43 @@ +// Objective-C API for talking to github.com/netbirdio/netbird/client/ios Go package. +// gobind -lang=objc github.com/netbirdio/netbird/client/ios +// +// File is generated by gobind. Do not edit. + +#ifndef __Ios_H__ +#define __Ios_H__ + +@import Foundation; +#include "ref.h" +#include "Universe.objc.h" + + +@class IosClient; + +/** + * Client struct manage the life circle of background service + */ +@interface IosClient : NSObject { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +/** + * NewClient instantiate a new Client + */ +- (nullable instancetype)init:(NSString* _Nullable)cfgFile deviceName:(NSString* _Nullable)deviceName; +/** + * Run start the internal client. It is a blocker function + */ +- (BOOL)run:(NSError* _Nullable* _Nullable)error; +/** + * Stop the internal client and free the resources + */ +- (void)stop; +@end + +/** + * NewClient instantiate a new Client + */ +FOUNDATION_EXPORT IosClient* _Nullable IosNewClient(NSString* _Nullable cfgFile, NSString* _Nullable deviceName); + +#endif diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Universe.objc.h b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Universe.objc.h new file mode 100644 index 0000000..019e750 --- /dev/null +++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/Universe.objc.h @@ -0,0 +1,29 @@ +// Objective-C API for talking to Go package. +// gobind -lang=objc +// +// File is generated by gobind. Do not edit. + +#ifndef __Universe_H__ +#define __Universe_H__ + +@import Foundation; +#include "ref.h" + +@protocol Universeerror; +@class Universeerror; + +@protocol Universeerror +- (NSString* _Nonnull)error; +@end + +@class Universeerror; + +@interface Universeerror : NSError { +} +@property(strong, readonly) _Nonnull id _ref; + +- (nonnull instancetype)initWithRef:(_Nonnull id)ref; +- (NSString* _Nonnull)error; +@end + +#endif diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/ref.h b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/ref.h new file mode 100644 index 0000000..b8036a4 --- /dev/null +++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Headers/ref.h @@ -0,0 +1,35 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#ifndef __GO_REF_HDR__ +#define __GO_REF_HDR__ + +#include + +// GoSeqRef is an object tagged with an integer for passing back and +// forth across the language boundary. A GoSeqRef may represent either +// an instance of a Go object, or an Objective-C object passed to Go. +// The explicit allocation of a GoSeqRef is used to pin a Go object +// when it is passed to Objective-C. The Go seq package maintains a +// reference to the Go object in a map keyed by the refnum along with +// a reference count. When the reference count reaches zero, the Go +// seq package will clear the corresponding entry in the map. +@interface GoSeqRef : NSObject { +} +@property(readonly) int32_t refnum; +@property(strong) id obj; // NULL when representing a Go object. + +// new GoSeqRef object to proxy a Go object. The refnum must be +// provided from Go side. +- (instancetype)initWithRefnum:(int32_t)refnum obj:(id)obj; + +- (int32_t)incNum; + +@end + +@protocol goSeqRefInterface +-(GoSeqRef*) _ref; +@end + +#endif diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Ios b/NetBird/Source/Framework/Ios.framework/Versions/A/Ios new file mode 100644 index 0000000..516cc10 Binary files /dev/null and b/NetBird/Source/Framework/Ios.framework/Versions/A/Ios differ diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Modules/module.modulemap b/NetBird/Source/Framework/Ios.framework/Versions/A/Modules/module.modulemap new file mode 100644 index 0000000..71b01c4 --- /dev/null +++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Modules/module.modulemap @@ -0,0 +1,8 @@ +framework module "Ios" { + header "ref.h" + header "Ios.objc.h" + header "Universe.objc.h" + header "Ios.h" + + export * +} \ No newline at end of file diff --git a/NetBird/Source/Framework/Ios.framework/Versions/A/Resources/Info.plist b/NetBird/Source/Framework/Ios.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..0d1a4b8 --- /dev/null +++ b/NetBird/Source/Framework/Ios.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,6 @@ + + + + + + diff --git a/NetBird/Source/Framework/Ios.framework/Versions/Current b/NetBird/Source/Framework/Ios.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/NetBird/Source/Framework/Ios.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/NetBird/Source/Framework/bridge.h b/NetBird/Source/Framework/bridge.h new file mode 100644 index 0000000..3ad36c6 --- /dev/null +++ b/NetBird/Source/Framework/bridge.h @@ -0,0 +1,9 @@ +// +// bridge.m +// NetBirdiOS +// +// Created by Pascal Fischer on 02.08.23. +// + +#import + diff --git a/NetBird/Source/Framework/ios-bridge.m b/NetBird/Source/Framework/ios-bridge.m new file mode 100644 index 0000000..25de5a0 --- /dev/null +++ b/NetBird/Source/Framework/ios-bridge.m @@ -0,0 +1,8 @@ +// +// ios-bridge.m +// NetBirdiOS +// +// Created by Pascal Fischer on 02.08.23. +// + +#import diff --git a/NetBird/Source/animations/button-connected.json b/NetBird/Source/animations/button-connected.json new file mode 100644 index 0000000..698e6e1 --- /dev/null +++ b/NetBird/Source/animations/button-connected.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":160.000006516934,"w":257,"h":256,"nm":"button activate","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":0,"s":[0]},{"t":139.000005661586,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":10,"s":[0]},{"t":158.000006435472,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":159.000006476203,"s":[720]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/NetBird/Source/animations/button-connecting-loop.json b/NetBird/Source/animations/button-connecting-loop.json new file mode 100644 index 0000000..beb9ab0 --- /dev/null +++ b/NetBird/Source/animations/button-connecting-loop.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":42.0000017106951,"w":257,"h":256,"nm":"connecting loop","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705944061,0.51372551918,0.1882353127,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":0,"s":[0.952941236309,0.36862745098,0.196078446332,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705942191,0.513725490196,0.188235309077,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-1,"s":[0]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[0]},{"t":43.0000017514259,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-1,"s":[100,100,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":39,"s":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[100,100,100]},{"t":43.0000017514259,"s":[78,78,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/NetBird/Source/animations/button-disconnecting.json b/NetBird/Source/animations/button-disconnecting.json new file mode 100644 index 0000000..051d8cd --- /dev/null +++ b/NetBird/Source/animations/button-disconnecting.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":90.0000036657751,"w":256,"h":256,"nm":"button off","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.033,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":90.0000036657751,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":90.0000036657751,"s":[0.701960802078,0.701960802078,0.701960802078,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":90.0000036657751,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":-1,"s":[0]},{"t":69.0000028104276,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":5,"s":[0]},{"t":70.0000028511585,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-1,"s":[0]},{"t":69.0000028104276,"s":[272.571]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":-2.00000008146167,"op":70.0000028511585,"st":-20.0000008146167,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":88.0000035843135,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":75.0000030548126,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0}],"markers":[{"tm":45.0000018328876,"cm":"1","dr":0}]} \ No newline at end of file diff --git a/NetBird/Source/animations/button-full.json b/NetBird/Source/animations/button-full.json new file mode 100644 index 0000000..07c6611 --- /dev/null +++ b/NetBird/Source/animations/button-full.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":399.000016251603,"w":257,"h":256,"nm":"NetBird button","ddd":0,"assets":[{"id":"comp_0","nm":"button start connecting","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":45.0000018328876,"s":[0.964705944061,0.51372551918,0.1882353127,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":45.0000018328876,"s":[0.952941236309,0.36862745098,0.196078446332,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":45.0000018328876,"s":[0.964705942191,0.513725490196,0.188235309077,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":87,"s":[0]},{"t":88.0000035843135,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":44,"s":[100,100,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":84,"s":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":87,"s":[100,100,100]},{"t":88.0000035843135,"s":[78,78,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0}]},{"id":"comp_1","nm":"connecting loop","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705944061,0.51372551918,0.1882353127,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":0,"s":[0.952941236309,0.36862745098,0.196078446332,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705942191,0.513725490196,0.188235309077,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-1,"s":[0]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[0]},{"t":43.0000017514259,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-1,"s":[100,100,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":39,"s":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[100,100,100]},{"t":43.0000017514259,"s":[78,78,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0}]},{"id":"comp_2","nm":"connecting to active","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705944061,0.51372551918,0.1882353127,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":0,"s":[0.952941236309,0.36862745098,0.196078446332,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":0,"s":[0.964705942191,0.513725490196,0.188235309077,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":16.0000006516934,"s":[0.952941179276,0.368627458811,0.196078434587,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-2,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":12.00000048877,"s":[0.952941179276,0.368627458811,0.196078434587,1]}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0}]},{"id":"comp_3","nm":"button activate","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":0,"s":[0]},{"t":139.000005661586,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":10,"s":[0]},{"t":158.000006435472,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":159.000006476203,"s":[720]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.95294123888,0.368627458811,0.196078449488,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0}]},{"id":"comp_4","nm":"button off","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.033,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":90.0000036657751,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":90.0000036657751,"s":[0.701960802078,0.701960802078,0.701960802078,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":90.0000036657751,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":-1,"s":[0]},{"t":69.0000028104276,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":5,"s":[0]},{"t":70.0000028511585,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-1,"s":[0]},{"t":69.0000028104276,"s":[272.571]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":-2.00000008146167,"op":70.0000028511585,"st":-20.0000008146167,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":88.0000035843135,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.25,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":75.0000030548126,"s":[0.600000023842,0.600000023842,0.600000023842,1]}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"button start connecting","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"connecting loop","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":78.0000031770051,"op":120.0000048877,"st":78.0000031770051,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"connecting to active","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":120.0000048877,"op":150.000006109625,"st":120.0000048877,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"button activate","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":150.000006109625,"op":310.000012626559,"st":150.000006109625,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"button off","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":256,"h":256,"ip":310.000012626559,"op":400.000016292334,"st":310.000012626559,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/NetBird/Source/animations/button-full2-dark.json b/NetBird/Source/animations/button-full2-dark.json new file mode 100644 index 0000000..97358a3 --- /dev/null +++ b/NetBird/Source/animations/button-full2-dark.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":340.000013848484,"w":257,"h":256,"nm":"NetBird button","ddd":0,"assets":[{"id":"comp_0","nm":"button start connecting","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094,0.102,0.114,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.106,0.098,0.122,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[0],"e":[100]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":87,"s":[0],"e":[100]},{"t":88.0000035843135}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":44,"s":[100,100,100],"e":[78,78,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[78,78,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":84,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":87,"s":[100,100,100],"e":[78,78,100]},{"t":88.0000035843135}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0}]},{"id":"comp_1","nm":"connecting loop","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094,0.102,0.114,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.106,0.098,0.122,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-1,"s":[0],"e":[100]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[0],"e":[100]},{"t":43.0000017514259}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-1,"s":[100,100,100],"e":[78,78,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[78,78,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":39,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[100,100,100],"e":[78,78,100]},{"t":43.0000017514259}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0}]},{"id":"comp_2","nm":"connecting to active","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094,0.102,0.114,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.106,0.098,0.122,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"t":16.0000006516934}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-2,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"t":12.00000048877}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0}]},{"id":"comp_3","nm":"button activate","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094,0.102,0.114,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.106,0.098,0.122,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":0,"s":[0],"e":[100]},{"t":139.000005661586}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":10,"s":[0],"e":[100]},{"t":158.000006435472}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[720]},{"t":159.000006476203}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.95294123888,0.368627458811,0.196078449488,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0}]},{"id":"comp_4","nm":"connecting to active 2","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.964705944061,0.51372551918,0.1882353127,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.952941236309,0.36862745098,0.196078446332,1],"e":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.964705942191,0.513725490196,0.188235309077,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.094,0.102,0.114,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.106,0.098,0.122,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.952941179276,0.368627458811,0.196078434587,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":10.0000004073083}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-2,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.952941179276,0.368627458811,0.196078434587,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":10.0000004073083}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"button start connecting","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"connecting loop","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":78.0000031770051,"op":120.0000048877,"st":78.0000031770051,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"connecting to active","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":120.0000048877,"op":150.000006109625,"st":120.0000048877,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"button activate","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":150.000006109625,"op":310.000012626559,"st":150.000006109625,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"connecting to active 2","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":310.000012626559,"op":340.000013848484,"st":310.000012626559,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/NetBird/Source/animations/button-full2.json b/NetBird/Source/animations/button-full2.json new file mode 100644 index 0000000..896eaae --- /dev/null +++ b/NetBird/Source/animations/button-full2.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":340.000013848484,"w":257,"h":256,"nm":"NetBird button","ddd":0,"assets":[{"id":"comp_0","nm":"button start connecting","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":45.0000018328876}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[0],"e":[100]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":87,"s":[0],"e":[100]},{"t":88.0000035843135}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":44,"s":[100,100,100],"e":[78,78,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[78,78,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":84,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":87,"s":[100,100,100],"e":[78,78,100]},{"t":88.0000035843135}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0}]},{"id":"comp_1","nm":"connecting loop","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-1,"s":[0],"e":[100]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[0],"e":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":42,"s":[0],"e":[100]},{"t":43.0000017514259}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":-1,"s":[100,100,100],"e":[78,78,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[78,78,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":39,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":42,"s":[100,100,100],"e":[78,78,100]},{"t":43.0000017514259}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":42.0000017106951,"st":-45.0000018328876,"bm":0}]},{"id":"comp_2","nm":"connecting to active","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"t":0}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"t":16.0000006516934}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-2,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"t":12.00000048877}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0}]},{"id":"comp_3","nm":"button activate","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":170.000006924242,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705944061,0.51372551918,0.1882353127,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.41],"y":[0]},"t":0,"s":[0],"e":[100]},{"t":139.000005661586}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.405],"y":[0]},"t":10,"s":[0],"e":[100]},{"t":158.000006435472}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[720]},{"t":159.000006476203}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.95294123888,0.368627458811,0.196078449488,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0}]},{"id":"comp_4","nm":"connecting to active 2","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705944061,0.51372551918,0.1882353127,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.964705944061,0.51372551918,0.1882353127,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.701960802078,0.701960802078,0.701960802078,1],"e":[0.952941236309,0.36862745098,0.196078446332,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.952941236309,0.36862745098,0.196078446332,1],"e":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.964705942191,0.513725490196,0.188235309077,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.964705942191,0.513725490196,0.188235309077,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":27.0000010997325}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-35,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.952941179276,0.368627458811,0.196078434587,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":10.0000004073083}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-2,"s":[0.600000023842,0.600000023842,0.600000023842,1],"e":[0.952941179276,0.368627458811,0.196078434587,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":4,"s":[0.952941179276,0.368627458811,0.196078434587,1],"e":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":10.0000004073083}],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":30.0000012219251,"st":-45.0000018328876,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"button start connecting","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"connecting loop","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":78.0000031770051,"op":120.0000048877,"st":78.0000031770051,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"connecting to active","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":120.0000048877,"op":150.000006109625,"st":120.0000048877,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"button activate","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":150.000006109625,"op":310.000012626559,"st":150.000006109625,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"connecting to active 2","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.5,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128.5,128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":257,"h":256,"ip":310.000012626559,"op":340.000013848484,"st":310.000012626559,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/NetBird/Source/animations/button-start-connecting.json b/NetBird/Source/animations/button-start-connecting.json new file mode 100644 index 0000000..c633564 --- /dev/null +++ b/NetBird/Source/animations/button-start-connecting.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":78.0000031770051,"w":257,"h":256,"nm":"button start connecting","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.533,124.035,0],"ix":2,"l":2},"a":{"a":0,"k":[45.597,36.157,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-23.672,7.566],[0.27,32.965],[12.953,11.002],[0.272,32.965],[-38.337,32.965]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-10.95,1.012],[0,0],[0,0],[10.108,4.897],[0,0],[0,0],[-0.064,0.134]],"o":[[2.06,-3.18],[0,0],[0,0],[-2.004,-17.157],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.332,-22.468],[12.114,-32.965],[38.337,-32.965],[12.953,11.002],[-7.521,-20.408],[-7.375,-20.66],[-7.364,-20.641],[-7.258,-20.865]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":45.0000018328876,"s":[0.964705944061,0.51372551918,0.1882353127,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.608,39.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.108,4.897],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-2.003,-17.158]],"v":[[-2.162,-26.687],[-18.312,1.287],[5.63,26.687],[18.312,4.723]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.701960802078,0.701960802078,0.701960802078,1]},{"t":45.0000018328876,"s":[0.952941236309,0.36862745098,0.196078446332,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.248,45.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-5.791,-49.891]],"o":[[0,0],[0,0],[0,0]],"v":[[19.97,35.907],[-32.659,-19.927],[32.659,13.984]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0.600000023842,0.600000023842,0.600000023842,1]},{"t":45.0000018328876,"s":[0.964705942191,0.513725490196,0.188235309077,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.909,36.157],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019610882,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128,128,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[105.052,105.052,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[256,256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827450990677,0.827450990677,0.827450990677,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[69.593,69.593],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[104.105,104.105,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-53.63,0],[0,-53.63],[53.63,0],[0,53.63]],"o":[[53.63,0],[0,53.63],[-53.63,0],[0,-53.63]],"v":[[0,-97.105],[97.105,0],[0,97.105],[-97.105,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.105,104.105],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 6 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[116.664,116.664,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-64.432,0],[0,-64.432],[64.432,0],[0,64.432]],"o":[[64.432,0],[0,64.432],[-64.432,0],[0,-64.432]],"v":[[0,-116.664],[116.664,0],[0,116.664],[-116.664,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.600000023842,0.600000023842,0.600000023842,1],"ix":4},"o":{"a":0,"k":23,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.664,116.664],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 7 Outlines 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.534],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":87,"s":[0]},{"t":88.0000035843135,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[128.75,128,0],"ix":2,"l":2},"a":{"a":0,"k":[128,128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":44,"s":[100,100,100]},{"i":{"x":[0.534,0.534,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":45,"s":[78,78,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":84,"s":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":87,"s":[100,100,100]},{"t":88.0000035843135,"s":[78,78,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-70.416,0],[0,-70.416],[70.416,0],[0,70.416]],"o":[[70.416,0],[0,70.416],[-70.416,0],[0,-70.416]],"v":[[0,-127.5],[127.5,0],[0,127.5],[-127.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[128,128],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":78.0000031770051,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/NetBird/Source/animations/loading.json b/NetBird/Source/animations/loading.json new file mode 100644 index 0000000..909ea4f --- /dev/null +++ b/NetBird/Source/animations/loading.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":120.0000048877,"w":24,"h":24,"nm":"loading","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[12,12,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[75.141,75.141],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.533],"y":[1]},"o":{"x":[0.387],"y":[0]},"t":25,"s":[0],"e":[100]},{"t":118.000004806239}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0],"e":[100]},{"t":104.000004236007}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[720]},{"t":119.000004846969}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":120.0000048877,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/NetBird/Source/animations/logo_NetBird.json b/NetBird/Source/animations/logo_NetBird.json new file mode 100644 index 0000000..ec54faf --- /dev/null +++ b/NetBird/Source/animations/logo_NetBird.json @@ -0,0 +1 @@ +{"v":"5.9.0","fr":29.9700012207031,"ip":0,"op":160.000006516934,"w":200,"h":50,"nm":"netbird-logo","ddd":0,"assets":[{"id":"comp_0","nm":"logo","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[23.581,31.102,0],"ix":2,"l":2},"a":{"a":0,"k":[9.438,13.772,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0.003,0.295],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.02,0.255]],"v":[[9.165,2.353],[3.187,13.402],[2.825,13.522],[9.188,2.393]],"c":true}],"e":[{"i":[[4.227,2.117],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.841,-7.202]],"v":[[-2.252,-8.751],[-7.126,2.777],[2.825,13.522],[9.188,2.393]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[{"i":[[4.227,2.117],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.841,-7.202]],"v":[[-2.252,-8.751],[-7.126,2.777],[2.825,13.522],[9.188,2.393]],"c":true}],"e":[{"i":[[5.072,2.481],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-1.005,-8.694]],"v":[[-1.085,-13.522],[-9.188,0.652],[2.825,13.522],[9.188,2.393]],"c":true}]},{"t":26.0000010590017}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952941236309,0.36862745098,0.196078446332,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.438,13.772],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10.0000004073083,"op":1370.00005580124,"st":10.0000004073083,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 4 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[16.387,26.43,0],"ix":2,"l":2},"a":{"a":0,"k":[16.636,18.444,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0],[-0.398,-0.141]],"o":[[0,0],[0,0],[0,0]],"v":[[10.02,18.194],[10.364,18.028],[16.387,7.086]],"c":true}],"e":[{"i":[[0,0],[0,0],[-2.906,-25.28]],"o":[[0,0],[0,0],[0,0]],"v":[[10.02,18.194],[-16.387,-10.097],[16.387,7.086]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[{"i":[[0,0],[0,0],[-2.906,-25.28]],"o":[[0,0],[0,0],[0,0]],"v":[[10.02,18.194],[-16.387,-10.097],[16.387,7.086]],"c":true}],"e":[{"i":[[0,0],[0,0],[-4.773,-23.141]],"o":[[0,0],[0,0],[0,0]],"v":[[-1.856,5.319],[-15.137,-16.472],[16.387,7.086]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[0,0],[-4.773,-23.141]],"o":[[0,0],[0,0],[0,0]],"v":[[-1.856,5.319],[-15.137,-16.472],[16.387,7.086]],"c":true}],"e":[{"i":[[0,0],[0,0],[-2.906,-25.28]],"o":[[0,0],[0,0],[0,0]],"v":[[-1.731,5.694],[-16.387,-10.097],[16.387,7.086]],"c":true}]},{"t":37.0000015070409}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.636,18.444],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10.0000004073083,"op":1370.00005580124,"st":10.0000004073083,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[26.27,27.921,0],"ix":2,"l":2},"a":{"a":0,"k":[19.486,16.953,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[{"i":[[0,0],[1.033,-1.612],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-5.494,0.513],[0,0],[-0.032,0.067],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.672,-0.954],[-11.927,4.365],[-12.391,5.178],[-12.445,5.29],[-12.451,5.281],[-12.861,6.453],[6.511,6.453],[10.486,-0.954]],"c":true}],"e":[{"i":[[0,0],[1.033,-1.612],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-5.494,0.513],[0,0],[-0.032,0.067],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[8.62,-22.079],[-0.635,-16.76],[-5.725,-6.822],[-5.778,-6.71],[-5.784,-6.719],[-20.593,19.513],[-1.221,19.513],[21.777,-22.079]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[{"i":[[0,0],[1.033,-1.612],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-5.494,0.513],[0,0],[-0.032,0.067],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[8.62,-22.079],[-0.635,-16.76],[-5.725,-6.822],[-5.778,-6.71],[-5.784,-6.719],[-20.593,19.513],[-1.221,19.513],[21.777,-22.079]],"c":true}],"e":[{"i":[[0,0],[1.033,-1.612],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[-5.494,0.513],[0,0],[-0.032,0.067],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.079,-16.704],[-3.176,-11.385],[-3.641,-10.572],[-3.695,-10.46],[-3.701,-10.469],[-19.236,16.704],[0.137,16.704],[19.236,-16.704]],"c":true}]},{"t":22.0000008960784}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.964705942191,0.513725490196,0.188235309077,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.486,16.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1360.00005539394,"st":0,"bm":0}]},{"id":"comp_1","nm":"tipo","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 5 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[126.163,31.338,0],"ix":2,"l":2},"a":{"a":0,"k":[74.084,16.935,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,1.791],[0.716,1.33],[1.23,0.693],[1.459,0],[1.202,-0.693],[0.715,-1.329],[0,-1.792],[-0.716,-1.358],[-1.202,-0.722],[-1.459,0],[-1.201,0.693],[-0.715,1.329]],"o":[[0,-1.791],[-0.715,-1.329],[-1.201,-0.723],[-1.459,0],[-1.202,0.694],[-0.716,1.329],[0,1.82],[0.715,1.329],[1.202,0.693],[1.459,0],[1.23,-0.722],[0.716,-1.358]],"v":[[7.982,3.922],[6.909,-0.759],[3.991,-3.792],[0,-4.876],[-3.991,-3.836],[-6.866,-0.802],[-7.939,3.879],[-6.866,8.646],[-3.991,11.723],[0,12.763],[3.991,11.723],[6.909,8.646]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,2.398],[-0.973,1.82],[-1.688,1.011],[-2.118,0],[-1.573,-0.867],[-0.829,-1.387],[0,0],[0,0],[0,0],[0,0],[0,0],[1.516,-0.925],[2.031,0],[1.717,1.04],[0.973,1.878]],"o":[[0,-2.427],[0.973,-1.849],[1.717,-1.012],[1.831,0],[1.574,0.838],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.772,1.416],[-1.516,0.895],[-2.089,0],[-1.688,-1.04],[-0.973,-1.878]],"v":[[-11.93,3.879],[-10.471,-2.492],[-6.48,-6.782],[-0.729,-8.299],[4.377,-6.999],[7.982,-3.662],[7.982,-16.23],[11.93,-16.23],[11.93,15.84],[7.982,15.84],[7.982,11.376],[4.549,14.887],[-0.772,16.23],[-6.48,14.67],[-10.471,10.293]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.987,17.39],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.259,0.751],[-1.831,0],[0,0],[0,0],[0,-4.796],[0,0],[0,0],[0,0],[0,0]],"o":[[0.686,-1.358],[1.287,-0.751],[0,0],[0,0],[-4.378,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.845,-7.801],[1.073,-10.965],[5.751,-12.092],[5.751,-8.018],[4.721,-8.018],[-1.845,-0.824],[-1.845,12.092],[-5.751,12.092],[-5.751,-11.658],[-1.845,-11.658]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.258,21.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.932,16.49],[-1.975,16.49],[-1.975,-7.259],[1.932,-7.259]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0]],"o":[[0,0]],"v":[[1.932,-7.259]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0.716,0],[0.515,0.52],[0,0.751],[-0.515,0.52],[-0.743,0],[-0.487,-0.52],[0,-0.751],[0.515,-0.52]],"o":[[-0.743,0],[-0.515,-0.52],[0,-0.751],[0.515,-0.52],[0.716,0],[0.515,0.52],[0,0.751],[-0.487,0.52]],"v":[[0.042,-11.116],[-1.846,-11.896],[-2.618,-13.803],[-1.846,-15.71],[0.042,-16.49],[1.846,-15.71],[2.618,-13.803],[1.846,-11.896]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[100.92,16.74],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":5,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,1.82],[0.715,1.328],[1.23,0.693],[1.459,0],[1.23,-0.722],[0.744,-1.358],[0,-1.762],[-0.715,-1.358],[-1.202,-0.722],[-1.431,0],[-1.202,0.694],[-0.715,1.329]],"o":[[0,-1.791],[-0.715,-1.33],[-1.202,-0.694],[-1.431,0],[-1.202,0.694],[-0.715,1.329],[0,1.792],[0.744,1.329],[1.23,0.694],[1.459,0],[1.23,-0.722],[0.715,-1.358]],"v":[[7.939,3.879],[6.866,-0.801],[3.948,-3.835],[-0.043,-4.875],[-4.034,-3.792],[-6.953,-0.715],[-8.025,3.922],[-6.953,8.646],[-4.034,11.723],[-0.043,12.763],[3.948,11.723],[6.866,8.646]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[-1.545,0.896],[-1.974,0],[-1.688,-1.011],[-0.973,-1.849],[0,-2.427],[0.973,-1.878],[1.717,-1.04],[2.089,0],[1.545,0.896],[0.772,1.387],[0,0],[0,0],[0,0],[0,0]],"o":[[0.801,-1.416],[1.545,-0.895],[2.117,0],[1.688,1.011],[0.973,1.82],[0,2.398],[-0.973,1.878],[-1.688,1.04],[-2.031,0],[-1.517,-0.896],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.025,-3.488],[-4.506,-6.956],[0.772,-8.299],[6.48,-6.782],[10.471,-2.492],[11.93,3.879],[10.471,10.293],[6.437,14.67],[0.772,16.23],[-4.592,14.887],[-8.025,11.463],[-8.025,15.84],[-11.931,15.84],[-11.931,-16.23],[-8.025,-16.23]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[81.875,17.39],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.486,-0.491],[-1.201,0],[0,0],[0,0],[0,0],[1.087,1.011],[0,2.312],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,1.156],[0.487,0.463],[0,0],[0,0],[0,0],[-2.175,0],[-1.087,-1.011],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.408,-5.634],[0.408,8.364],[1.137,10.834],[3.669,11.528],[6.544,11.528],[6.544,14.865],[3.025,14.865],[-1.867,13.348],[-3.499,8.364],[-3.499,-5.634],[-6.544,-5.634],[-6.544,-8.884],[-3.499,-8.884],[-3.499,-14.865],[0.408,-14.865],[0.408,-8.884],[6.544,-8.884],[6.544,-5.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[58.669,18.365],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.658,1.069],[1.145,0.549],[1.373,0],[1.402,-1.272],[0.201,-2.254]],"o":[[0,-1.502],[-0.658,-1.098],[-1.115,-0.578],[-1.974,0],[-1.374,1.271],[0,0]],"v":[[7.424,-1.734],[6.438,-5.59],[3.734,-8.061],[0.001,-8.928],[-5.064,-7.02],[-7.424,-1.734]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,-2.166],[0.085,-0.838],[0,0],[-1.431,-1.329],[-2.06,0],[-1.116,0.78],[-0.457,1.329],[0,0],[1.889,-1.445],[2.804,0],[1.774,1.012],[1.002,1.849],[0,2.456],[-0.972,1.849],[-1.745,0.982],[-2.288,0],[-1.717,-0.982],[-0.916,-1.733]],"o":[[0,0.752],[0,0],[0.144,2.34],[1.459,1.3],[1.688,0],[1.144,-0.809],[0,0],[-0.629,2.282],[-1.888,1.415],[-2.231,0],[-1.745,-1.011],[-1.001,-1.878],[0,-2.456],[0.973,-1.849],[1.774,-1.012],[2.232,0],[1.716,0.983],[0.944,1.705]],"v":[[11.458,-0.911],[11.331,1.473],[-7.467,1.473],[-5.107,6.978],[0.171,8.928],[4.378,7.758],[6.781,4.551],[10.986,4.551],[7.21,10.141],[0.171,12.264],[-5.837,10.747],[-9.956,6.458],[-11.458,-0.044],[-9.999,-6.501],[-5.923,-10.747],[0.171,-12.264],[6.094,-10.792],[10.042,-6.717]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.699,21.355],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.602,0],[-1.773,-1.763],[0,-3.294],[0,0],[0,0],[0,0],[1.173,1.242],[2.031,0],[1.231,-1.3],[0,-2.485],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.316,0.664]],"o":[[2.861,0],[1.774,1.733],[0,0],[0,0],[0,0],[0,-2.369],[-1.173,-1.272],[-2.06,0],[-1.201,1.3],[0,0],[0,0],[0,0],[0,0],[0,0],[0.772,-1.214],[1.344,-0.665]],"v":[[0.923,-12.092],[7.874,-9.447],[10.535,-1.906],[10.535,12.092],[6.673,12.092],[6.673,-1.344],[4.913,-6.76],[0.107,-8.667],[-4.829,-6.717],[-6.63,-1.04],[-6.63,12.092],[-10.535,12.092],[-10.535,-11.659],[-6.63,-11.659],[-6.63,-8.277],[-3.497,-11.094]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.301960784314,0.301960784314,0.301960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[10.785,21.139],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":160.000006516934,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"logo","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[-44],"e":[0]},{"t":18.000000733155}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[105,25,0],"e":[30,25,0],"to":[-12.5,0,0],"ti":[12.5,0,0]},{"t":37.0000015070409}],"ix":2,"l":2},"a":{"a":0,"k":[25,25,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[6,6,100],"e":[100,100,100]},{"t":21.0000008553475}],"ix":6,"l":2}},"ao":0,"w":50,"h":50,"ip":0,"op":1360.00005539394,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"tipo","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[-5.5,25,0],"e":[5,25,0],"to":[1.75,0,0],"ti":[-17.583,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":29,"s":[5,25,0],"e":[100,25,0],"to":[17.583,0,0],"ti":[-15.833,0,0]},{"t":37.0000015070409}],"ix":2,"l":2},"a":{"a":0,"k":[100,25,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[303,-7.5],[205.5,-7],[205.5,56.5],[303,56]],"c":true}],"e":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[303,-7.5],[47,-7],[47,56.5],[303,56]],"c":true}]},{"t":37.0000015070409}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"}],"w":200,"h":50,"ip":0,"op":160.000006516934,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/NetbirdKit/ClientState.swift b/NetbirdKit/ClientState.swift new file mode 100644 index 0000000..3de0c9b --- /dev/null +++ b/NetbirdKit/ClientState.swift @@ -0,0 +1,27 @@ +// +// ClientState.swift +// NetBird +// +// Created by Pascal Fischer on 09.11.23. +// + +enum ClientState: Codable, CustomStringConvertible { + case connected + case connecting + case disconnected + case disconnecting + + var description: String { + switch self { + case .connected: + return "Connected" + case .connecting: + return "Connecting..." + case .disconnected: + return "Disconnected" + case .disconnecting: + return "Disconnecting..." + + } + } +} diff --git a/NetbirdKit/ConnectionListener.swift b/NetbirdKit/ConnectionListener.swift new file mode 100644 index 0000000..8fff1f7 --- /dev/null +++ b/NetbirdKit/ConnectionListener.swift @@ -0,0 +1,46 @@ +// +// ConnectionListener.swift +// NetBird +// +// Created by Pascal Fischer on 09.11.23. +// + +import Foundation + +class ConnectionListener: NSObject, NetBirdSDKConnectionListenerProtocol { + + var completionHandler: (Error?) -> Void + + var adapter: NetBirdAdapter + + init(adapter: NetBirdAdapter, completionHandler: @escaping (Error?) -> Void) { + self.completionHandler = completionHandler + self.adapter = adapter + } + + func onAddressChanged(_ p0: String?, p1: String?) { + // do nothing + } + + func onConnected() { + adapter.clientState = .connected + self.completionHandler(nil) + } + + func onConnecting() { + adapter.clientState = .connecting + } + + func onDisconnected() { + adapter.clientState = .disconnected + } + + func onDisconnecting() { + adapter.clientState = .disconnecting + } + + func onPeersListChanged(_ p0: Int) { + // do nothing + } + +} diff --git a/NetbirdKit/DNSManager.swift b/NetbirdKit/DNSManager.swift new file mode 100644 index 0000000..c5e67e9 --- /dev/null +++ b/NetbirdKit/DNSManager.swift @@ -0,0 +1,50 @@ +// +// DNSHostManager.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 06.10.23. +// + +import Foundation + +struct DomainConfig: Codable { + var disabled: Bool + var domain: String + var matchOnly: Bool +} + +struct HostDNSConfig: Codable { + var domains: [DomainConfig] + var routeAll: Bool + var serverIP: String + var serverPort: Int +} + +class DNSManager: NSObject, NetBirdSDKDnsManagerProtocol { + + private weak var tunnelManager: PacketTunnelProviderSettingsManager? + + init(with tunnelManager: PacketTunnelProviderSettingsManager) { + self.tunnelManager = tunnelManager + } + + func applyDns(_ p0: String?) { + if let p0 = p0, !p0.isEmpty { + if let config = parseDNSSettingsString(inputString: p0) { + self.tunnelManager?.setDNS(config: config) + } + } + } + + func parseDNSSettingsString(inputString: String) -> HostDNSConfig? { + guard let jsonData = inputString.data(using: .utf8) else { return nil } + do { + let config = try JSONDecoder().decode(HostDNSConfig.self, from: jsonData) + return config + } catch { + print(error) + } + return nil + } + +} diff --git a/NetbirdKit/Device.swift b/NetbirdKit/Device.swift new file mode 100644 index 0000000..863222f --- /dev/null +++ b/NetbirdKit/Device.swift @@ -0,0 +1,22 @@ +// +// Device.swift +// GoLibTest +// +// Created by Volodymyr Nazarkevych on 28.06.2023. +// + +import UIKit + +class Device { + static func getName() -> String { + return UIDevice.current.name + } + + static func getOsVersion() -> String { + return UIDevice.current.systemVersion + } + + static func getOsName() -> String { + return UIDevice.current.systemName + } +} diff --git a/NetbirdKit/NetworkChangeListener.swift b/NetbirdKit/NetworkChangeListener.swift new file mode 100644 index 0000000..85267ef --- /dev/null +++ b/NetbirdKit/NetworkChangeListener.swift @@ -0,0 +1,92 @@ +// +// RouteNotifier.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 03.08.23. +// + + +import Foundation +import NetBirdSDK +import NetworkExtension +import os + + +class NetworkChangeListener: NSObject, NetBirdSDKNetworkChangeListenerProtocol { + func onNetworkChanged(_ p0: String?) { + let routes = parseRoutesToNESettings(routesString: p0!) + tunnelManager?.setRoutes(routes: routes) + } + + private weak var tunnelManager: PacketTunnelProviderSettingsManager? + + var interfaceIP: String? + + init(with tunnelManager: PacketTunnelProviderSettingsManager) { + self.tunnelManager = tunnelManager + } + + func setInterfaceIP(_ p0: String?) { + self.interfaceIP = p0! + tunnelManager?.setInterfaceIP(interfaceIP: p0!) + } + + func parseRoutesToNESettings(routesString: String) -> [NEIPv4Route] { + var neRoutes : [NEIPv4Route] = [] + + let routes = routesString.split(separator: ",") + for route in routes { + neRoutes.append(createIPv4RouteFromCIDR(cidr: String(route))) + } + if interfaceIP != nil { + neRoutes.append(createIPv4RouteFromCIDR(cidr: self.interfaceIP!)) + } + return neRoutes + } + + func createIPv4RouteFromCIDR(cidr: String) -> NEIPv4Route { + let (ipAddress, subnetMask) = extractIPAddressAndSubnet(from: cidr)! + let destinationAddress = subtractSubnetMask(from: ipAddress, subnetMask: subnetMask) + return NEIPv4Route(destinationAddress: destinationAddress!, subnetMask: subnetMask) + } + +} + +func extractIPAddressAndSubnet(from cidr: String) -> (String, String)? { + let components = cidr.components(separatedBy: "/") + + guard components.count == 2, + let ipAddress = components.first, + var subnetPrefix = Int(components[1]), + subnetPrefix >= 0 && subnetPrefix <= 32 else { + return nil + } + + var subnetMask = "" + for i in 0..<4 { + let bits = min(subnetPrefix, 8) + let octet = 255 & (255 << (8 - bits)) + subnetMask += "\(octet)" + if i < 3 { + subnetMask += "." + } + subnetPrefix -= bits + } + + return (ipAddress, subnetMask) +} + +func subtractSubnetMask(from ipAddress: String, subnetMask: String) -> String? { + let ipAddressComponents = ipAddress.split(separator: ".").compactMap { UInt32($0) } + let subnetMaskComponents = subnetMask.split(separator: ".").compactMap { UInt32($0) } + + guard ipAddressComponents.count == 4 && subnetMaskComponents.count == 4 else { + return nil + } + + let networkAddressComponents = zip(ipAddressComponents, subnetMaskComponents).map { $0 & $1 } + + let networkAddress = networkAddressComponents.map { String($0) }.joined(separator: ".") + + return networkAddress +} diff --git a/NetbirdKit/NetworkExtensionAdapter.swift b/NetbirdKit/NetworkExtensionAdapter.swift new file mode 100644 index 0000000..1c2c26e --- /dev/null +++ b/NetbirdKit/NetworkExtensionAdapter.swift @@ -0,0 +1,217 @@ +// +// NetworkExtensionAdapter.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 02.10.23. +// + +import Foundation +import NetworkExtension +import SwiftUI + +public class NetworkExtensionAdapter: ObservableObject { + + var session : NETunnelProviderSession? + var vpnManager: NETunnelProviderManager? + + var extensionID = "io.netbird.app.NetbirdNetworkExtension" + var extensionName = "NetBird Network Extension" + + let decoder = PropertyListDecoder() + + @Published var timer : Timer + + @Published var showBrowser = false + @Published var loginURL : String? + + init() { + self.timer = Timer() + self.timer.invalidate() + Task { + do { + try await self.configureManager() + } catch { + print("Failed to configure manager") + } + } + } + + deinit { + self.timer.invalidate() + } + + func start() async { + do { + try await configureManager() + print("extension configured") + await loginIfRequired() + } catch { + print("Failed to start extension: \(error)") + } + } + + private func configureManager() async throws { + let managers = try await NETunnelProviderManager.loadAllFromPreferences() + if let manager = managers.first(where: { $0.localizedDescription == self.extensionName }) { + self.vpnManager = manager + } else { + let newManager = createNewManager() + try await newManager.saveToPreferences() + self.vpnManager = newManager + } + self.vpnManager?.isEnabled = true + try await self.vpnManager?.saveToPreferences() + try await self.vpnManager?.loadFromPreferences() + self.session = self.vpnManager?.connection as? NETunnelProviderSession + } + + private func createNewManager() -> NETunnelProviderManager { + let tunnelProviderProtocol = NETunnelProviderProtocol() + tunnelProviderProtocol.providerBundleIdentifier = self.extensionID + tunnelProviderProtocol.serverAddress = "multiple endpoints" + + let newManager = NETunnelProviderManager() + newManager.protocolConfiguration = tunnelProviderProtocol + newManager.localizedDescription = self.extensionName + newManager.isEnabled = true + + return newManager + } + + + + public func loginIfRequired() async { + if self.isLoginRequired() { + print("require login") + + await performLogin() + } else { + startVPNConnection() + } + + print("will start vpn connection") + } + + public func isLoginRequired() -> Bool { + guard let client = NetBirdSDKNewClient(Preferences.configFile(), Device.getName(), Device.getOsVersion(), Device.getOsName(), nil, nil) else { + print("Failed to initialize client") + return true + } + return client.isLoginRequired() + } + + class ObserverBox { + var observer: NSObjectProtocol? + } + + private func performLogin() async { + let loginURLString = await withCheckedContinuation { continuation in + self.login { urlString in + print("urlstring: \(urlString)") + continuation.resume(returning: urlString) + } + } + + self.loginURL = loginURLString + self.showBrowser = true + } + + public func startVPNConnection() { + print("starting tunnel") + do { + try self.session?.startVPNTunnel() + print("VPN Tunnel started.") + } catch let error { + print("Failed to start VPN tunnel: \(error)") + } + } + + + func stop() -> Void { + self.vpnManager?.connection.stopVPNTunnel() + } + + func login(completion: @escaping (String) -> Void) { + if self.session == nil { + print("No session available for login") + return + } + + do { + let messageString = "Login" + if let messageData = messageString.data(using: .utf8) { + // Send the message to the network extension + try self.session!.sendProviderMessage(messageData) { response in + if let response = response { + if let string = String(data: response, encoding: .utf8) { + completion(string) + return + } + } + } + } else { + print("Error converting message to Data") + } + } catch { + print("error when performing network extension action") + } + } + + func fetchData(completion: @escaping (StatusDetails) -> Void) { + guard let session = self.session else { + let defaultStatus = StatusDetails(ip: "", fqdn: "", managementStatus: .disconnected, peerInfo: []) + completion(defaultStatus) + return + } + + let messageString = "Status" + if let messageData = messageString.data(using: .utf8) { + do { + try session.sendProviderMessage(messageData) { response in + if let response = response { + do { + let decodedStatus = try self.decoder.decode(StatusDetails.self, from: response) + completion(decodedStatus) + return + } catch { + print("Failed to decode status details.") + } + } else { + let defaultStatus = StatusDetails(ip: "", fqdn: "", managementStatus: .disconnected, peerInfo: []) + completion(defaultStatus) + return + } + } + } catch { + print("Failed to send Provider message") + } + } else { + print("Error converting message to Data") + } + } + + func startTimer(completion: @escaping (StatusDetails) -> Void) { + self.timer.invalidate() + self.fetchData(completion: completion) + self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { _ in + self.fetchData(completion: completion) + }) + } + + func stopTimer() { + self.timer.invalidate() + } + + func getExtensionStatus(completion: @escaping (NEVPNStatus) -> Void) { + Task { + do { + let managers = try await NETunnelProviderManager.loadAllFromPreferences() + if let manager = managers.first(where: { $0.localizedDescription == self.extensionName }) { + completion(manager.connection.status) + } + } catch { + print("Error loading from preferences: \(error)") + } + } + } +} diff --git a/NetbirdKit/Preferences.swift b/NetbirdKit/Preferences.swift new file mode 100644 index 0000000..f434e46 --- /dev/null +++ b/NetbirdKit/Preferences.swift @@ -0,0 +1,23 @@ +// +// Preferences.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 03.08.23. +// + +import Foundation +import NetBirdSDK + +class Preferences { + static func newPreferences() -> NetBirdSDKPreferences { + return NetBirdSDKNewPreferences(configFile())! + } + + static func configFile() -> String { + let fileManager = FileManager.default + let groupURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.io.netbird.app") + let logURL = groupURL?.appendingPathComponent("netbird.cfg") + return logURL!.relativePath + } + +} diff --git a/NetbirdKit/StatusDetails.swift b/NetbirdKit/StatusDetails.swift new file mode 100644 index 0000000..538e0f6 --- /dev/null +++ b/NetbirdKit/StatusDetails.swift @@ -0,0 +1,22 @@ +// +// StatusDetails.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 10.10.23. +// + +import Foundation + +struct StatusDetails: Codable { + var ip: String + var fqdn: String + var managementStatus: ClientState + var peerInfo: [PeerInfo] +} + +struct PeerInfo: Codable, Identifiable, Equatable { + var id = UUID() + var ip: String + var fqdn: String + var connStatus: String +} diff --git a/NetbirdNetworkExtension/Info.plist b/NetbirdNetworkExtension/Info.plist new file mode 100644 index 0000000..1f39ed3 --- /dev/null +++ b/NetbirdNetworkExtension/Info.plist @@ -0,0 +1,15 @@ + + + + + FirebaseAppGroup + group.io.netbird.app + NSExtension + + NSExtensionPointIdentifier + com.apple.networkextension.packet-tunnel + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).PacketTunnelProvider + + + diff --git a/NetbirdNetworkExtension/NetBirdAdapter.swift b/NetbirdNetworkExtension/NetBirdAdapter.swift new file mode 100644 index 0000000..36f40cd --- /dev/null +++ b/NetbirdNetworkExtension/NetBirdAdapter.swift @@ -0,0 +1,124 @@ +// +// NetBirdAdapter.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 08.08.23. +// + +import Foundation +import NetworkExtension +import NetBirdSDK +import os + +public class NetBirdAdapter { + + /// Packet tunnel provider. + private weak var packetTunnelProvider: PacketTunnelProvider? + + private weak var tunnelManager: PacketTunnelProviderSettingsManager? + + public let client : NetBirdSDKClient + private let networkChangeListener : NetworkChangeListener + private let dnsManager: DNSManager + + public var isExecutingLogin = false + + var clientState : ClientState = .disconnected + + /// Tunnel device file descriptor. + public var tunnelFileDescriptor: Int32? { + var ctlInfo = ctl_info() + withUnsafeMutablePointer(to: &ctlInfo.ctl_name) { + $0.withMemoryRebound(to: CChar.self, capacity: MemoryLayout.size(ofValue: $0.pointee)) { + _ = strcpy($0, "com.apple.net.utun_control") + } + } + for fd: Int32 in 0...1024 { + var addr = sockaddr_ctl() + var ret: Int32 = -1 + var len = socklen_t(MemoryLayout.size(ofValue: addr)) + withUnsafeMutablePointer(to: &addr) { + $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { + ret = getpeername(fd, $0, &len) + } + } + if ret != 0 || addr.sc_family != AF_SYSTEM { + continue + } + if ctlInfo.ctl_id == 0 { + ret = ioctl(fd, CTLIOCGINFO, &ctlInfo) + if ret != 0 { + continue + } + } + if addr.sc_id == ctlInfo.ctl_id { + return fd + } + } + return nil + } + + // MARK: - Initialization + + /// Designated initializer. + /// - Parameter packetTunnelProvider: an instance of `NEPacketTunnelProvider`. Internally stored + /// as a weak reference. + init(with tunnelManager: PacketTunnelProviderSettingsManager) { + self.tunnelManager = tunnelManager + self.networkChangeListener = NetworkChangeListener(with: tunnelManager) + self.dnsManager = DNSManager(with: tunnelManager) + self.client = NetBirdSDKNewClient(Preferences.configFile(), Device.getName(), Device.getOsVersion(), Device.getOsName(), self.networkChangeListener, self.dnsManager)! + } + + /// Returns the tunnel device interface name, or nil on error. + /// - Returns: String. + public var interfaceName: String? { + guard let tunnelFileDescriptor = self.tunnelFileDescriptor else { return nil } + + var buffer = [UInt8](repeating: 0, count: Int(IFNAMSIZ)) + + return buffer.withUnsafeMutableBufferPointer { mutableBufferPointer in + guard let baseAddress = mutableBufferPointer.baseAddress else { return nil } + + var ifnameSize = socklen_t(IFNAMSIZ) + let result = getsockopt( + tunnelFileDescriptor, + 2 /* SYSPROTO_CONTROL */, + 2 /* UTUN_OPT_IFNAME */, + baseAddress, + &ifnameSize) + + if result == 0 { + return String(cString: baseAddress) + } else { + return nil + } + } + } + + public func start(completionHandler: @escaping (Error?) -> Void) { + DispatchQueue.global().async { + do { + let connectionListener = ConnectionListener(adapter: self, completionHandler: completionHandler) + self.client.setConnectionListener(connectionListener) + try self.client.run(self.tunnelFileDescriptor ?? 0, interfaceName: self.interfaceName) + } catch { + completionHandler(NSError(domain: "io.netbird.NetbirdNetworkExtension", code: 1001, userInfo: [NSLocalizedDescriptionKey: "Netbird client startup failed."])) + self.stop() + } + } + } + + public func needsLogin() -> Bool { + return self.client.isLoginRequired() + } + + public func login() -> String { + self.isExecutingLogin = true + return self.client.loginForMobile() + } + + public func stop() { + self.client.stop() + } +} diff --git a/NetbirdNetworkExtension/NetbirdNetworkExtension.entitlements b/NetbirdNetworkExtension/NetbirdNetworkExtension.entitlements new file mode 100644 index 0000000..476b633 --- /dev/null +++ b/NetbirdNetworkExtension/NetbirdNetworkExtension.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.developer.networking.networkextension + + packet-tunnel-provider + + com.apple.security.application-groups + + group.io.netbird.app + + + diff --git a/NetbirdNetworkExtension/PacketTunnelProvider.swift b/NetbirdNetworkExtension/PacketTunnelProvider.swift new file mode 100644 index 0000000..b4e49ff --- /dev/null +++ b/NetbirdNetworkExtension/PacketTunnelProvider.swift @@ -0,0 +1,175 @@ +// +// PacketTunnelProvider.swift +// NetbirdNetworkExtension +// +// Created by Pascal Fischer on 06.08.23. +// + +import NetworkExtension +import os +import Firebase +import FirebaseCrashlytics +import FirebaseCore +import FirebasePerformance + + +class PacketTunnelProvider: NEPacketTunnelProvider { + + private lazy var tunnelManager: PacketTunnelProviderSettingsManager = { + return PacketTunnelProviderSettingsManager(with: self) + }() + + private lazy var adapter: NetBirdAdapter = { + return NetBirdAdapter(with: self.tunnelManager) + }() + + override init() { + initializeLogging() + } + + override func startTunnel(options: [String : NSObject]?, completionHandler: @escaping (Error?) -> Void) { + let options = FirebaseOptions(contentsOfFile: Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!) + FirebaseApp.configure(options: options!) + + if adapter.needsLogin() { + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + completionHandler(NSError(domain: "io.netbird.NetbirdNetworkExtension", code: 1001, userInfo: [NSLocalizedDescriptionKey: "Login required."])) + } + return + } + + adapter.start(completionHandler: completionHandler) + } + + override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { + adapter.stop() + DispatchQueue.main.asyncAfter(deadline: .now() + 2) { + completionHandler() + } + } + + override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) { + guard let completionHandler = completionHandler else { return } + + if let string = String(data: messageData, encoding: .utf8) { + switch string { + case "Login": + login(completionHandler: completionHandler) + case "Status": + getStatus(completionHandler: completionHandler) + default: + print("unknown message") + } + } + } + + func login(completionHandler: ((Data?) -> Void)) { + let url = adapter.login() + let data = url.data(using: .utf8) + completionHandler(data) + } + + func getStatus(completionHandler: ((Data?) -> Void)) { + let statusDetailsMessage = adapter.client.getStatusDetails() + var peerInfoArray: [PeerInfo] = [] + guard let statusDetailsMessage = statusDetailsMessage else { + print("Did not receive status details") + return + } + for i in 0.. Void) { + // Add code here to get ready to sleep. + completionHandler() + } + + override func wake() { + // Add code here to wake up. + } + + func setTunnelSettings(tunnelNetworkSettings: NEPacketTunnelNetworkSettings) { + setTunnelNetworkSettings(tunnelNetworkSettings) { error in + if let error = error { + // Handle Error + print("error when assigning routes") + return + } + print("Routes set") + } + } +} + +func initializeLogging() { + let fileManager = FileManager.default + + let groupURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.io.netbird.app") + let logURL = groupURL?.appendingPathComponent("logfile.log") + + var error: NSError? + var success = false + + let logMessage = "Starting new log file from extension" + "\n" + + guard let logURLValid = logURL else { + print("Failed to get the log file URL.") + return + } + + if fileManager.fileExists(atPath: logURLValid.path) { + // If the log file already exists, append the new message + if let fileHandle = try? FileHandle(forWritingTo: logURLValid) { + do { + try "".write(to: logURLValid, atomically: true, encoding: .utf8) + } catch { + print("Error handling the log file: \(error)") + } + if let data = logMessage.data(using: .utf8) { + fileHandle.write(data) + } + fileHandle.closeFile() + } else { + print("Failed to open the log file for writing.") + } + } else { + // If the log file doesn't exist, create and write the new message + do { + try logMessage.write(to: logURLValid, atomically: true, encoding: .utf8) + } catch { + print("Failed to write to the log file: \(error.localizedDescription)") + } + } + + if let logPath = logURL?.path { + + success = NetBirdSDKInitializeLog("DEBUG", logPath, &error) + } + if !success, let actualError = error { + print("Failed to initialize log: \(actualError.localizedDescription)") + } +} + diff --git a/NetbirdNetworkExtension/PacketTunnelProviderSettingsManager.swift b/NetbirdNetworkExtension/PacketTunnelProviderSettingsManager.swift new file mode 100644 index 0000000..1ae50c1 --- /dev/null +++ b/NetbirdNetworkExtension/PacketTunnelProviderSettingsManager.swift @@ -0,0 +1,93 @@ +// +// PacketTunnelProviderSettingsManager.swift +// NetBirdiOS +// +// Created by Pascal Fischer on 06.10.23. +// + +import Foundation +import NetworkExtension + +class PacketTunnelProviderSettingsManager { + + private weak var packetTunnelProvider: PacketTunnelProvider? + + private var interfaceIP: String? + private var routes: [NEIPv4Route]? + private var dnsSettings: NEDNSSettings? + + init(with packetTunnelProvider: PacketTunnelProvider) { + self.packetTunnelProvider = packetTunnelProvider + } + + func setRoutes(routes: [NEIPv4Route]) { + self.routes = routes + self.updateTunnel() + } + + func setDNS(config: HostDNSConfig) { + let dnsSettings = NEDNSSettings(servers: [config.serverIP]) + if config.routeAll { + dnsSettings.matchDomains = [""] + } else { + var searchDomains: [String] = [] + var matchDomains: [String] = [] + for domain in config.domains { + if domain.disabled { + continue + } + matchDomains.append(domain.domain) + if !domain.matchOnly { + searchDomains.append(domain.domain) + } + } + dnsSettings.matchDomains = matchDomains + dnsSettings.searchDomains = searchDomains + } + self.dnsSettings = dnsSettings + self.updateTunnel() + } + + func setInterfaceIP(interfaceIP: String) { + self.interfaceIP = interfaceIP + } + + func getInterfaceIP() -> String? { + return self.interfaceIP + } + + private func updateTunnel() { + if let tunnelSettings = createTunnelSettings() { + self.packetTunnelProvider!.setTunnelSettings(tunnelNetworkSettings: tunnelSettings) + } else { + print("Failed to update tunnel") + } + } + + private func createTunnelSettings() -> NEPacketTunnelNetworkSettings? { + if let interfaceIP = interfaceIP { + if let (ipAddress, subnetMask) = extractIPAddressAndSubnet(from: interfaceIP) { + let tunnelNetworkSettings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: ipAddress) + let ipv4Settings = NEIPv4Settings(addresses: [ipAddress], subnetMasks: [subnetMask]) + + ipv4Settings.includedRoutes = [ NEIPv4Route(destinationAddress: ipAddress, subnetMask: subnetMask) ] + + if self.routes != nil { + ipv4Settings.includedRoutes = self.routes + } + tunnelNetworkSettings.ipv4Settings = ipv4Settings + + tunnelNetworkSettings.mtu = 1280 + + if self.dnsSettings != nil { + tunnelNetworkSettings.dnsSettings = self.dnsSettings + } + + return tunnelNetworkSettings + } + } + + return nil + } + +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..03fa40b --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# NetBird ios-client diff --git a/WireGuardKitC/WireGuardKitC.h b/WireGuardKitC/WireGuardKitC.h new file mode 100644 index 0000000..54e4783 --- /dev/null +++ b/WireGuardKitC/WireGuardKitC.h @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018-2023 WireGuard LLC. All Rights Reserved. + +#include "key.h" +#include "x25519.h" + +/* From */ +#define CTLIOCGINFO 0xc0644e03UL +struct ctl_info { + u_int32_t ctl_id; + char ctl_name[96]; +}; +struct sockaddr_ctl { + u_char sc_len; + u_char sc_family; + u_int16_t ss_sysaddr; + u_int32_t sc_id; + u_int32_t sc_unit; + u_int32_t sc_reserved[5]; +}; diff --git a/WireGuardKitC/key.c b/WireGuardKitC/key.c new file mode 100644 index 0000000..84e7f16 --- /dev/null +++ b/WireGuardKitC/key.c @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: MIT +/* + * Copyright (C) 2015-2019 Jason A. Donenfeld . All Rights Reserved. + * + * This is a specialized constant-time base64/hex implementation that resists side-channel attacks. + */ + +#include +#include "key.h" + +static inline void encode_base64(char dest[static 4], const uint8_t src[static 3]) +{ + const uint8_t input[] = { (src[0] >> 2) & 63, ((src[0] << 4) | (src[1] >> 4)) & 63, ((src[1] << 2) | (src[2] >> 6)) & 63, src[2] & 63 }; + + for (unsigned int i = 0; i < 4; ++i) + dest[i] = input[i] + 'A' + + (((25 - input[i]) >> 8) & 6) + - (((51 - input[i]) >> 8) & 75) + - (((61 - input[i]) >> 8) & 15) + + (((62 - input[i]) >> 8) & 3); + +} + +void key_to_base64(char base64[static WG_KEY_LEN_BASE64], const uint8_t key[static WG_KEY_LEN]) +{ + unsigned int i; + + for (i = 0; i < WG_KEY_LEN / 3; ++i) + encode_base64(&base64[i * 4], &key[i * 3]); + encode_base64(&base64[i * 4], (const uint8_t[]){ key[i * 3 + 0], key[i * 3 + 1], 0 }); + base64[WG_KEY_LEN_BASE64 - 2] = '='; + base64[WG_KEY_LEN_BASE64 - 1] = '\0'; +} + +static inline int decode_base64(const char src[static 4]) +{ + int val = 0; + + for (unsigned int i = 0; i < 4; ++i) + val |= (-1 + + ((((('A' - 1) - src[i]) & (src[i] - ('Z' + 1))) >> 8) & (src[i] - 64)) + + ((((('a' - 1) - src[i]) & (src[i] - ('z' + 1))) >> 8) & (src[i] - 70)) + + ((((('0' - 1) - src[i]) & (src[i] - ('9' + 1))) >> 8) & (src[i] + 5)) + + ((((('+' - 1) - src[i]) & (src[i] - ('+' + 1))) >> 8) & 63) + + ((((('/' - 1) - src[i]) & (src[i] - ('/' + 1))) >> 8) & 64) + ) << (18 - 6 * i); + return val; +} + +bool key_from_base64(uint8_t key[static WG_KEY_LEN], const char *base64) +{ + unsigned int i; + volatile uint8_t ret = 0; + int val; + + if (strlen(base64) != WG_KEY_LEN_BASE64 - 1 || base64[WG_KEY_LEN_BASE64 - 2] != '=') + return false; + + for (i = 0; i < WG_KEY_LEN / 3; ++i) { + val = decode_base64(&base64[i * 4]); + ret |= (uint32_t)val >> 31; + key[i * 3 + 0] = (val >> 16) & 0xff; + key[i * 3 + 1] = (val >> 8) & 0xff; + key[i * 3 + 2] = val & 0xff; + } + val = decode_base64((const char[]){ base64[i * 4 + 0], base64[i * 4 + 1], base64[i * 4 + 2], 'A' }); + ret |= ((uint32_t)val >> 31) | (val & 0xff); + key[i * 3 + 0] = (val >> 16) & 0xff; + key[i * 3 + 1] = (val >> 8) & 0xff; + + return 1 & ((ret - 1) >> 8); +} + +void key_to_hex(char hex[static WG_KEY_LEN_HEX], const uint8_t key[static WG_KEY_LEN]) +{ + unsigned int i; + + for (i = 0; i < WG_KEY_LEN; ++i) { + hex[i * 2] = 87U + (key[i] >> 4) + ((((key[i] >> 4) - 10U) >> 8) & ~38U); + hex[i * 2 + 1] = 87U + (key[i] & 0xf) + ((((key[i] & 0xf) - 10U) >> 8) & ~38U); + } + hex[i * 2] = '\0'; +} + +bool key_from_hex(uint8_t key[static WG_KEY_LEN], const char *hex) +{ + uint8_t c, c_acc, c_alpha0, c_alpha, c_num0, c_num, c_val; + volatile uint8_t ret = 0; + + if (strlen(hex) != WG_KEY_LEN_HEX - 1) + return false; + + for (unsigned int i = 0; i < WG_KEY_LEN_HEX - 1; i += 2) { + c = (uint8_t)hex[i]; + c_num = c ^ 48U; + c_num0 = (c_num - 10U) >> 8; + c_alpha = (c & ~32U) - 55U; + c_alpha0 = ((c_alpha - 10U) ^ (c_alpha - 16U)) >> 8; + ret |= ((c_num0 | c_alpha0) - 1) >> 8; + c_val = (c_num0 & c_num) | (c_alpha0 & c_alpha); + c_acc = c_val * 16U; + + c = (uint8_t)hex[i + 1]; + c_num = c ^ 48U; + c_num0 = (c_num - 10U) >> 8; + c_alpha = (c & ~32U) - 55U; + c_alpha0 = ((c_alpha - 10U) ^ (c_alpha - 16U)) >> 8; + ret |= ((c_num0 | c_alpha0) - 1) >> 8; + c_val = (c_num0 & c_num) | (c_alpha0 & c_alpha); + key[i / 2] = c_acc | c_val; + } + + return 1 & ((ret - 1) >> 8); +} + +bool key_eq(const uint8_t key1[static WG_KEY_LEN], const uint8_t key2[static WG_KEY_LEN]) +{ + volatile uint8_t acc = 0; + for (unsigned int i = 0; i < WG_KEY_LEN; ++i) { + acc |= key1[i] ^ key2[i]; + asm volatile("" : "=r"(acc) : "0"(acc)); + } + return 1 & ((acc - 1) >> 8); +} diff --git a/WireGuardKitC/key.h b/WireGuardKitC/key.h new file mode 100644 index 0000000..5353ade --- /dev/null +++ b/WireGuardKitC/key.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: MIT */ +/* + * Copyright (C) 2015-2019 Jason A. Donenfeld . All Rights Reserved. + */ + +#ifndef KEY_H +#define KEY_H + +#include +#include + +#define WG_KEY_LEN (32) +#define WG_KEY_LEN_BASE64 (45) +#define WG_KEY_LEN_HEX (65) + +void key_to_base64(char base64[static WG_KEY_LEN_BASE64], const uint8_t key[static WG_KEY_LEN]); +bool key_from_base64(uint8_t key[static WG_KEY_LEN], const char *base64); + +void key_to_hex(char hex[static WG_KEY_LEN_HEX], const uint8_t key[static WG_KEY_LEN]); +bool key_from_hex(uint8_t key[static WG_KEY_LEN], const char *hex); + +bool key_eq(const uint8_t key1[static WG_KEY_LEN], const uint8_t key2[static WG_KEY_LEN]); + +#endif diff --git a/WireGuardKitC/module.modulemap b/WireGuardKitC/module.modulemap new file mode 100644 index 0000000..26b45bf --- /dev/null +++ b/WireGuardKitC/module.modulemap @@ -0,0 +1,4 @@ +module WireGuardKitC { + umbrella header "WireGuardKitC.h" + export * +} diff --git a/WireGuardKitC/x25519.c b/WireGuardKitC/x25519.c new file mode 100644 index 0000000..7793299 --- /dev/null +++ b/WireGuardKitC/x25519.c @@ -0,0 +1,178 @@ +/* SPDX-License-Identifier: MIT + * + * Copyright (C) 2015-2019 Jason A. Donenfeld . All Rights Reserved. + * + * Curve25519 ECDH functions, based on TweetNaCl but cleaned up. + */ + +#include +#include +#include +#include + +#include "x25519.h" + +typedef int64_t fe[16]; + +static inline void carry(fe o) +{ + int i; + + for (i = 0; i < 16; ++i) { + o[(i + 1) % 16] += (i == 15 ? 38 : 1) * (o[i] >> 16); + o[i] &= 0xffff; + } +} + +static inline void cswap(fe p, fe q, int b) +{ + int i; + int64_t t, c = ~(b - 1); + + for (i = 0; i < 16; ++i) { + t = c & (p[i] ^ q[i]); + p[i] ^= t; + q[i] ^= t; + } +} + +static inline void pack(uint8_t *o, const fe n) +{ + int i, j, b; + fe m, t; + + memcpy(t, n, sizeof(t)); + carry(t); + carry(t); + carry(t); + for (j = 0; j < 2; ++j) { + m[0] = t[0] - 0xffed; + for (i = 1; i < 15; ++i) { + m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1); + m[i - 1] &= 0xffff; + } + m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1); + b = (m[15] >> 16) & 1; + m[14] &= 0xffff; + cswap(t, m, 1 - b); + } + for (i = 0; i < 16; ++i) { + o[2 * i] = t[i] & 0xff; + o[2 * i + 1] = t[i] >> 8; + } +} + +static inline void unpack(fe o, const uint8_t *n) +{ + int i; + + for (i = 0; i < 16; ++i) + o[i] = n[2 * i] + ((int64_t)n[2 * i + 1] << 8); + o[15] &= 0x7fff; +} + +static inline void add(fe o, const fe a, const fe b) +{ + int i; + + for (i = 0; i < 16; ++i) + o[i] = a[i] + b[i]; +} + +static inline void subtract(fe o, const fe a, const fe b) +{ + int i; + + for (i = 0; i < 16; ++i) + o[i] = a[i] - b[i]; +} + +static inline void multmod(fe o, const fe a, const fe b) +{ + int i, j; + int64_t t[31] = { 0 }; + + for (i = 0; i < 16; ++i) { + for (j = 0; j < 16; ++j) + t[i + j] += a[i] * b[j]; + } + for (i = 0; i < 15; ++i) + t[i] += 38 * t[i + 16]; + memcpy(o, t, sizeof(fe)); + carry(o); + carry(o); +} + +static inline void invert(fe o, const fe i) +{ + fe c; + int a; + + memcpy(c, i, sizeof(c)); + for (a = 253; a >= 0; --a) { + multmod(c, c, c); + if (a != 2 && a != 4) + multmod(c, c, i); + } + memcpy(o, c, sizeof(fe)); +} + +static void curve25519_shared_secret(uint8_t shared_secret[32], const uint8_t private_key[32], const uint8_t public_key[32]) +{ + static const fe a24 = { 0xdb41, 1 }; + uint8_t z[32]; + int64_t r; + int i; + fe a = { 1 }, b, c = { 0 }, d = { 1 }, e, f, x; + + memcpy(z, private_key, sizeof(z)); + + z[31] = (z[31] & 127) | 64; + z[0] &= 248; + + unpack(x, public_key); + memcpy(b, x, sizeof(b)); + + for (i = 254; i >= 0; --i) { + r = (z[i >> 3] >> (i & 7)) & 1; + cswap(a, b, (int)r); + cswap(c, d, (int)r); + add(e, a, c); + subtract(a, a, c); + add(c, b, d); + subtract(b, b, d); + multmod(d, e, e); + multmod(f, a, a); + multmod(a, c, a); + multmod(c, b, e); + add(e, a, c); + subtract(a, a, c); + multmod(b, a, a); + subtract(c, d, f); + multmod(a, c, a24); + add(a, a, d); + multmod(c, c, a); + multmod(a, d, f); + multmod(d, b, x); + multmod(b, e, e); + cswap(a, b, (int)r); + cswap(c, d, (int)r); + } + invert(c, c); + multmod(a, a, c); + pack(shared_secret, a); +} + +void curve25519_derive_public_key(uint8_t public_key[32], const uint8_t private_key[32]) +{ + static const uint8_t basepoint[32] = { 9 }; + + curve25519_shared_secret(public_key, private_key, basepoint); +} + +void curve25519_generate_private_key(uint8_t private_key[32]) +{ + assert(CCRandomGenerateBytes(private_key, 32) == kCCSuccess); + private_key[31] = (private_key[31] & 127) | 64; + private_key[0] &= 248; +} diff --git a/WireGuardKitC/x25519.h b/WireGuardKitC/x25519.h new file mode 100644 index 0000000..7d8440d --- /dev/null +++ b/WireGuardKitC/x25519.h @@ -0,0 +1,7 @@ +#ifndef X25519_H +#define X25519_H + +void curve25519_derive_public_key(unsigned char public_key[32], const unsigned char private_key[32]); +void curve25519_generate_private_key(unsigned char private_key[32]); + +#endif diff --git a/build-go-lib.sh b/build-go-lib.sh new file mode 100755 index 0000000..21efe53 --- /dev/null +++ b/build-go-lib.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -e + +rn_app_path=$(pwd) +netbirdPath=$1 +if [ -z "${1+x}" ] +then + netbirdPath=${GOPATH}/src/github.com/netbirdio/netbird +fi + +version=$2 +if [ -z "${2+x}" ] +then + version=development +fi + +cd $netbirdPath +gomobile init +CGO_ENABLED=0 gomobile bind -target=ios -bundleid=io.netbird.framework -ldflags="-X github.com/netbirdio/netbird/version.version=$version" -o $rn_app_path/NetBirdSDK.xcframework $netbirdPath/client/ios/NetBirdSDK + +cd -