@effekt-lang/effekt 0.61.0 → 0.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,21 +2,15 @@ module scanner
2
2
 
3
3
  import stream
4
4
 
5
- interface Scan[A] {
6
- /// Return the next character, not advancing.
7
- /// That is, this does not change what any future calls on the Scanner return.
8
- def peek(): A / stop
9
- /// Advance the Scanner to the next character.
10
- def skip(): Unit / stop
11
- }
12
5
 
6
+ /// Return the next character, not advancing.
7
+ /// That is, this does not change what any future calls on the Scanner return.
8
+ effect peek[A](): A / stop
13
9
 
14
- /// Advance the Scanner to the next token, returning it.
15
- def read[A](): A / { Scan[A], stop } = {
16
- val t = do peek()
17
- do skip()
18
- return t
19
- }
10
+ effect Scan[A] = {read[A], peek[A]}
11
+
12
+ /// Advance the pull stream to the next element, discarding the current element.
13
+ def skip[A](): Unit / {read[A], stop} = { do read(); () }
20
14
 
21
15
 
22
16
  /// Run a scanner by reading from an input stream, discarding its output.
@@ -29,7 +23,7 @@ def expect(message: String) { scanner: () => Unit / fail }: Unit / Exception[Wro
29
23
  /// If conversion is successful read the next token, otherwise stop.
30
24
  def readWhen[A, B] { convert: A => B / fail }: B / { Scan[A], stop } = {
31
25
  val t = attempt { convert(do peek()) } { do stop() };
32
- do skip();
26
+ do read()
33
27
  return t
34
28
  }
35
29
 
@@ -37,7 +31,7 @@ def readWhen[A, B] { convert: A => B / fail }: B / { Scan[A], stop } = {
37
31
  def readIf[A] { predicate: A => Bool }: A / { Scan[A], stop } = {
38
32
  val t = do peek()
39
33
  if (predicate(t)) {
40
- do skip()
34
+ do read()
41
35
  return t
42
36
  } else {
43
37
  do stop()
@@ -51,7 +45,7 @@ def skipIf[A] { predicate: A => Bool }: Unit / { Scan[A], stop } = {
51
45
 
52
46
  /// Skips the next token but fails instead of stopping.
53
47
  def mustSkip[A](): Unit / { Scan[A], fail } =
54
- must { do skip() }
48
+ must { skip() }
55
49
 
56
50
  /// Skips the next character but fails if it is not the given one.
57
51
  def mustSkip(token: Char): Unit / { Scan[Char], fail } =
@@ -91,19 +85,21 @@ def skipIf(e: Char): Unit / { Scan[Char], stop } =
91
85
  /// Immediately stops when already at the end.
92
86
  def until[A, R] { predicate: A => Bool } { scanner: () => R / Scan[A] }: R / { Scan[A], stop } = {
93
87
  var stopped = false
94
- if (predicate(do peek())) { stopped = true; do skip() }
88
+ if (predicate(do peek())) { stopped = true; skip() }
95
89
  try {
96
90
  scanner()
97
- } with Scan[A] {
98
- def peek() = resume {
91
+ } with peek[A] {
92
+ resume {
99
93
  if (stopped) { do stop() } else { do peek() }
100
94
  }
101
- def skip() = resume {
95
+ } with read[A] {
96
+ resume {
102
97
  if (stopped) { do stop() } else {
103
- do skip()
98
+ val t = do read()
104
99
  boundary {
105
- if (predicate(do peek())) { stopped = true; do skip() }
100
+ if (predicate(do peek())) { stopped = true; skip() }
106
101
  }
102
+ return t
107
103
  }
108
104
  }
109
105
  }
@@ -165,7 +161,7 @@ def readHexadecimal(): Int / { Scan[Char], fail } = {
165
161
  /// Fails whenn there isn't at least one digit.
166
162
  def readInteger(): Int / { Scan[Char], fail } =
167
163
  must { do peek() } match {
168
- case '-' => must { do skip() }; neg(readDecimal())
164
+ case '-' => must { skip() }; neg(readDecimal())
169
165
  case c and isDigit(c) => readDecimal()
170
166
  case _ => do fail()
171
167
  }
@@ -174,28 +170,29 @@ namespace returning {
174
170
 
175
171
  /// Run a scanner by reading from an input stream.
176
172
  def scanner[A, R] { scanner: () => R / Scan[A] }: R / read[A] = {
173
+ def upstream(): A / stop = do read()
177
174
  var last = None()
178
175
  try {
179
176
  scanner()
180
- } with Scan[A] {
181
- def peek() = resume {
177
+ } with peek[A] { () =>
178
+ resume {
182
179
  last match {
183
180
  case None() =>
184
- val t = do read()
181
+ val t = upstream()
185
182
  last = Some(t)
186
183
  return t
187
184
  case Some(t) =>
188
185
  return t
189
186
  }
190
187
  }
191
- def skip() = resume {
188
+ } with read[A] {
189
+ resume {
192
190
  last match {
193
191
  case None() =>
194
- val _ = do read()
195
- return ()
192
+ upstream()
196
193
  case Some(t) =>
197
194
  last = None()
198
- return ()
195
+ return t
199
196
  }
200
197
  }
201
198
  }
@@ -243,10 +243,14 @@ def intersection[A](s1: Set[A], s2: Set[A]): Set[A] =
243
243
  def each[A](set: Set[A]): Unit / emit[A] =
244
244
  set.foreach { x => do emit(x) }
245
245
 
246
+ /// Collects elements emitted by a push stream producer `stream` into a new set
247
+ /// using provided `compare` function, discarding the result of the producer.
246
248
  def collect[A](compare: (A, A) => Ordering at {}) { stream: () => Unit / emit[A] }: Set[A] =
247
249
  returning::collect[A, Unit](compare){stream}.second
248
250
 
249
251
  namespace returning {
252
+ /// Collects elements emitted by a push stream producer `stream` into a new set
253
+ /// using provided `compare` function, returning the result of the producer as well as the collected set.
250
254
  def collect[A, R](compare: (A, A) => Ordering at {}) { stream: () => R / emit[A] }: (R, Set[A]) =
251
255
  try {
252
256
  (stream(), empty(compare))
@@ -314,8 +314,8 @@ def tee[A]{ cons1: { => Unit / emit[A] } => Unit }{ cons2: { => Unit / emit[A] }
314
314
  }
315
315
  }
316
316
 
317
- /// Return exactly the very first element of the given stream
318
- /// or raise MissingValue if no elements are emitted.
317
+ /// Extract exactly the very first element of the given stream
318
+ /// or fails if no elements are emitted.
319
319
  ///
320
320
  /// Examples:
321
321
  /// ```effekt
@@ -333,6 +333,50 @@ def first[A] { stream: () => Unit / emit[A] }: A / fail = {
333
333
  } with emit[A] { a => a }
334
334
  }
335
335
 
336
+ /// Extract the nth element of the given stream.
337
+ /// Fails if not enough elements are emitted
338
+ def nth[A](n: Int){ stream: () => Unit / emit[A] }: A / fail = {
339
+ var m = n
340
+ try {
341
+ def body(): A = { stream(); do fail() }
342
+ body()
343
+ } with emit[A] { a =>
344
+ if (m == 0) {
345
+ return a
346
+ } else {
347
+ m = m - 1
348
+ resume(())
349
+ }
350
+ }
351
+ }
352
+
353
+ // Counting and padding
354
+ // --------------------
355
+
356
+ /// get current position in stream
357
+ effect getPos(): Int
358
+
359
+ /// Track position in stream, starting with init
360
+ /// Handles getPos
361
+ def tracking[A](init: Int){ body: => Unit / { emit[A], getPos } }: Unit / emit[A] = {
362
+ var n = init
363
+ try body()
364
+ with emit[A] { b => n = n + 1; resume(do emit[A](b)) }
365
+ with getPos{ resume(n) }
366
+ }
367
+
368
+ /// Pad to a multiple of fac emitted values, by emitting gen repeatedly
369
+ def pad[A](fac: Int){ gen: => A }: Unit / {getPos, emit[A]} = {
370
+ while(mod(do getPos(), fac) != 0) {
371
+ do emit[A](gen())
372
+ }
373
+ }
374
+
375
+ /// Track how many bytes were emitted (in the body)
376
+ /// Handles getPos
377
+ def tracking[A]{ body: => Unit / { emit[A], getPos } }: Unit / emit[A] =
378
+ tracking[A](0){body}
379
+
336
380
  namespace returning {
337
381
 
338
382
  /// Canonical handler of push streams that performs `action` for every
@@ -3,60 +3,58 @@ module stringbuffer
3
3
  import effekt
4
4
  import bytearray
5
5
 
6
- interface StringBuffer {
7
- def write(str: String): Unit
8
- def flush(): String
9
- }
6
+ effect flush(): String
7
+
8
+ def stringBuffer { program: () => Unit / write }: String =
9
+ flushableStringBuffer { program(); do flush() }
10
10
 
11
- def stringBuffer[A] { prog: => A / StringBuffer }: A = {
11
+ def flushableStringBuffer[A] { program: () => A / { write, flush } }: A = {
12
12
  val initialCapacity = 128
13
13
  var buffer = bytearray::allocate(initialCapacity)
14
14
  // next free index to write to
15
- var pos = 0
15
+ var position = 0
16
16
 
17
- def ensureCapacity(sizeToAdd: Int): Unit = {
18
- val cap = buffer.size - pos
19
- if (sizeToAdd <= cap) ()
17
+ def ensureCapacity(required: Int): Unit = {
18
+ val capacity = buffer.size - position
19
+ if (required <= capacity) ()
20
20
  else {
21
21
  // Double the capacity while ensuring the required capacity
22
- val newSize = max(buffer.size * 2, buffer.size + sizeToAdd)
22
+ val newSize = max(buffer.size * 2, buffer.size + required)
23
23
  buffer = buffer.resize(newSize)
24
24
  }
25
25
  }
26
26
 
27
- try { prog() }
28
- with StringBuffer {
29
- def write(str) = {
30
- val bytes = fromString(str)
31
- ensureCapacity(bytes.size)
32
- bytes.foreach { b =>
33
- buffer.set(pos, b)
34
- pos = pos + 1
35
- }
36
- resume(())
37
- }
38
- def flush() = {
39
- // resize (& copy) buffer to strip trailing zeros that otherwise would be converted into 0x00 characters
40
- val str = bytearray::resize(buffer, pos).toString()
41
- // NOTE: Keep the `buffer` as-is (no wipe, no realloc),
42
- // just reset the `pos` in case we want to use it again.
43
- pos = 0
44
- resume(str)
27
+ try {
28
+ program()
29
+ } with write { string =>
30
+ val bytes = fromString(string)
31
+ ensureCapacity(bytes.size)
32
+ bytes.foreach { b =>
33
+ buffer.set(position, b)
34
+ position = position + 1
45
35
  }
36
+ resume(())
37
+ } with flush {
38
+ val string = buffer.resize(position).toString()
39
+ position = 0
40
+ resume(string)
46
41
  }
47
42
  }
48
43
 
44
+ def splicing[T] { writer: T => Unit } { program: () => Unit / splice[T] }: Unit =
45
+ try { program() } with splice[T] { t => resume(writer(t)) }
46
+
47
+
49
48
  /// Handler for string interpolation using a string buffer
50
- def s { prog: () => Unit / { literal, splice[String] } }: String =
49
+ def s { program: () => Unit / { write, splice[String] } }: String =
51
50
  stringBuffer {
52
- try { prog(); do flush() }
51
+ try { program() }
53
52
  with splice[String] { x => resume(do write(x)) }
54
- with literal { s => resume(do write(s)) }
55
53
  }
56
54
 
57
55
  namespace examples {
58
56
  def main() = {
59
- with stringBuffer
57
+ with flushableStringBuffer
60
58
 
61
59
  do write("hello")
62
60
  do write(", world")
@@ -33,6 +33,9 @@ def assert(obtained: String, expected: String, msg: String): Unit / Assertion =
33
33
  def assert(obtained: Int, expected: Int): Unit / { Assertion, Formatted } =
34
34
  assertEqual(obtained, expected) { (x, y) => x == y } { x => show(x) }
35
35
 
36
+ def assert(obtained: Byte, expected: Byte): Unit / { Assertion, Formatted } =
37
+ assertEqual(obtained, expected) { (x, y) => x == y } { x => show(x) }
38
+
36
39
  def assert(obtained: Bool, expected: Bool): Unit / { Assertion, Formatted } =
37
40
  assertEqual(obtained, expected) { (x, y) => x == y } { x => show(x) }
38
41
 
@@ -68,6 +71,13 @@ def assertThrown[E](ex: on[E]) { body: => Unit / Exception[E] }: Unit / Assertio
68
71
  def assertThrows[E] { body: => Unit / Exception[E] }: Unit / Assertion =
69
72
  do assert(on[E].default { true } { body(); false }, "Expected Exception, but exited normally")
70
73
 
74
+ def assertFail { body: => Unit / fail }: Unit / Assertion =
75
+ do assert(succeeds {body}, "Expected 'fail', but exited normally")
76
+
77
+ def assertNoFail { body: => Unit / fail }: Unit / Assertion =
78
+ onFail { do assert(false, "Unexpected 'fail'") } {body}
79
+
80
+
71
81
  interface Test {
72
82
  def success(name: String, duration: Int): Unit
73
83
  def failure(name: String, msg: String, duration: Int): Unit
@@ -826,4 +826,43 @@ void c_spawn(struct Pos cmd, struct Pos args, struct Pos options, Stack stack) {
826
826
  }
827
827
  }
828
828
 
829
+ // Returns the required buffer size if the variable exists, or -1 if it does not.
830
+ // This avoids allocating when the variable is not set.
831
+ Int c_getenv_size(struct Pos name) {
832
+ char* name_str = c_bytearray_into_nullterminated_string(name);
833
+ erasePositive(name);
834
+
835
+ char dummy;
836
+ size_t size = 1; // Note: size = 1 is required, otherwise libuv always returns EINVAL.
837
+ int result = uv_os_getenv(name_str, &dummy, &size);
838
+ free(name_str);
839
+
840
+ if (result == UV_ENOENT) return -1;
841
+ if (result == 0 || result == UV_ENOBUFS) return (Int)size;
842
+ return -1;
843
+ }
844
+
845
+ // Returns the value, given the caller already knows it exists with
846
+ // the given buffer size. Caller passes the size from c_getenv_size.
847
+ struct Pos c_getenv_value(struct Pos name, Int size) {
848
+ char* name_str = c_bytearray_into_nullterminated_string(name);
849
+ erasePositive(name);
850
+
851
+ char* buffer = malloc((size_t)size);
852
+ size_t buf_size = (size_t)size;
853
+ int result = uv_os_getenv(name_str, buffer, &buf_size);
854
+ free(name_str);
855
+
856
+ if (result != 0) {
857
+ // This should not happen, since we already checked with `c_getenv_size`
858
+ // ...but in case it does, we return an empty string instead.
859
+ free(buffer);
860
+ return c_bytearray_new(0);
861
+ }
862
+
863
+ struct Pos value = c_bytearray_from_nullterminated_string(buffer);
864
+ free(buffer);
865
+ return value;
866
+ }
867
+
829
868
  #endif
@@ -1,5 +1,5 @@
1
1
  <!doctype html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><title>Eclipse Public License 2.0 (EPL) | The Eclipse Foundation</title>
2
- <meta property="og:title" content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=twitter:title content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta property="og:description" content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=twitter:description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=author content="Wayne Beaton"><link href=/favicon.ico rel=icon type=image/x-icon><meta property="og:image" content="https://www.eclipse.org/images/og-image.jpg"><meta name=twitter:image content="https://www.eclipse.org/images/og-image.jpg"><meta name=twitter:card content="summary"><meta name=twitter:site content="@eclipsefdn"><meta name=twitter:creator content="@eclipsefdn"><meta property="og:url" content="https://www.eclipse.org/legal/epl-2.0/"><meta property="og:type" content="website"><meta property="og:site_name" content="Eclipse Foundation"><meta name=keywords content="epl,epl-2.0,legal,foundation,eclipse,eclipse public license,license,licenses"><meta name=generator content="Hugo 0.144.2"><link rel=canonical href=https://www.eclipse.org/legal/epl-2.0/><link rel=alternate href=/legal/epl-2.0/index.xml type=application/rss+xml title><link rel=stylesheet href="/public/css/styles.css?v=1770578401"><script>(function(e,t,n,s,o){e[s]=e[s]||[],e[s].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var a=t.getElementsByTagName(n)[0],i=t.createElement(n),r=s!="dataLayer"?"&l="+s:"";i.async=!0,i.src="https://www.googletagmanager.com/gtm.js?id="+o+r,a.parentNode.insertBefore(i,a)})(window,document,"script","dataLayer","GTM-5WLCZXC")</script><script>var tableClasses="table"</script><link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel=stylesheet type=text/css></head><body><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5WLCZXC" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript><a href=#main class=skip-link>Skip to content</a><div class=eclipsefdn-featured-story-banner data-publish-target=eclipse_org></div><header class="header-wrapper header-wrapper" id=header><div class="navigation-bar dark"><div class=container><div class=navigation-bar-inner><div class=navigation-bar-left><a class="focus-highlight focus-inverse" href=/><img class=navigation-bar-brand src=https://www.eclipse.org/eclipse.org-common/themes/solstice/public/images/logo/eclipse-foundation-white-orange.svg alt="Eclipse Foundation"></a></div><nav class="navigation-bar-nav hidden-xs hidden-sm"><ul><li><button type=button class="btn btn-link" data-target=join-us-menu>Join us</button></li><li><button type=button class="btn btn-link" data-target=what-we-do-menu>What we do</button></li><li><button type=button class="btn btn-link" data-target=resources-menu>Resources</button></li><li><button type=button class="btn btn-link" data-target=about-us-menu>About us</button></li></ul></nav><div class=navigation-bar-right><div class="navigation-bar-controls hidden-xs hidden-sm"><ul><li class=dropdown><a class="dropdown-toggle link-unstyled focus-highlight" tabindex=0 id=search-dropdown-toggle data-toggle=dropdown href=# aria-label=Search><i class="fa-solid fa-magnifying-glass" aria-hidden=true></i></a><form class="search-bar dropdown-menu dropdown-menu-right" aria-labelledby=search-dropdown-toggle action=https://www.eclipse.org/home/search/ method=get><input class=search-bar-input name=q placeholder=Search>
2
+ <meta property="og:title" content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=twitter:title content="Eclipse Public License 2.0 (EPL) | The Eclipse Foundation"><meta name=description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta property="og:description" content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=twitter:description content="The Eclipse Foundation provides our global community of individuals and organisations with a mature, scalable, and business-friendly environment for open source …"><meta name=author content="Wayne Beaton"><link href=/favicon.ico rel=icon type=image/x-icon><meta property="og:image" content="https://www.eclipse.org/images/og-image.jpg"><meta name=twitter:image content="https://www.eclipse.org/images/og-image.jpg"><meta name=twitter:card content="summary"><meta name=twitter:site content="@eclipsefdn"><meta name=twitter:creator content="@eclipsefdn"><meta property="og:url" content="https://www.eclipse.org/legal/epl-2.0/"><meta property="og:type" content="website"><meta property="og:site_name" content="Eclipse Foundation"><meta name=keywords content="epl,epl-2.0,legal,foundation,eclipse,eclipse public license,license,licenses"><meta name=generator content="Hugo 0.144.2"><link rel=canonical href=https://www.eclipse.org/legal/epl-2.0/><link rel=alternate href=/legal/epl-2.0/index.xml type=application/rss+xml title><link rel=stylesheet href="/public/css/styles.css?v=1772993988"><script>(function(e,t,n,s,o){e[s]=e[s]||[],e[s].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var a=t.getElementsByTagName(n)[0],i=t.createElement(n),r=s!="dataLayer"?"&l="+s:"";i.async=!0,i.src="https://www.googletagmanager.com/gtm.js?id="+o+r,a.parentNode.insertBefore(i,a)})(window,document,"script","dataLayer","GTM-5WLCZXC")</script><script>var tableClasses="table"</script><link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel=stylesheet type=text/css></head><body><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5WLCZXC" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript><a href=#main class=skip-link>Skip to content</a><div class=eclipsefdn-featured-story-banner data-publish-target=eclipse_org></div><header class="header-wrapper header-wrapper" id=header><div class="navigation-bar dark"><div class=container><div class=navigation-bar-inner><div class=navigation-bar-left><a class="focus-highlight focus-inverse" href=/><img class=navigation-bar-brand src=https://www.eclipse.org/eclipse.org-common/themes/solstice/public/images/logo/eclipse-foundation-white-orange.svg alt="Eclipse Foundation"></a></div><nav class="navigation-bar-nav hidden-xs hidden-sm"><ul><li><button type=button class="btn btn-link" data-target=join-us-menu>Join us</button></li><li><button type=button class="btn btn-link" data-target=what-we-do-menu>What we do</button></li><li><button type=button class="btn btn-link" data-target=resources-menu>Resources</button></li><li><button type=button class="btn btn-link" data-target=about-us-menu>About us</button></li></ul></nav><div class=navigation-bar-right><div class="navigation-bar-controls hidden-xs hidden-sm"><ul><li class=dropdown><a class="dropdown-toggle link-unstyled focus-highlight" tabindex=0 id=search-dropdown-toggle data-toggle=dropdown href=# aria-label=Search><i class="fa-solid fa-magnifying-glass" aria-hidden=true></i></a><form class="search-bar dropdown-menu dropdown-menu-right" aria-labelledby=search-dropdown-toggle action=https://www.eclipse.org/home/search/ method=get><input class=search-bar-input name=q placeholder=Search>
3
3
  <button class="btn btn-link" type=submit>
4
4
  <i class="fa-solid fa-arrow-right"></i></button></form></li><li class=dropdown><a class="dropdown-toggle focus-highlight" id=user-menu href=# data-toggle=dropdown aria-haspopup=true aria-expanded=false tabindex=0><i class="fa-regular fa-user" aria-hidden=true></i></a><ul class="dropdown-menu dropdown-menu-right" aria-labelledby=user-menu><li><a href=https://accounts.eclipse.org/user><i class="fa-solid fa-user margin-right-10" aria-hidden=true></i>
5
5
  View my account</a></li><li><a href=https://accounts.eclipse.org/user/edit><i class="fa-solid fa-edit margin-right-10" aria-hidden=true></i>
@@ -17,19 +17,23 @@ Manage cookies</a></li></ul></li></ul></div><div class="navigation-bar-ctas hidd
17
17
  <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-key-initiatives><li><a href=https://www.eclipse.org/topics/edge-and-iot/>Embedded & IoT</a></li><li><a href=https://www.eclipse.org/topics/cloud-native/>Enterprise Java</a></li><li><a href=https://dataspace.eclipse.org/>Data sovereignty</a></li><li><a href=https://www.eclipse.org/security/>Security & privacy</a></li><li><a href=https://www.eclipse.org/topics/ide/>Developer tools & IDEs</a></li><li><a href=https://aieclipse.org/ target=_blank>AI & emerging technologies</a></li><li><a href=https://www.eclipse.org/topics/automotive-and-mobility/>Automotive & mobility</a></li><li><a href=https://orcwg.org/ target=_blank>Policy & compliance</a></li></ul></li><li><a role=button href=#mobile-menu-strategic-services data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-strategic-services>Strategic services
18
18
  <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-strategic-services><li><a href=https://www.eclipse.org/research/>Transform research into open source</a></li><li><a href=https://www.eclipse.org/os4biz/services/>Engage professional services</a></li><li><a href=https://www.eclipse.org/os4biz/ospo/>Build your OSPO</a></li></ul></li></ul></li><li><a role=button href=#mobile-menu-resources data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-resources>Resources
19
19
  <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-resources><li><a role=button href=#mobile-menu-whats-happening data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-whats-happening>What's happening
20
- <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-whats-happening><li><a href=https://blogs.eclipse.org/>Read our blog</a></li><li><a href=https://accounts.eclipse.org/mailing-list>Join mailing lists</a></li><li><a href=https://newsroom.eclipse.org/>Get news updates</a></li><li><a href=https://www.eclipse.org/community/eclipse_newsletter>Subscribe to newsletter</a></li></ul></li><li><a role=button href=#mobile-menu-events data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-events>Events
20
+ <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-whats-happening><li><a href=https://blogs.eclipse.org/>Read our blog</a></li><li><a href=https://accounts.eclipse.org/mailing-list>Join mailing lists</a></li><li><a href=https://newsroom.eclipse.org/>Get news updates</a></li><li><a href=https://www.eclipse.org/community/eclipse_newsletter>Subscribe to newsletter</a></li><li><a href=https://opensourceglobalvoices.org/ target=_blank>Explore OSS global voices</a></li></ul></li><li><a role=button href=#mobile-menu-events data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-events>Events
21
21
  <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-events><li><a href=https://events.eclipse.org/>Explore events</a></li><li><a href=https://www.eclipse.org/events/open-community-meetups/>Join a community meetup</a></li><li><a href=https://www.eclipse.org/events/open-community-webinars/>Attend a webinar</a></li><li><a href=https://www.ocxconf.org/ target=_blank>Join OCX</a></li></ul></li><li><a role=button href=#mobile-menu-developer-resources data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-developer-resources>Developer resources
22
22
  <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-developer-resources><li><a href=https://www.eclipse.org/projects/>Explore projects hub</a></li><li><a href=https://www.eclipse.org/projects/calendar/#office-hours>Attend office hours</a></li><li><a href=https://www.eclipse.org/security/>Report a vulnerability</a></li><li><a href=https://www.eclipse.org/security/known/>View known vulnerabilities</a></li><li><a href=https://github.com/eclipse-csi/security-handbook/blob/main/docs/vulnerabilities/advisories.md target=_blank>Use the security handbook</a></li></ul></li><li><a role=button href=#mobile-menu-industry-intelligence-insights data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-industry-intelligence-insights>Industry insights
23
23
  <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-industry-intelligence-insights><li><a href=https://www.eclipse.org/org/value/#success_stories>View case studies</a></li><li><a href=https://www.eclipse.org/org/value/#whitepapers>View whitepapers</a></li><li><a href=https://www.eclipse.org/org/value/#surveyReports>View surveys & reports</a></li></ul></li><li><a role=button href=#mobile-menu-marketplaces data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-marketplaces>Marketplaces
24
- <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-marketplaces><li><a href=https://adoptium.net/>Adoptium</a></li><li><a href=https://marketplace.eclipse.org/>Eclipse IDE</a></li><li><a href=https://open-vsx.org/>Open VSX</a></li></ul></li></ul></li><li><a role=button href=#mobile-menu-about-us data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-about-us>About us
24
+ <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-marketplaces><li><a href=https://adoptium.net/marketplace target=_blank>Adoptium</a></li><li><a href=https://marketplace.eclipse.org/ target=_blank>Eclipse IDE</a></li><li><a href=https://open-vsx.org/ target=_blank>Open VSX</a></li></ul></li></ul></li><li><a role=button href=#mobile-menu-about-us data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-about-us>About us
25
25
  <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-about-us><li><a role=button href=#mobile-menu-the-foundation data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-the-foundation>The Foundation
26
26
  <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-the-foundation><li><a href=https://www.eclipse.org/about/>About</a></li><li><a href=https://www.eclipse.org/org/foundation/staff/>Meet the team</a></li><li><a href=https://www.eclipse.org/org/governance/>Board & governance</a></li></ul></li><li><a role=button href=#mobile-menu-our-members data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-our-members>Our members
27
27
  <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-our-members><li><a href=https://www.eclipse.org/membership/>Become a member</a></li><li><a href=https://www.eclipse.org/membership/explore-membership/>View member directory</a></li><li><a href=https://membership.eclipse.org/portal target=_blank>Access member portal</a></li></ul></li><li><a role=button href=#mobile-menu-sponsorship data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-sponsorship>Sponsorship
28
28
  <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-sponsorship><li><a href=https://www.eclipse.org/sponsor/>Become a sponsor</a></li><li><a href=https://www.eclipse.org/org/our-sponsors/>Sponsor directory</a></li></ul></li><li><a role=button href=#mobile-menu-more data-toggle=collapse aria-expanded=false aria-controls=mobile-menu-more>More
29
29
  <i class="fa-solid fa-chevron-down" aria-hidden=true></i></a><ul class=collapse id=mobile-menu-more><li><a href=https://www.eclipse.org/careers/>Join our team</a></li><li><a href=https://www.eclipse.org/org/artwork/>Explore our brand</a></li><li><a href=https://www.eclipse.org/org/foundation/contact.php>Contact us</a></li></ul></li></ul></li></ul></nav></div><div class=mega-menu><div class="menu hidden" id=join-us-menu><div class=container><nav><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-user-group" aria-hidden=true></i></span><h2 class=menu-heading>Membership</h2></div><ul><li><a href=https://www.eclipse.org/membership/>Become a member</a></li><li><a href=https://www.eclipse.org/membership#tab-fees>Review membership fees</a></li><li><a href=https://membership.eclipse.org/portal target=_blank>Access member portal</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-bookmark" aria-hidden=true></i></span><h2 class=menu-heading>Sponsorship</h2></div><ul><li><a href=https://www.eclipse.org/sponsor/>Support us as a sponsor</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-handshake-simple" aria-hidden=true></i></span><h2 class=menu-heading>Contribute</h2></div><ul><li><a href=https://www.eclipse.org/contribute/>How to contribute</a></li><li><a href=https://www.eclipse.org/projects/training/>Committer training</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-users" aria-hidden=true></i></span><h2 class=menu-heading>Collaborate with us</h2></div><ul><li><a href=https://www.eclipse.org/org/working-groups/explore/>Join an existing industry collaboration</a></li><li><a href=https://www.eclipse.org/collaborations/#start-collaboration>Start a new collaboration</a></li></ul></div></nav></div></div><div class="menu hidden" id=what-we-do-menu><div class=container><nav><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-puzzle-piece" aria-hidden=true></i></span><h2 class=menu-heading>Projects</h2></div><ul><li><a href=https://projects.eclipse.org/>Explore projects</a></li><li><a href=https://www.eclipse.org/specifications/>View specifications</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-building" aria-hidden=true></i></span><h2 class=menu-heading>Industry collaborations</h2></div><ul><li><a href=https://www.eclipse.org/org/working-groups/explore/>Explore collaborations</a></li><li><a href=https://www.eclipse.org/org/working-groups/about/>Join a working group</a></li><li><a href=https://www.eclipse.org/collaborations/interest-groups/>Join an interest group</a></li><li><a href=https://www.eclipse.org/org/value/>Read success stories</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-laptop-code" aria-hidden=true></i></span><h2 class=menu-heading>Core services</h2></div><ul><li><a href=https://www.eclipse.org/org/services/>Explore core services</a></li><li><a href=https://www.eclipse.org/security/>Ensure project security</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-bullseye" aria-hidden=true></i></span><h2 class=menu-heading>Key initiatives</h2></div><ul><li><a href=https://www.eclipse.org/topics/edge-and-iot/>Embedded & IoT</a></li><li><a href=https://www.eclipse.org/topics/cloud-native/>Enterprise Java</a></li><li><a href=https://dataspace.eclipse.org/>Data sovereignty</a></li><li><a href=https://www.eclipse.org/security/>Security & privacy</a></li><li><a href=https://www.eclipse.org/topics/ide/>Developer tools & IDEs</a></li><li><a href=https://aieclipse.org/ target=_blank>AI & emerging technologies</a>
30
30
  <i class="external-icon fa-solid fa-arrow-up-right-from-square" aria-hidden=true></i></li><li><a href=https://www.eclipse.org/topics/automotive-and-mobility/>Automotive & mobility</a></li><li><a href=https://orcwg.org/ target=_blank>Policy & compliance</a>
31
- <i class="external-icon fa-solid fa-arrow-up-right-from-square" aria-hidden=true></i></li></ul></div><div class=submenu style=grid-column:-3;margin-top:-20rem><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-flag" aria-hidden=true></i></span><h2 class=menu-heading>Strategic services</h2></div><ul><li><a href=https://www.eclipse.org/research/>Transform research into open source</a></li><li><a href=https://www.eclipse.org/os4biz/services/>Engage professional services</a></li><li><a href=https://www.eclipse.org/os4biz/ospo/>Build your OSPO</a></li></ul></div></nav></div></div><div class="menu hidden" id=resources-menu><div class=container><nav><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-bullhorn" aria-hidden=true></i></span><h2 class=menu-heading>What's happening</h2></div><ul><li><a href=https://blogs.eclipse.org/>Read our blog</a></li><li><a href=https://accounts.eclipse.org/mailing-list>Join mailing lists</a></li><li><a href=https://newsroom.eclipse.org/>Get news updates</a></li><li><a href=https://www.eclipse.org/community/eclipse_newsletter>Subscribe to newsletter</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-calendar-days" aria-hidden=true></i></span><h2 class=menu-heading>Events</h2></div><ul><li><a href=https://events.eclipse.org/>Explore events</a></li><li><a href=https://www.eclipse.org/events/open-community-meetups/>Join a community meetup</a></li><li><a href=https://www.eclipse.org/events/open-community-webinars/>Attend a webinar</a></li><li><a href=https://www.ocxconf.org/ target=_blank>Join OCX</a>
32
- <i class="external-icon fa-solid fa-arrow-up-right-from-square" aria-hidden=true></i></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-code" aria-hidden=true></i></span><h2 class=menu-heading>Developer resources</h2></div><ul><li><a href=https://www.eclipse.org/projects/>Explore projects hub</a></li><li><a href=https://www.eclipse.org/projects/calendar/#office-hours>Attend office hours</a></li><li><a href=https://www.eclipse.org/security/>Report a vulnerability</a></li><li><a href=https://www.eclipse.org/security/known/>View known vulnerabilities</a></li><li><a href=https://github.com/eclipse-csi/security-handbook/blob/main/docs/vulnerabilities/advisories.md target=_blank>Use the security handbook</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-gear" aria-hidden=true></i></span><h2 class=menu-heading>Industry insights</h2></div><ul><li><a href=https://www.eclipse.org/org/value/#success_stories>View case studies</a></li><li><a href=https://www.eclipse.org/org/value/#whitepapers>View whitepapers</a></li><li><a href=https://www.eclipse.org/org/value/#surveyReports>View surveys & reports</a></li></ul></div><div class=submenu style=grid-column:-2;margin-top:-6rem><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-store" aria-hidden=true></i></span><h2 class=menu-heading>Marketplaces</h2></div><ul><li><a href=https://adoptium.net/>Adoptium</a></li><li><a href=https://marketplace.eclipse.org/>Eclipse IDE</a></li><li><a href=https://open-vsx.org/>Open VSX</a></li></ul></div></nav></div></div><div class="menu hidden" id=about-us-menu><div class=container><nav><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-regular fa-moon rotate-90" aria-hidden=true></i></span><h2 class=menu-heading>The Foundation</h2></div><ul><li><a href=https://www.eclipse.org/about/>About</a></li><li><a href=https://www.eclipse.org/org/foundation/staff/>Meet the team</a></li><li><a href=https://www.eclipse.org/org/governance/>Board & governance</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-user-group" aria-hidden=true></i></span><h2 class=menu-heading>Our members</h2></div><ul><li><a href=https://www.eclipse.org/membership/>Become a member</a></li><li><a href=https://www.eclipse.org/membership/explore-membership/>View member directory</a></li><li><a href=https://membership.eclipse.org/portal target=_blank>Access member portal</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-regular fa-bookmark" aria-hidden=true></i></span><h2 class=menu-heading>Sponsorship</h2></div><ul><li><a href=https://www.eclipse.org/sponsor/>Become a sponsor</a></li><li><a href=https://www.eclipse.org/org/our-sponsors/>Sponsor directory</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-cube" aria-hidden=true></i></span><h2 class=menu-heading>More</h2></div><ul><li><a href=https://www.eclipse.org/careers/>Join our team</a></li><li><a href=https://www.eclipse.org/org/artwork/>Explore our brand</a></li><li><a href=https://www.eclipse.org/org/foundation/contact.php>Contact us</a></li></ul></div></nav></div></div></div></header><main id=main><nav aria-label=Breadcrumb><div class=container><ol class=breadcrumb><li><a href=https://www.eclipse.org/>Home</a></li><li><a href=https://www.eclipse.org/legal/>Eclipse Foundation Legal …</a></li><li class=active>Eclipse Public License 2.0 (EPL)</li></ol></div></nav><div class="container padding-bottom-30"><div class=row><div class=col-md-6><aside class=sidebar><a class="sidebar-toggle sidebar-toggle-open" type=button href=#sidebar-open><i class="fa-solid fa-bars" aria-hidden=true></i>
31
+ <i class="external-icon fa-solid fa-arrow-up-right-from-square" aria-hidden=true></i></li></ul></div><div class=submenu style=grid-column:-3;margin-top:-20rem><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-flag" aria-hidden=true></i></span><h2 class=menu-heading>Strategic services</h2></div><ul><li><a href=https://www.eclipse.org/research/>Transform research into open source</a></li><li><a href=https://www.eclipse.org/os4biz/services/>Engage professional services</a></li><li><a href=https://www.eclipse.org/os4biz/ospo/>Build your OSPO</a></li></ul></div></nav></div></div><div class="menu hidden" id=resources-menu><div class=container><nav><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-bullhorn" aria-hidden=true></i></span><h2 class=menu-heading>What's happening</h2></div><ul><li><a href=https://blogs.eclipse.org/>Read our blog</a></li><li><a href=https://accounts.eclipse.org/mailing-list>Join mailing lists</a></li><li><a href=https://newsroom.eclipse.org/>Get news updates</a></li><li><a href=https://www.eclipse.org/community/eclipse_newsletter>Subscribe to newsletter</a></li><li><a href=https://opensourceglobalvoices.org/ target=_blank>Explore OSS global voices</a>
32
+ <i class="external-icon fa-solid fa-arrow-up-right-from-square" aria-hidden=true></i></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-calendar-days" aria-hidden=true></i></span><h2 class=menu-heading>Events</h2></div><ul><li><a href=https://events.eclipse.org/>Explore events</a></li><li><a href=https://www.eclipse.org/events/open-community-meetups/>Join a community meetup</a></li><li><a href=https://www.eclipse.org/events/open-community-webinars/>Attend a webinar</a></li><li><a href=https://www.ocxconf.org/ target=_blank>Join OCX</a>
33
+ <i class="external-icon fa-solid fa-arrow-up-right-from-square" aria-hidden=true></i></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-code" aria-hidden=true></i></span><h2 class=menu-heading>Developer resources</h2></div><ul><li><a href=https://www.eclipse.org/projects/>Explore projects hub</a></li><li><a href=https://www.eclipse.org/projects/calendar/#office-hours>Attend office hours</a></li><li><a href=https://www.eclipse.org/security/>Report a vulnerability</a></li><li><a href=https://www.eclipse.org/security/known/>View known vulnerabilities</a></li><li><a href=https://github.com/eclipse-csi/security-handbook/blob/main/docs/vulnerabilities/advisories.md target=_blank>Use the security handbook</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-gear" aria-hidden=true></i></span><h2 class=menu-heading>Industry insights</h2></div><ul><li><a href=https://www.eclipse.org/org/value/#success_stories>View case studies</a></li><li><a href=https://www.eclipse.org/org/value/#whitepapers>View whitepapers</a></li><li><a href=https://www.eclipse.org/org/value/#surveyReports>View surveys & reports</a></li></ul></div><div class=submenu style=grid-column:-2;margin-top:-6rem><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-store" aria-hidden=true></i></span><h2 class=menu-heading>Marketplaces</h2></div><ul><li><a href=https://adoptium.net/marketplace target=_blank>Adoptium</a>
34
+ <i class="external-icon fa-solid fa-arrow-up-right-from-square" aria-hidden=true></i></li><li><a href=https://marketplace.eclipse.org/ target=_blank>Eclipse IDE</a>
35
+ <i class="external-icon fa-solid fa-arrow-up-right-from-square" aria-hidden=true></i></li><li><a href=https://open-vsx.org/ target=_blank>Open VSX</a>
36
+ <i class="external-icon fa-solid fa-arrow-up-right-from-square" aria-hidden=true></i></li></ul></div></nav></div></div><div class="menu hidden" id=about-us-menu><div class=container><nav><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-regular fa-moon rotate-90" aria-hidden=true></i></span><h2 class=menu-heading>The Foundation</h2></div><ul><li><a href=https://www.eclipse.org/about/>About</a></li><li><a href=https://www.eclipse.org/org/foundation/staff/>Meet the team</a></li><li><a href=https://www.eclipse.org/org/governance/>Board & governance</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-user-group" aria-hidden=true></i></span><h2 class=menu-heading>Our members</h2></div><ul><li><a href=https://www.eclipse.org/membership/>Become a member</a></li><li><a href=https://www.eclipse.org/membership/explore-membership/>View member directory</a></li><li><a href=https://membership.eclipse.org/portal target=_blank>Access member portal</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-regular fa-bookmark" aria-hidden=true></i></span><h2 class=menu-heading>Sponsorship</h2></div><ul><li><a href=https://www.eclipse.org/sponsor/>Become a sponsor</a></li><li><a href=https://www.eclipse.org/org/our-sponsors/>Sponsor directory</a></li></ul></div><div class=submenu><div class=menu-heading-group><span class=menu-pre><i class="fa-solid fa-cube" aria-hidden=true></i></span><h2 class=menu-heading>More</h2></div><ul><li><a href=https://www.eclipse.org/careers/>Join our team</a></li><li><a href=https://www.eclipse.org/org/artwork/>Explore our brand</a></li><li><a href=https://www.eclipse.org/org/foundation/contact.php>Contact us</a></li></ul></div></nav></div></div></div></header><main id=main><nav aria-label=Breadcrumb><div class=container><ol class=breadcrumb><li><a href=https://www.eclipse.org/>Home</a></li><li><a href=https://www.eclipse.org/legal/>Eclipse Foundation Legal …</a></li><li class=active>Eclipse Public License 2.0 (EPL)</li></ol></div></nav><div class="container padding-bottom-30"><div class=row><div class=col-md-6><aside class=sidebar><a class="sidebar-toggle sidebar-toggle-open" type=button href=#sidebar-open><i class="fa-solid fa-bars" aria-hidden=true></i>
33
37
  </a><a class="sidebar-toggle sidebar-toggle-close" type=button href=#sidebar-close><i class="fa-solid fa-close" aria-hidden=true></i></a><nav><ul class=sidebar-menu><li class=menu-group><a href=#legal data-toggle=collapse aria-expanded=true class=dropdown-toggle>Legal</a><ul class="collapse in" id=legal><li class=menu-subgroup><a href=#legal-eca data-toggle=collapse aria-expanded=false class=dropdown-toggle>ECA</a><ul class=collapse id=legal-eca><li><a href=/legal/eca>About</a></li><li><a href=https://accounts.eclipse.org/user/eca>Sign</a></li><li><a href=https://accounts.eclipse.org/user/eca>Validation Tool</a></li></ul></li><li class=menu-subgroup><a href=#legal-epl-20 data-toggle=collapse aria-expanded=false class=dropdown-toggle>EPL-2.0</a><ul class=collapse id=legal-epl-20><li><a href=/legal/epl-2.0/>About</a></li><li><a href=/org/documents/epl-2.0/EPL-2.0.html>Plain HTML</a></li><li><a href=/org/documents/epl-2.0/EPL-2.0.txt>Plain Text</a></li><li><a href=/org/documents/epl-2.0/EPL-2.0.pdf>PDF</a></li><li><a href=/legal/epl-2.0/faq/>FAQ</a></li></ul></li><li class=menu-subgroup><a href=#legal-epl-10 data-toggle=collapse aria-expanded=false class=dropdown-toggle>EPL-1.0</a><ul class=collapse id=legal-epl-10><li><a href=/org/documents/epl-1.0/>About</a></li><li><a href=/org/documents/epl-1.0/EPL-1.0.html>Plain HTML</a></li><li><a href=/org/documents/epl-1.0/EPL-1.0.txt>Plain Text</a></li><li><a href=/legal/epl/faq/>FAQ</a></li></ul></li><li class=menu-subgroup><a href=#legal-licenses data-toggle=collapse aria-expanded=false class=dropdown-toggle>Licenses</a><ul class=collapse id=legal-licenses><li><a href=/legal/licenses#approved>Approved 3rd Party</a></li><li><a href=/legal/licenses#nonapproved>Non Approved</a></li><li><a href=/projects/handbook/#ip-copyright-headers>File Headers</a></li><li><a href=/legal/non-code-licenses>Docs & Examples</a></li></ul></li><li class=menu-subgroup><a href=#legal-specs data-toggle=collapse aria-expanded=false class=dropdown-toggle>Specifications</a><ul class=collapse id=legal-specs><li><a href=/projects/efsp/>Specifications Process</a></li><li><a href=/projects/efsp/operations.php>Specifications Operations</a></li><li><a href=/legal/efsl>Specification License</a></li><li><a href=/legal/tck>TCK License</a></li></ul></li></ul></li></ul></nav></aside></div><div class=col-md-18><div id=content></div><script async src=/public/js/generate-body-content.js type=text/javascript></script></div></main><aside class=featured-footer id=featured-footer><div class="eclipsefdn-featured-footer container-fluid" data-publish-target=eclipse_org><div class=row><div class="col-sm-24 featured-container"></div></div></div></aside><footer class=footer><div class=container><div class=footer-inner><section class=links-section><ul><li>Eclipse Foundation</li><li><ul><li><a href=https://www.eclipse.org/org/>About</a></li><li><a href=https://projects.eclipse.org/>Projects</a></li><li><a href=https://www.eclipse.org/collaborations/>Collaborations</a></li><li><a href=https://www.eclipse.org/membership/>Membership</a></li><li><a href=https://www.eclipse.org/sponsor/>Sponsor</a></li></ul></li></ul><ul><li>Legal</li><li><ul><li><a href=https://www.eclipse.org/legal/privacy/>Privacy Policy</a></li><li><a href=https://www.eclipse.org/legal/terms-of-use/>Terms of Use</a></li><li><a href=https://www.eclipse.org/legal/compliance/>Compliance</a></li><li><a href=https://www.eclipse.org/org/documents/Community_Code_of_Conduct.php>Code of Conduct</a></li><li><a href=https://www.eclipse.org/legal/>Legal Resources</a></li><li><button type=button class="btn btn-link toolbar-manage-cookies">Manage Cookies</button></li></ul></li></ul><ul><li>More</li><li><ul><li><a href=https://www.eclipse.org/security/>Report a Vulnerability</a></li><li><a href=https://status.eclipse.org/>Service Status</a></li><li><a href=https://www.eclipse.org/org/foundation/contact.php>Contact Us</a></li><li><a href=https://www.eclipse.org/projects/support/>Support</a></li></ul></li></ul></section><section class=social-media-section><p class="subheading text-tertiary">See what we're up to</p><ul class=social-media-list><li><a href=https://x.com/EclipseFdn aria-label=X><span class=fa-stack><i class="fa-solid fa-circle fa-stack-2x" aria-hidden=true></i>
34
38
  <i class="fa-brands fa-x-twitter fa-stack-1x fa-inverse" aria-hidden=true></i></span></a></li><li><a href=https://bsky.app/profile/eclipse.org aria-label=Bluesky><span class=fa-stack><i class="fa-solid fa-circle fa-stack-2x" aria-hidden=true></i>
35
39
  <i class="fa-brands fa-bluesky fa-stack-1x fa-inverse" aria-hidden=true></i></span></a></li><li><a href=https://mastodon.social/@EclipseFdn aria-label=Mastodon><span class=fa-stack><i class="fa-solid fa-circle fa-stack-2x" aria-hidden=true></i>
@@ -39,4 +43,4 @@ Manage cookies</a></li></ul></li></ul></div><div class="navigation-bar-ctas hidd
39
43
  <i class="fa-brands fa-youtube fa-stack-1x fa-inverse" aria-hidden=true></i></span></a></li><li><a href=https://www.linkedin.com/company/eclipse-foundation aria-label=LinkedIn><span class=fa-stack><i class="fa-solid fa-circle fa-stack-2x" aria-hidden=true></i>
40
44
  <i class="fa-brands fa-linkedin-in fa-stack-1x fa-inverse" aria-hidden=true></i></span></a></li></ul></section><section class=newsletter-section><p class="subheading text-tertiary">Stay up to date</p><h2>Subscribe to our newsletter</h2><form class="newsletter-form margin-top-40" id=mc-embedded-subscribe-form action="https://eclipse.us6.list-manage.com/subscribe/post?u=eaf9e1f06f194eadc66788a85&amp;id=e7538485cd&amp;f_id=00f9c2e1f0" method=post novalidate target=_blank><div class=text-field-outlined><input name=EMAIL type=email placeholder="Your email">
41
45
  <button class=newsletter-form-submit type=submit name=subscribe id=mc-embedded-subscribe aria-label=Submit>
42
- <i class="fa-solid fa-arrow-right" aria-hidden=true></i></button></div></form></section><section class=footer-bottom-section><img class="img-responsive logo" src=https://www.eclipse.org/eclipse.org-common/themes/solstice/public/images/logo/eclipse-foundation-white.svg alt="Eclipse Foundation"><div class=legal-information><p>Copyright &copy; Eclipse Foundation AISBL. All rights reserved.</p><ul class=legal-links><li><a href=https://www.eclipse.org/legal/privacy/>Privacy policy</a></li><li><a href=https://www.eclipse.org/legal/terms-of-use/>Terms of use</a></li><li><a href=https://www.eclipse.org/legal/compliance/>Compliance</a></li><li><a href=https://www.eclipse.org/legal/>Legal</a></li></ul></div></section></div></div></footer><div id=footer-js><script src="/public/js/main.js?v1.0?v=1770578401"></script><script>(function(){})(jQuery,document)</script></div></body></html>
46
+ <i class="fa-solid fa-arrow-right" aria-hidden=true></i></button></div></form></section><section class=footer-bottom-section><img class="img-responsive logo" src=https://www.eclipse.org/eclipse.org-common/themes/solstice/public/images/logo/eclipse-foundation-white.svg alt="Eclipse Foundation"><div class=legal-information><p>Copyright &copy; Eclipse Foundation AISBL. All rights reserved.</p><ul class=legal-links><li><a href=https://www.eclipse.org/legal/privacy/>Privacy policy</a></li><li><a href=https://www.eclipse.org/legal/terms-of-use/>Terms of use</a></li><li><a href=https://www.eclipse.org/legal/compliance/>Compliance</a></li><li><a href=https://www.eclipse.org/legal/>Legal</a></li></ul></div></section></div></div></footer><div id=footer-js><script src="/public/js/main.js?v1.0?v=1772993988"></script><script>(function(){})(jQuery,document)</script></div></body></html>