├── setup.bat ├── examples ├── unobfuscated.py └── obfuscated.py ├── README.md ├── kramer.py └── LICENSE /setup.bat: -------------------------------------------------------------------------------- 1 | python -m pip install pystyle==0.6 -------------------------------------------------------------------------------- /examples/unobfuscated.py: -------------------------------------------------------------------------------- 1 | input("Hello there!") -------------------------------------------------------------------------------- /examples/obfuscated.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/billythegoat356/Kramer/HEAD/examples/obfuscated.py -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ----- 2 | 3 |

4 | 5 |

6 | 7 | ----- 8 | 9 | ###

🐸 Kramer 🐸

10 | 11 |

12 |

13 | 14 | First of all, if you're looking for the BEST fully Python obfuscator, you should check Hyperion! 15 |

16 | Kramer is a next level obfuscation tool written in Python3 allowing you to obfuscate 17 |
18 | your Python3 code easily and securely. It uses Berserker's obfuscation but in a more advanced way 19 |
20 | making your code really hard to be deobfuscated. 21 |
22 |

23 |
24 | 25 | ----- 26 | 27 | ###

📋 Examples 📋

28 | 29 |

30 | **Unobfuscated**:
31 | ```python3 32 | input("Hello world!") 33 | ``` 34 |

35 | **Obfuscated**:
36 | ```python3 37 | ������������������������������������������������������������� 38 | ``` 39 |


40 |

41 | 42 |

43 |
44 | 45 | ----- 46 | 47 | ###

⭐ Features ⭐

48 | 49 |

50 | + This time you can be sure skids won't be able to get your code 51 |
52 | + Very fast execution 53 |
54 | + Easy to use 55 |
56 | 57 |

58 | 59 |

60 | 61 |
62 | - The result file is not a python file (.PY) but a compiled python file (.PYC) renamed to .PY 63 |
64 | - Can't compile the file to exe (since it's basically a PYC file) but you can compile the PY file in the logs folder 65 |
66 | - Can be deobfuscated using a PYC decompilator then some Python algorithmic, but it requires a certain knowledge 67 |

68 | 69 | ----- 70 | 71 | ###

🎯 Levels 🎯

72 | 73 |

This section shows the "levels" of this project, from 0/5 ⚪ to 5/5 ⚫! 74 |

⚪🟢🔵🔴🟣⚫ 75 | 76 |

77 | * Time: 🔴 78 | * Complexity: 🟣 79 | * Service: 🔴 80 |

81 | 82 | ----- 83 | 84 | ###

💡 Ideas 💡

85 | 86 |

Feel free to make a pull request on this repository to submit any idea! 87 | 88 |

89 | * Complexify the obfuscation 90 |

91 | 92 | ----- 93 | 94 | ###

📌 Disclaimer 📌

95 | 96 |

97 | * ***Please use this program only for educational purposes.*** 98 | * ***It is not meant to be used in any malicious way, and I decline any responsibility for what you do with it.*** 99 |

100 | 101 | ----- 102 | 103 | ###

billythegoat356

104 | -------------------------------------------------------------------------------- /kramer.py: -------------------------------------------------------------------------------- 1 | # by billythegoat356 2 | 3 | # https://github.com/billythegoat356/Kramer 4 | 5 | 6 | 7 | from random import choice, randint, shuffle 8 | from pystyle import Add, Center, Anime, Colors, Colorate, Write, System 9 | from os.path import isfile, isdir 10 | from py_compile import compile 11 | from os import listdir, mkdir, remove, rmdir, rename, chdir, name 12 | from shutil import move, copy, rmtree 13 | from time import sleep 14 | from binascii import hexlify 15 | 16 | 17 | 18 | 19 | strings = "abcdefghijklmnopqrstuvwxyz0123456789" # ne pas changer svp 20 | 21 | 22 | class Kyrie(): 23 | 24 | def encrypt(e: str): 25 | e = Kyrie._ekyrie(e) 26 | return Kyrie._encrypt(e) 27 | 28 | def decrypt(e: str): 29 | text = Kyrie._decrypt(e) 30 | return Kyrie._dkyrie(text) 31 | 32 | def _ekyrie(text: str): 33 | 34 | r = "" 35 | for a in text: 36 | if a in strings: 37 | a = strings[strings.index(a)-1] 38 | r += a 39 | return r 40 | 41 | def _dkyrie(text: str): 42 | r = "" 43 | for a in text: 44 | if a in strings: 45 | i = strings.index(a)+1 46 | if i >= len(strings): 47 | i = 0 48 | a = strings[i] 49 | r += a 50 | return r 51 | 52 | def _encrypt(text: str, key: str = None): 53 | if type(key) == str: 54 | key = sum(ord(i) for i in key) 55 | t = [chr(ord(t)+key)if t != "\n" else "ζ" for t in text] 56 | return "".join(t) 57 | 58 | def _decrypt(text: str, key: str = None): 59 | if type(key) == str: 60 | key = sum(ord(i) for i in key) 61 | return "".join(chr(ord(t)-key) if t != "ζ" else "\n" for t in text) 62 | 63 | 64 | class Key: 65 | 66 | def encrypt(e: str, key: str): 67 | e1 = Kyrie._ekyrie(e) 68 | return Kyrie._encrypt(e1, key=key) 69 | 70 | def decrypt(e: str, key: str): 71 | text = Kyrie._decrypt(e, key=key) 72 | return Kyrie._dkyrie(text) 73 | 74 | 75 | 76 | def ran_int(min: int = 3, max: int = 1000000): 77 | return randint(min, max+1) 78 | 79 | 80 | def kramer(content: str, key: int) -> str: 81 | 82 | _content_ = Key.encrypt(content, key=key) 83 | 84 | _lines_sep_ = '/' 85 | 86 | 87 | content = _lines_sep_.join(hexlify(x.encode()).decode() for x in _content_) 88 | 89 | _names_ = ["_eval", "_exec", "_byte", "_bytes", "_bit", "_bits", "_system", "_encode", "_decode", "_delete", "_exit", "_rasputin", "_kramer"] 90 | _names_ = ["self." + name for name in _names_] 91 | shuffle(_names_) 92 | 93 | for k in range(12): 94 | globals()[f'n_{str(k+1)}'] = _names_[k] 95 | 96 | 97 | _types_ = ("str","float","bool","int") 98 | 99 | def _find(chars: str): return "+".join(f"_n7_[{list('abcdefghijklmnopqrstuvwxyz0123456789').index(c)}]" for c in chars) 100 | 101 | _1_ = fr"""_n5_""",fr"""lambda _n9_:"".join(__import__(_n7_[1]+_n7_[8]+_n7_[13]+_n7_[0]+_n7_[18]+_n7_[2]+_n7_[8]+_n7_[8]).unhexlify(str(_n10_)).decode()for _n10_ in str(_n9_).split('{_lines_sep_}'))""" 102 | _2_ = fr"""_n6_""",r"""lambda _n1_:str(_n4_[_n2_](f"{_n7_[4]+_n7_[-13]+_n7_[4]+_n7_[2]}(''.join(%s),{_n7_[6]+_n7_[11]+_n7_[14]+_n7_[1]+_n7_[0]+_n7_[11]+_n7_[18]}())"%list(_n1_))).encode(_n7_[20]+_n7_[19]+_n7_[5]+_n7_[34])if _n4_[_n2_]==eval else exit()""" 103 | _3_ = fr"""_n4_[_n2_]""",fr"""eval""" 104 | _4_ = fr"""_n1_""",fr"""lambda _n1_:exit()if _n7_[15]+_n7_[17]+_n7_[8]+_n7_[13]+_n7_[19] in open(__file__, errors=_n7_[8]+_n7_[6]+_n7_[13]+_n7_[14]+_n7_[17]+_n7_[4]).read() or _n7_[8]+_n7_[13]+_n7_[15]+_n7_[20]+_n7_[19] in open(__file__, errors=_n7_[8]+_n7_[6]+_n7_[13]+_n7_[14]+_n7_[17]+_n7_[4]).read()else"".join(_n1_ if _n1_ not in _n7_ else _n7_[_n7_.index(_n1_)+1 if _n7_.index(_n1_)+1exec:return(None,_n8_(_execute))[0] 116 | def __init__(self:object,_n1_:{choice(_types_)}=False,_n2_:{choice(_types_)}=0,*_n3_:{choice(_types_)},**_n4_:{choice(_types_)})->exec: 117 | {_vars_} 118 | return self.__decode__(_n4_[(_n7_[-1]+'_')[-1]+_n7_[18]+_n7_[15]+_n7_[0]+_n7_[17]+_n7_[10]+_n7_[11]+_n7_[4]]) 119 | Kramer(_n1_=False,_n2_=False,_sparkle='''{content}''')""".strip().replace("_n1_",n_1.removeprefix("self.")).replace("_n2_",n_2.removeprefix("self.")).replace("_n3_",n_3.removeprefix("self.")).replace("_n4_",n_4.removeprefix("self.")).replace("_n5_",n_5).replace("_n6_",n_6).replace("_n7_",n_7).replace("_n8_",n_8).replace("_n9_",n_9.removeprefix("self.")).replace("_n10_",n_10.removeprefix("self.")).replace("_n12_",n_12.removeprefix("self.")) 120 | return _final_content_ 121 | 122 | 123 | 124 | System.Clear() 125 | System.Title("Kramer") 126 | System.Size(140, 45) 127 | 128 | 129 | text = ''' 130 | <█> <█> 131 | <█> <█> <█><█><█><█> <█><█><█> <█><█><█><█> 132 | <█> <█> <█> <█> <█> <█> <█> <█> <█> <█><█><█> 133 | <█><█> <█> <█> <█> <█> <█> <█> <█> <█> <█> <█> 134 | <█><█> <█> <█> <█><█><█><█><█> <█> <█> <█> <█> <█> 135 | <█> <█> <█><█><█> <█> <█> <█> <█> <█><█><█> <█><█><█> 136 | <█> <█> <█> <█> <█> <█> <█> <█> <█> <█> <█> 137 | <█> <█> <█> <█> <█> <█> <█> <█> <█> <█> <█> 138 | <█> <█> <█> <█> <█> <█> <█> 139 | <█> <█> <█><█><█><█> <█> 140 | '''[1:] 141 | 142 | 143 | banner = r""" 144 | xXXXXXXXXXXx 145 | xX Xx 146 | X X 147 | X XxXXxX X 148 | X x x X 149 | X XX X 150 | XX X /~~\ /~~\ X XX 151 | XX X X | o \ / o | X X XX 152 | XX X X \____/ \____/ X X XX 153 | XXXXX XX \ /\ ,/ XX XXXXX 154 | X XX%;;@ \ / \ ,/ @%%;XX X 155 | X X @%%;;@ X X @%%;;@ X X 156 | X X @%%;;@ X ; ; ; ; X @%%;;@ X X 157 | X X @%%;;@ @%%;;@ X X 158 | X X @%%;;@ @%%;;@ X X 159 | X X @%%;;@ @%%;;@ X X 160 | XX X @%%;;@ @%%;;@ X XX 161 | XXX @%%;;@ @%%;;@ XXX 162 | @%%;;%%;;@ 163 | @%%;;@ 164 | @%%;;@..@@ 165 | @@@ @@@ 166 | """[1:] 167 | 168 | 169 | 170 | 171 | 172 | Anime.Fade(Center.Center(banner), Colors.red_to_yellow, Colorate.Vertical, enter=True) 173 | 174 | def main(): 175 | System.Clear() 176 | 177 | print("\n"*2) 178 | print(Colorate.Diagonal(Colors.red_to_yellow, Center.XCenter(text))) 179 | print("\n"*5) 180 | 181 | 182 | _file = Write.Input("Drag your Python file -> ", Colors.red_to_yellow, interval=0.005) 183 | 184 | 185 | 186 | if not _file.strip() or not isfile(_file): 187 | Colorate.Error("This file does not exist!") 188 | return 189 | 190 | if '\\' in _file: 191 | file = _file.split('\\')[-1] 192 | elif '/' in _file: 193 | file = _file.split('/')[-1] 194 | else: 195 | file = _file 196 | 197 | with open(_file, 'r', encoding='utf-8', errors='ignore') as f: 198 | content = f.read() 199 | 200 | with open(file, 'w', encoding='utf-8', errors='ignore') as f: 201 | f.write(content) 202 | 203 | # print() 204 | # key = Write.Input("Enter your encryption key (3 - 1000000) -> ", Colors.red_to_yellow, interval=0.005) 205 | key = ran_int(max=1000000) 206 | 207 | try: 208 | key = int(key) 209 | except ValueError: 210 | Colorate.Error("Invalid key!") 211 | return 212 | 213 | if key < 3 or key > 1000000: 214 | Colorate.Error("Invalid key!") 215 | return 216 | 217 | 218 | file = file.removesuffix(".py") + "-obf.py" # hello hideaki 219 | 220 | content = kramer(content=content, key=key) 221 | with open(file, 'w', encoding='utf-8') as f: 222 | f.write(content) 223 | 224 | print('\n') 225 | 226 | print(Colorate.Diagonal(Colors.red_to_yellow, f"""Crypting with Kyrie Eleison... 227 | Using key {key}... 228 | Separating lines and spaces... 229 | Encoding in ASCII... 230 | Generating random variables names... 231 | Generating two random numbers... 232 | Creating the vars... 233 | Shuffling the vars... 234 | Adding the vars... 235 | Making the final content...""")) 236 | 237 | print() 238 | 239 | compile(file) 240 | 241 | logsfolder = "logs" 242 | 243 | if isdir(logsfolder): 244 | rmtree(logsfolder) 245 | 246 | mkdir(logsfolder) 247 | 248 | copy(file, logsfolder) 249 | 250 | 251 | for _file in listdir("__pycache__"): 252 | move(f"__pycache__/{_file}", ".") 253 | break 254 | 255 | sleep(0.025) 256 | rmdir("__pycache__") 257 | 258 | if isfile(file): 259 | remove(file) 260 | 261 | copy(_file, logsfolder) 262 | 263 | rename(logsfolder+ '/' + _file, logsfolder+ '/' + file + 'c') 264 | 265 | rename(_file, file) 266 | 267 | 268 | print(Colorate.Diagonal(Colors.red_to_yellow, """Creating PYC file... 269 | Moving the PYC file... 270 | Deleting '__pycache__' folder... 271 | Renaming PYC file...""")) 272 | 273 | print('\n') 274 | 275 | Write.Input("Built!", Colors.red_to_yellow, interval=0.005) 276 | return exit() 277 | 278 | if __name__ == '__main__': 279 | while True: 280 | main() 281 | 282 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Eclipse Public License - v 2.0 2 | 3 | THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE 4 | PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION 5 | OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 6 | 7 | 1. DEFINITIONS 8 | 9 | "Contribution" means: 10 | 11 | a) in the case of the initial Contributor, the initial content 12 | Distributed under this Agreement, and 13 | 14 | b) in the case of each subsequent Contributor: 15 | i) changes to the Program, and 16 | ii) additions to the Program; 17 | where such changes and/or additions to the Program originate from 18 | and are Distributed by that particular Contributor. A Contribution 19 | "originates" from a Contributor if it was added to the Program by 20 | such Contributor itself or anyone acting on such Contributor's behalf. 21 | Contributions do not include changes or additions to the Program that 22 | are not Modified Works. 23 | 24 | "Contributor" means any person or entity that Distributes the Program. 25 | 26 | "Licensed Patents" mean patent claims licensable by a Contributor which 27 | are necessarily infringed by the use or sale of its Contribution alone 28 | or when combined with the Program. 29 | 30 | "Program" means the Contributions Distributed in accordance with this 31 | Agreement. 32 | 33 | "Recipient" means anyone who receives the Program under this Agreement 34 | or any Secondary License (as applicable), including Contributors. 35 | 36 | "Derivative Works" shall mean any work, whether in Source Code or other 37 | form, that is based on (or derived from) the Program and for which the 38 | editorial revisions, annotations, elaborations, or other modifications 39 | represent, as a whole, an original work of authorship. 40 | 41 | "Modified Works" shall mean any work in Source Code or other form that 42 | results from an addition to, deletion from, or modification of the 43 | contents of the Program, including, for purposes of clarity any new file 44 | in Source Code form that contains any contents of the Program. Modified 45 | Works shall not include works that contain only declarations, 46 | interfaces, types, classes, structures, or files of the Program solely 47 | in each case in order to link to, bind by name, or subclass the Program 48 | or Modified Works thereof. 49 | 50 | "Distribute" means the acts of a) distributing or b) making available 51 | in any manner that enables the transfer of a copy. 52 | 53 | "Source Code" means the form of a Program preferred for making 54 | modifications, including but not limited to software source code, 55 | documentation source, and configuration files. 56 | 57 | "Secondary License" means either the GNU General Public License, 58 | Version 2.0, or any later versions of that license, including any 59 | exceptions or additional permissions as identified by the initial 60 | Contributor. 61 | 62 | 2. GRANT OF RIGHTS 63 | 64 | a) Subject to the terms of this Agreement, each Contributor hereby 65 | grants Recipient a non-exclusive, worldwide, royalty-free copyright 66 | license to reproduce, prepare Derivative Works of, publicly display, 67 | publicly perform, Distribute and sublicense the Contribution of such 68 | Contributor, if any, and such Derivative Works. 69 | 70 | b) Subject to the terms of this Agreement, each Contributor hereby 71 | grants Recipient a non-exclusive, worldwide, royalty-free patent 72 | license under Licensed Patents to make, use, sell, offer to sell, 73 | import and otherwise transfer the Contribution of such Contributor, 74 | if any, in Source Code or other form. This patent license shall 75 | apply to the combination of the Contribution and the Program if, at 76 | the time the Contribution is added by the Contributor, such addition 77 | of the Contribution causes such combination to be covered by the 78 | Licensed Patents. The patent license shall not apply to any other 79 | combinations which include the Contribution. No hardware per se is 80 | licensed hereunder. 81 | 82 | c) Recipient understands that although each Contributor grants the 83 | licenses to its Contributions set forth herein, no assurances are 84 | provided by any Contributor that the Program does not infringe the 85 | patent or other intellectual property rights of any other entity. 86 | Each Contributor disclaims any liability to Recipient for claims 87 | brought by any other entity based on infringement of intellectual 88 | property rights or otherwise. As a condition to exercising the 89 | rights and licenses granted hereunder, each Recipient hereby 90 | assumes sole responsibility to secure any other intellectual 91 | property rights needed, if any. For example, if a third party 92 | patent license is required to allow Recipient to Distribute the 93 | Program, it is Recipient's responsibility to acquire that license 94 | before distributing the Program. 95 | 96 | d) Each Contributor represents that to its knowledge it has 97 | sufficient copyright rights in its Contribution, if any, to grant 98 | the copyright license set forth in this Agreement. 99 | 100 | e) Notwithstanding the terms of any Secondary License, no 101 | Contributor makes additional grants to any Recipient (other than 102 | those set forth in this Agreement) as a result of such Recipient's 103 | receipt of the Program under the terms of a Secondary License 104 | (if permitted under the terms of Section 3). 105 | 106 | 3. REQUIREMENTS 107 | 108 | 3.1 If a Contributor Distributes the Program in any form, then: 109 | 110 | a) the Program must also be made available as Source Code, in 111 | accordance with section 3.2, and the Contributor must accompany 112 | the Program with a statement that the Source Code for the Program 113 | is available under this Agreement, and informs Recipients how to 114 | obtain it in a reasonable manner on or through a medium customarily 115 | used for software exchange; and 116 | 117 | b) the Contributor may Distribute the Program under a license 118 | different than this Agreement, provided that such license: 119 | i) effectively disclaims on behalf of all other Contributors all 120 | warranties and conditions, express and implied, including 121 | warranties or conditions of title and non-infringement, and 122 | implied warranties or conditions of merchantability and fitness 123 | for a particular purpose; 124 | 125 | ii) effectively excludes on behalf of all other Contributors all 126 | liability for damages, including direct, indirect, special, 127 | incidental and consequential damages, such as lost profits; 128 | 129 | iii) does not attempt to limit or alter the recipients' rights 130 | in the Source Code under section 3.2; and 131 | 132 | iv) requires any subsequent distribution of the Program by any 133 | party to be under a license that satisfies the requirements 134 | of this section 3. 135 | 136 | 3.2 When the Program is Distributed as Source Code: 137 | 138 | a) it must be made available under this Agreement, or if the 139 | Program (i) is combined with other material in a separate file or 140 | files made available under a Secondary License, and (ii) the initial 141 | Contributor attached to the Source Code the notice described in 142 | Exhibit A of this Agreement, then the Program may be made available 143 | under the terms of such Secondary Licenses, and 144 | 145 | b) a copy of this Agreement must be included with each copy of 146 | the Program. 147 | 148 | 3.3 Contributors may not remove or alter any copyright, patent, 149 | trademark, attribution notices, disclaimers of warranty, or limitations 150 | of liability ("notices") contained within the Program from any copy of 151 | the Program which they Distribute, provided that Contributors may add 152 | their own appropriate notices. 153 | 154 | 4. COMMERCIAL DISTRIBUTION 155 | 156 | Commercial distributors of software may accept certain responsibilities 157 | with respect to end users, business partners and the like. While this 158 | license is intended to facilitate the commercial use of the Program, 159 | the Contributor who includes the Program in a commercial product 160 | offering should do so in a manner which does not create potential 161 | liability for other Contributors. Therefore, if a Contributor includes 162 | the Program in a commercial product offering, such Contributor 163 | ("Commercial Contributor") hereby agrees to defend and indemnify every 164 | other Contributor ("Indemnified Contributor") against any losses, 165 | damages and costs (collectively "Losses") arising from claims, lawsuits 166 | and other legal actions brought by a third party against the Indemnified 167 | Contributor to the extent caused by the acts or omissions of such 168 | Commercial Contributor in connection with its distribution of the Program 169 | in a commercial product offering. The obligations in this section do not 170 | apply to any claims or Losses relating to any actual or alleged 171 | intellectual property infringement. In order to qualify, an Indemnified 172 | Contributor must: a) promptly notify the Commercial Contributor in 173 | writing of such claim, and b) allow the Commercial Contributor to control, 174 | and cooperate with the Commercial Contributor in, the defense and any 175 | related settlement negotiations. The Indemnified Contributor may 176 | participate in any such claim at its own expense. 177 | 178 | For example, a Contributor might include the Program in a commercial 179 | product offering, Product X. That Contributor is then a Commercial 180 | Contributor. If that Commercial Contributor then makes performance 181 | claims, or offers warranties related to Product X, those performance 182 | claims and warranties are such Commercial Contributor's responsibility 183 | alone. Under this section, the Commercial Contributor would have to 184 | defend claims against the other Contributors related to those performance 185 | claims and warranties, and if a court requires any other Contributor to 186 | pay any damages as a result, the Commercial Contributor must pay 187 | those damages. 188 | 189 | 5. NO WARRANTY 190 | 191 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT 192 | PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" 193 | BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR 194 | IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF 195 | TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR 196 | PURPOSE. Each Recipient is solely responsible for determining the 197 | appropriateness of using and distributing the Program and assumes all 198 | risks associated with its exercise of rights under this Agreement, 199 | including but not limited to the risks and costs of program errors, 200 | compliance with applicable laws, damage to or loss of data, programs 201 | or equipment, and unavailability or interruption of operations. 202 | 203 | 6. DISCLAIMER OF LIABILITY 204 | 205 | EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT 206 | PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS 207 | SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 208 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST 209 | PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 210 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 211 | ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE 212 | EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE 213 | POSSIBILITY OF SUCH DAMAGES. 214 | 215 | 7. GENERAL 216 | 217 | If any provision of this Agreement is invalid or unenforceable under 218 | applicable law, it shall not affect the validity or enforceability of 219 | the remainder of the terms of this Agreement, and without further 220 | action by the parties hereto, such provision shall be reformed to the 221 | minimum extent necessary to make such provision valid and enforceable. 222 | 223 | If Recipient institutes patent litigation against any entity 224 | (including a cross-claim or counterclaim in a lawsuit) alleging that the 225 | Program itself (excluding combinations of the Program with other software 226 | or hardware) infringes such Recipient's patent(s), then such Recipient's 227 | rights granted under Section 2(b) shall terminate as of the date such 228 | litigation is filed. 229 | 230 | All Recipient's rights under this Agreement shall terminate if it 231 | fails to comply with any of the material terms or conditions of this 232 | Agreement and does not cure such failure in a reasonable period of 233 | time after becoming aware of such noncompliance. If all Recipient's 234 | rights under this Agreement terminate, Recipient agrees to cease use 235 | and distribution of the Program as soon as reasonably practicable. 236 | However, Recipient's obligations under this Agreement and any licenses 237 | granted by Recipient relating to the Program shall continue and survive. 238 | 239 | Everyone is permitted to copy and distribute copies of this Agreement, 240 | but in order to avoid inconsistency the Agreement is copyrighted and 241 | may only be modified in the following manner. The Agreement Steward 242 | reserves the right to publish new versions (including revisions) of 243 | this Agreement from time to time. No one other than the Agreement 244 | Steward has the right to modify this Agreement. The Eclipse Foundation 245 | is the initial Agreement Steward. The Eclipse Foundation may assign the 246 | responsibility to serve as the Agreement Steward to a suitable separate 247 | entity. Each new version of the Agreement will be given a distinguishing 248 | version number. The Program (including Contributions) may always be 249 | Distributed subject to the version of the Agreement under which it was 250 | received. In addition, after a new version of the Agreement is published, 251 | Contributor may elect to Distribute the Program (including its 252 | Contributions) under the new version. 253 | 254 | Except as expressly stated in Sections 2(a) and 2(b) above, Recipient 255 | receives no rights or licenses to the intellectual property of any 256 | Contributor under this Agreement, whether expressly, by implication, 257 | estoppel or otherwise. All rights in the Program not expressly granted 258 | under this Agreement are reserved. Nothing in this Agreement is intended 259 | to be enforceable by any entity that is not a Contributor or Recipient. 260 | No third-party beneficiary rights are created under this Agreement. 261 | 262 | Exhibit A - Form of Secondary Licenses Notice 263 | 264 | "This Source Code may also be made available under the following 265 | Secondary Licenses when the conditions for such availability set forth 266 | in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), 267 | version(s), and exceptions or additional permissions here}." 268 | 269 | Simply including a copy of this Agreement, including this Exhibit A 270 | is not sufficient to license the Source Code under Secondary Licenses. 271 | 272 | If it is not possible or desirable to put the notice in a particular 273 | file, then You may include the notice in a location (such as a LICENSE 274 | file in a relevant directory) where a recipient would be likely to 275 | look for such a notice. 276 | 277 | You may add additional accurate notices of copyright ownership. 278 | --------------------------------------------------------------------------------