diff --git a/404.html b/404.html index 362f670..4bc6667 100644 --- a/404.html +++ b/404.html @@ -3,14 +3,14 @@ -Page Not Found | Sift - - +Page Not Found | Sift + +
-
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + \ No newline at end of file diff --git a/CHANGELOG/index.html b/CHANGELOG/index.html index 1b04c01..95f91ef 100644 --- a/CHANGELOG/index.html +++ b/CHANGELOG/index.html @@ -3,14 +3,14 @@ -Changelog | Sift - - +Changelog | Sift + +
-
Skip to main content

Changelog

[0.0.6]

Added

  • Dictionary.withKeys by @sasial-dev to restrict what keys can appear in a given dictionary.

[0.0.5]

Added

  • Array.difference and Array.differenceSymmetric to find the difference between two or more arrays.
  • Set.difference and Set.differenceSymmetric to find the difference between two or more sets.

Fixed

  • Typings for Array.concat, which previously returned T[][] instead of T[].

[0.0.4]

  • Implemented Array.is: (value: any) -> boolean to check if a given value is an array.

[0.0.3]

Changed

  • If update is called with a key that doesn't exist in the specified dictionary, the key's value is set to the key itself. Fix by @reselim in PR #7.
  • Added aftman.toml and switched GitHub workflows over to use aftman.

[0.0.2]

Changed

  • Fixed a bug where Array.concat(Deep), Dictionary.merge(Deep) and Set.merge would not accept holes (nil values) in their arguments. This would cause the function to stop processing further arguments once it found a nil value.
  • Fixed a bug where Array.insert would not insert the element at the correct index. An index of 0 will now insert the element at the end of the array. length+1 will also insert the element at the end of the array. length+2 (or greater) will be ignored, and the original array will be returned.
  • Bumped tooling versions:
    • rojo to v7.1.1
    • stylua to v0.13.1
    • selene to v0.17.0

[0.0.1]

Added

  • Basic TypeScript (roblox-ts) support (no tsdoc yet)! 🎉
  • Implemented isEmpty
  • Added typings to equalObjects
  • Added aliases for Array.concat, Array.concatDeep, Array.push, Array.unshift, Array.find, Array.includes, Dictionary.join, Dictionary.joinDeep, Set.fromArray, Set.merge, Set.delete
  • Added doc pages for installation and usage samples

Changed

  • Exposed isEmpty and equalObjects from the root module
  • Improved typings for methods accepting predictes
  • Updated documentation for some methods
  • Fixed Dictionary.flatten being shown in the Array docs (wrong @within tag)

[0.0.0]

Initial development version.

- - +
Skip to main content

Changelog

[0.0.6]

Added

  • Dictionary.withKeys by @sasial-dev to restrict what keys can appear in a given dictionary.

[0.0.5]

Added

  • Array.difference and Array.differenceSymmetric to find the difference between two or more arrays.
  • Set.difference and Set.differenceSymmetric to find the difference between two or more sets.

Fixed

  • Typings for Array.concat, which previously returned T[][] instead of T[].

[0.0.4]

  • Implemented Array.is: (value: any) -> boolean to check if a given value is an array.

[0.0.3]

Changed

  • If update is called with a key that doesn't exist in the specified dictionary, the key's value is set to the key itself. Fix by @reselim in PR #7.
  • Added aftman.toml and switched GitHub workflows over to use aftman.

[0.0.2]

Changed

  • Fixed a bug where Array.concat(Deep), Dictionary.merge(Deep) and Set.merge would not accept holes (nil values) in their arguments. This would cause the function to stop processing further arguments once it found a nil value.
  • Fixed a bug where Array.insert would not insert the element at the correct index. An index of 0 will now insert the element at the end of the array. length+1 will also insert the element at the end of the array. length+2 (or greater) will be ignored, and the original array will be returned.
  • Bumped tooling versions:
    • rojo to v7.1.1
    • stylua to v0.13.1
    • selene to v0.17.0

[0.0.1]

Added

  • Basic TypeScript (roblox-ts) support (no tsdoc yet)! 🎉
  • Implemented isEmpty
  • Added typings to equalObjects
  • Added aliases for Array.concat, Array.concatDeep, Array.push, Array.unshift, Array.find, Array.includes, Dictionary.join, Dictionary.joinDeep, Set.fromArray, Set.merge, Set.delete
  • Added doc pages for installation and usage samples

Changed

  • Exposed isEmpty and equalObjects from the root module
  • Improved typings for methods accepting predictes
  • Updated documentation for some methods
  • Fixed Dictionary.flatten being shown in the Array docs (wrong @within tag)

[0.0.0]

Initial development version.

+ + \ No newline at end of file diff --git a/api/Array/index.html b/api/Array/index.html index 791c67b..6607cfe 100644 --- a/api/Array/index.html +++ b/api/Array/index.html @@ -3,7 +3,7 @@ -Array | SiftArray | Sift - - +`List`"> + +
-
Skip to main content

Array

+

Array

An array is a table consisting of index-value pairs. You don't need to manually specify the indices when you create an array. @@ -50,48 +50,104 @@

Aliases

List

-

Functions

count

Array.count(
array{T},-- -

The array to count the number of items in.

-
predicate?(
valueT,
indexnumber,
array{T}
) → any-- -

The predicate to use to filter the array.

-
) → number-- -

The number of items in the array.

+

Functions

concat

Array.concat(
......any-- +

The arrays to concatenate.

+
) → {T}-- +

The concatenated array.

-

Counts the number of items in an array.

-
local array = { 1, 2, 3 }
+

Joins multiple arrays together into a single array.

+

Aliases

+

join, merge

+
local table1 = { 1, 2, 3 }
+local table2 = { 4, 5, 6 }
 
-local value = Count(array) -- 3
-local value = Count(array, function(item, index)
-	return item == 2
-end) -- 1
+local new = Concat(table1, table2) -- { 1, 2, 3, 4, 5, 6 }
 
-

toSet

Array.toSet(
array{T}-- -

The array to convert to a set.

-
) → Set<T>-- -

The set.

+

sort

Array.sort(
array{T},-- +

The array to sort.

+
comparator?(
aT,
bT
) → boolean-- +

The comparator function.

+
) → {T}-- +

The sorted array.

-

Converts an array to a set.

-
local array = { "a", "b", "b", "c", "d" }
+

Sorts an array.

+
local array = { "a", "b", "c", "d", "e" }
 
-local set = ToSet(array) -- { a = true, b = true, c = true, d = true }
+local new = Sort(array, function(a, b)
+	return a > b
+end) -- { "e", "d", "c", "b", "a" }
 
-

concatDeep

Array.concatDeep(
......any-- -

The arrays to concatenate.

+

pop

Array.pop(
array{T},-- +

The array to pop an element from.

+
count?number=1-- +

The number of elements to pop.

) → {T}-- -

The concatenated array.

+

An array with the popped elements removed.

- Joins multiple arrays together into a single array, with deep copies of all - nested arrays. + Removes an element from the end of the array, and returns + the array with the popped elements removed.

+
local array = { 1, 2, 3 }
+
+local new = Pop(array) -- { 1, 2 }
+local new = Pop(array, 2) -- { 1 }
+
+

copy

Array.copy(
array{T}-- +

The array to copy.

+
) → {T}-- +

The copied array.

+
+

Copies an array.

+
local array = { 1, 2, 3 }
+
+local new = Copy(array) -- { 1, 2, 3 }
+
+print(new == array) -- false
+
+

push

Array.push(
array{T},-- +

The array to push an element to.

+
......T-- +

The elements to push.

+
) → {T}-- +

The array with the pushed elements.

+
+

Adds elements to the end of the array.

Aliases

-

joinDeep, mergeDeep

-
local table1 = { 1, 2, { 3, 4 } }
-local table2 = { 5, 6, { 7, 8 } }
+

append

+
local array = { 1, 2, 3 }
 
-local new = ConcatDeep(table1, table2) -- { 1, 2, { 3, 4 }, 5, 6, { 7, 8 } }
+local new = Push(array, 4, 5, 6) -- { 1, 2, 3, 4, 5, 6 }
 
-

find

Array.find(
array{T},-- +

update

Array.update(
array{T},-- +

The array to update.

+
indexnumber,-- +

The index to update.

+
updater?(
valueT,
indexnumber
) → T,-- +

The updater function.

+
callback?(indexnumber) → T-- +

The callback function.

+
) → {T}-- +

The updated array.

+
+

+ Updates an array at the given index. If the value at the given index does + not exist, callback will be called, and its return value will be used + as the value at the given index. +

+
local array = { 1, 2, 3 }
+
+local new = Update(array, 2, function(value)
+	return value + 1
+end) -- { 2, 3, 3 }
+
+local new = Update(array, 4, function(value)
+	return value + 1
+end, function(value)
+	return 10
+end) -- { 1, 2, 3, 10 }
+
+

find

Array.find(
array{T},--

The array to search.

value?any,--

The value to search for.

@@ -112,21 +168,7 @@

Aliases

local index = Find(array, "hello") -- 1 local index = Find(array, "hello", 2) -- 3
-

sort

Array.sort(
array{T},-- -

The array to sort.

-
comparator?(
aT,
bT
) → boolean-- -

The comparator function.

-
) → {T}-- -

The sorted array.

-
-

Sorts an array.

-
local array = { "a", "b", "c", "d", "e" }
-
-local new = Sort(array, function(a, b)
-	return a > b
-end) -- { "e", "d", "c", "b", "a" }
-
-

first

Array.first(
array{T}-- +

first

Array.first(
array{T}--

The array to get the first item from.

) → T--

The first item in the array.

@@ -136,37 +178,35 @@

Aliases

local value = First(array) -- 1 -

unshift

Array.unshift(
array{T},-- -

The array to insert the values to.

-
......T-- -

The values to insert.

-
) → {T}-- -

The array with the values inserted.

+

map

Array.map(
array{T},-- +

The array to map.

+
mapper(
valueT,
indexnumber,
array{T}
) → U?-- +

The mapper function.

+
) → {U}-- +

The mapped array.

-

Inserts values to the beginning of an array.

-

Aliases

-

prepend

+

Maps the array using the mapper function.

local array = { 1, 2, 3 }
 
-local new = Unshift(array, 4, 5) -- { 4, 5, 1, 2, 3 }
+local new = Map(array, function(value, index)
+	return value * 2
+end) -- { 2, 4, 6 }
 
-

pop

Array.pop(
array{T},-- -

The array to pop an element from.

-
count?number=1-- -

The number of elements to pop.

-
) → {T}-- -

An array with the popped elements removed.

+

is

Array.is(
objectany-- +

The object to check.

+
) → boolean-- +

Whether the object is an array.

-

- Removes an element from the end of the array, and returns - the array with the popped elements removed. -

+

Checks if the given object is an array.

local array = { 1, 2, 3 }
+local dictionary = { hello = "world" }
+local mixed = { 1, 2, hello = "world" }
 
-local new = Pop(array) -- { 1, 2 }
-local new = Pop(array, 2) -- { 1 }
+Array.is(array) -- true
+Array.is(dictionary) -- false
+Array.is(mixed) -- false
 
-

reverse

Array.reverse(
array{T}-- +

reverse

Array.reverse(
array{T}--

The array to reverse.

) → {T}--

The reversed array.

@@ -176,7 +216,38 @@

Aliases

local new = Reverse(array) -- { 3, 2, 1 }
-

includes

Array.includes(
array{T},-- +

zip

Array.zip(
...{any}-- +

The arrays to zip together.

+
) → {any}-- +

The zipped array.

+
+

Zips multiple arrays together into a single array.

+
local table1 = { 1, 2, 3 }
+local table2 = { "hello", "world", "goodbye" }
+
+local new = Zip(table1, table2) -- { { 1, "hello" }, { 2, "world" }, { 3, "goodbye" } }
+
+

flatten

Array.flatten(
array{T},-- +

The array to flatten.

+
depth?number-- +

The depth to flatten the array to.

+
) → {T}-- +

The flattened array.

+
+

+ Flattens an array. If depth is not specified, it will flatten + the array as far as it can go. +

+
local array = {
+	{ 1, 2, 3 },
+	{ 4, 5, 6 },
+	{ 7, { 8, 9 } },
+}
+
+local new = Flatten(array) -- { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
+local new = Flatten(array, 1) -- { 1, 2, 3, 4, 5, 6, 7, { 8, 9 } }
+
+

includes

Array.includes(
array{T},--

The array to search.

valueany,--

The value to search for.

@@ -197,87 +268,75 @@

Aliases

local value = Includes(array, "sift") -- false local value = Includes(array, "hello", 2) -- false -

zipAll

Array.zipAll(
......{any}-- -

The arrays to zip.

-
) → {any}-- -

The zipped array.

-
-

- Zips multiple arrays together into a single array, filling - in missing values with None. -

-
local table1 = { 1, 2, 3, 4 }
-local table2 = { "hello", "world", "goodbye" }
-
-local new = ZipAll(table1, table2) -- { { 1, "hello" }, { 2, "world" }, { 3, "goodbye" }, { 4, None } }
-
-

removeValue

Array.removeValue(
array{T},-- -

The array to remove the value from.

-
valueT-- -

The value to remove.

+

removeValues

Array.removeValues(
array{T},-- +

The array to remove values from.

+
...T-- +

The values to remove.

) → {T}-- -

The array with the value removed.

+

The array with the values removed.

-

Removes a value from an array.

-
local array = { 1, 2, 3 }
+

Removes values from an array.

+
local array = { "a", "b", "c", "c", "d", "e" }
 
-local new = RemoveValue(array, 2) -- { 1, 3 }
+local new = RemoveValues(array, "c", "d") -- { "a", "b", "e" }
 
-

is

Array.is(
objectany-- -

The object to check.

-
) → boolean-- -

Whether the object is an array.

+

create

Array.create(
lengthnumber,-- +

The length of the array to create.

+
value?T-- +

The value to fill the array with.

+
) → {T}-- +

The created array.

-

Checks if the given object is an array.

-
local array = { 1, 2, 3 }
-local dictionary = { hello = "world" }
-local mixed = { 1, 2, hello = "world" }
+

+ Creates an array of the given length, filled with the given value. + This is just a wrapper around table.create. +

+
local array = Create(3, "Hello")
 
-Array.is(array) -- true
-Array.is(dictionary) -- false
-Array.is(mixed) -- false
+print(array) -- { "Hello", "Hello", "Hello" }
 
-

copyDeep

Array.copyDeep(
array{T}-- -

The array to copy.

+

splice

Array.splice(
array{T},-- +

The array to splice.

+
start?number,-- +

The index to start splicing at (can be negative).

+
end?number,-- +

The index to end splicing at (can be negative).

+
......T-- +

The values to insert.

) → {T}-- -

The copied array.

+

The spliced array.

-

Copies an array, with deep copies of all nested arrays.

-
local array = { 1, 2, 3, { 4, 5 } }
-
-local result = CopyDeep(array) -- { 1, 2, 3, { 4, 5 } }
+

Splices an array.

+
local array = { 1, 2, 3, 4, 5 }
 
-print(result == array) -- false
-print(result[4] == array[4]) -- false
+local new = Splice(array, 3, 4, 6, 7) -- { 1, 2, 6, 7, 4, 5 }
+local new = Splice(array, -1, 0, 6, 7) -- { 1, 2, 3, 4, 6, 7 }
+local new = Splice(array, 4, -1, 6, 7) -- { 1, 2, 3, 6, 7, 5 }
 
-

map

Array.map(
array{T},-- -

The array to map.

-
mapper(
valueT,
indexnumber,
array{T}
) → U?-- -

The mapper function.

-
) → {U}-- -

The mapped array.

+

difference

Array.difference(
arrayArray<V>,-- +

The array to compare.

+
......Array<V>-- +

The arrays to compare against.

+
) → Array<V>-- +

The difference between the arrays.

-

Maps the array using the mapper function.

-
local array = { 1, 2, 3 }
+

Returns an array of values that are in the first array, but not in the other arrays.

+
local array1 = { "hello", "world" }
+local array2 = { "cat", "dog", "hello" }
 
-local new = Map(array, function(value, index)
-	return value * 2
-end) -- { 2, 4, 6 }
+local difference = Difference(array1, array2) -- { "world" }
 
-

freeze

Array.freeze(
array{T}-- -

The array to freeze.

-
) → {T}-- -

The frozen array.

+

last

Array.last(
array{T}-- +

The array to get the last element of.

+
) → T-- +

The last element of the array.

-

Freezes the top level of the array, making it read-only.

-
local array = { 1, 2, 3, { 4, 5, 6 } }
-
-local new = Freeze(array)
+

Gets the last element of the array.

+
local array = { 1, 2, 3 }
 
-new[1] = 4 -- error!
-new[4][1] = 7 -- still works!
+local value = Last(array) -- 3
 
-

removeIndex

Array.removeIndex(
array{T},-- +

removeIndex

Array.removeIndex(
array{T},--

The array to remove the value from.

indexnumber--

The index to remove the value from (can be negative).

@@ -290,122 +349,83 @@

Aliases

local new = RemoveIndex(array, 1) -- { 2, 3 } local new = RemoveIndex(array, -1) -- { 1, 3 }
-

removeValues

Array.removeValues(
array{T},-- -

The array to remove values from.

-
...T-- -

The values to remove.

-
) → {T}-- -

The array with the values removed.

-
-

Removes values from an array.

-
local array = { "a", "b", "c", "c", "d", "e" }
-
-local new = RemoveValues(array, "c", "d") -- { "a", "b", "e" }
-
-

equals

Array.equals(
......{any}-- -

The arrays to compare.

-
) → boolean-- -

Whether the arrays are equal.

-
-

Compares two arrays for equality.

-
local array = { 1, 2, 3 }
-local other = { 1, 2, 3 }
-
-local value = Equals(array, other) -- true
-local value = Equals(array, other, { 1, 2, 3 }) -- true
-local value = Equals(array, other, { 1, 2, 4 }) -- false
-
-

flatten

Array.flatten(
array{T},-- -

The array to flatten.

-
depth?number-- -

The depth to flatten the array to.

-
) → {T}-- -

The flattened array.

+

toSet

Array.toSet(
array{T}-- +

The array to convert to a set.

+
) → Set<T>-- +

The set.

-

- Flattens an array. If depth is not specified, it will flatten - the array as far as it can go. -

-
local array = {
-	{ 1, 2, 3 },
-	{ 4, 5, 6 },
-	{ 7, { 8, 9 } },
-}
+

Converts an array to a set.

+
local array = { "a", "b", "b", "c", "d" }
 
-local new = Flatten(array) -- { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
-local new = Flatten(array, 1) -- { 1, 2, 3, 4, 5, 6, 7, { 8, 9 } }
+local set = ToSet(array) -- { a = true, b = true, c = true, d = true }
 
-

update

Array.update(
array{T},-- -

The array to update.

-
indexnumber,-- -

The index to update.

-
updater?(
valueT,
indexnumber
) → T,-- -

The updater function.

-
callback?(indexnumber) → T-- -

The callback function.

+

removeValue

Array.removeValue(
array{T},-- +

The array to remove the value from.

+
valueT-- +

The value to remove.

) → {T}-- -

The updated array.

+

The array with the value removed.

-

- Updates an array at the given index. If the value at the given index does - not exist, callback will be called, and its return value will be used - as the value at the given index. -

+

Removes a value from an array.

local array = { 1, 2, 3 }
 
-local new = Update(array, 2, function(value)
-	return value + 1
-end) -- { 2, 3, 3 }
-
-local new = Update(array, 4, function(value)
-	return value + 1
-end, function(value)
-	return 10
-end) -- { 1, 2, 3, 10 }
+local new = RemoveValue(array, 2) -- { 1, 3 }
 
-

some

Array.some(
array{T},-- -

The array to check.

-
predicate(
valueT,
indexnumber,
array{T}
) → any-- +

findWhere

Array.findWhere(
array{T},-- +

The array to search.

+
predicate(
valueT,
indexnumber,
array{T}
) → any,--

The predicate to use to check the array.

-
) → boolean-- -

Whether some item in the array passes the predicate.

+
from?number-- +

The index to start searching from.

+
) → number-- +

The index of the first item in the array that matches the predicate.

-

Checks whether some item in the array passes the predicate.

+

Finds the index of the first item in the array that passes the predicate.

local array = { 1, 2, 3 }
 
-local value = Some(array, function(item, index)
+local index = FindWhere(array, function(item, index)
 	return item > 1
-end) -- true
-
-local value = Some(array, function(item, index)
-	return item > 3
-end) -- false
+end) -- 2
 
-

push

Array.push(
array{T},-- -

The array to push an element to.

-
......T-- -

The elements to push.

-
) → {T}-- -

The array with the pushed elements.

+

reduceRight

Array.reduceRight(
array{T},-- +

The array to reduce.

+
reducer(
accumulatorU,
valueT,
indexnumber,
array{T}
) → U,-- +

The reducer to use.

+
initialReduction?U={T}[#{T}]-- +

The initial accumulator value.

+
) → U-- +

The final accumulator value.

-

Adds elements to the end of the array.

-

Aliases

-

append

+

+ Reduces the array using the given reducer and initial accumulator value, + starting from the end of the array. If no initialReduction value is given, + the last item in the array is used. +

local array = { 1, 2, 3 }
 
-local new = Push(array, 4, 5, 6) -- { 1, 2, 3, 4, 5, 6 }
+local value = ReduceRight(array, function(accumulator, item, index)
+	return accumulator - item
+end) -- 0
+
+local value = ReduceRight(array, function(accumulator, item, index)
+	table.insert(accumulator, item)
+	return accumulator
+end, {}) -- { 3, 2, 1 }
 
-

shuffle

Array.shuffle(
array{T}-- -

The array to shuffle.

-
) → {T}-- -

The shuffled array.

+

at

Array.at(
array{T},-- +

The array to get the value from.

+
indexnumber-- +

The index to get the value from (can be negative).

+
) → T-- +

The value at the given index.

-

Randomises the order of the items in an array.

+

Gets a value from an array at the given index.

local array = { 1, 2, 3 }
 
-local new = Shuffle(array) -- { 2, 3, 1 }
+local value = At(array, 1) -- 1
+local value = At(array, 0) -- 3
 
-

filter

Array.filter(
array{T},-- +

filter

Array.filter(
array{T},--

The array to filter.

filterer?(
valueT,
indexnumber,
array{T}
) → any--

The callback to use to filter the array.

@@ -420,86 +440,88 @@

Aliases

return item > 1 end) -- { 2, 3 }
-

findWhere

Array.findWhere(
array{T},-- -

The array to search.

-
predicate(
valueT,
indexnumber,
array{T}
) → any,-- +

every

Array.every(
array{T},-- +

The array to check.

+
predicate(
valueT,
indexnumber,
array{T}
) → any--

The predicate to use to check the array.

-
from?number-- -

The index to start searching from.

-
) → number-- -

The index of the first item in the array that matches the predicate.

+
) → boolean-- +

Whether every item in the array passes the predicate.

-

Finds the index of the first item in the array that passes the predicate.

+

Checks whether every item in the array passes the predicate.

local array = { 1, 2, 3 }
 
-local index = FindWhere(array, function(item, index)
+local value = Every(array, function(item, index)
+	return item > 0
+end) -- true
+
+local value = Every(array, function(item, index)
 	return item > 1
-end) -- 2
+end) -- false
 
-

splice

Array.splice(
array{T},-- -

The array to splice.

-
start?number,-- -

The index to start splicing at (can be negative).

-
end?number,-- -

The index to end splicing at (can be negative).

-
......T-- -

The values to insert.

+

copyDeep

Array.copyDeep(
array{T}-- +

The array to copy.

) → {T}-- -

The spliced array.

+

The copied array.

-

Splices an array.

-
local array = { 1, 2, 3, 4, 5 }
+

Copies an array, with deep copies of all nested arrays.

+
local array = { 1, 2, 3, { 4, 5 } }
 
-local new = Splice(array, 3, 4, 6, 7) -- { 1, 2, 6, 7, 4, 5 }
-local new = Splice(array, -1, 0, 6, 7) -- { 1, 2, 3, 4, 6, 7 }
-local new = Splice(array, 4, -1, 6, 7) -- { 1, 2, 3, 6, 7, 5 }
+local result = CopyDeep(array) -- { 1, 2, 3, { 4, 5 } }
+
+print(result == array) -- false
+print(result[4] == array[4]) -- false
 
-

at

Array.at(
array{T},-- -

The array to get the value from.

-
indexnumber-- -

The index to get the value from (can be negative).

-
) → T-- -

The value at the given index.

+

unshift

Array.unshift(
array{T},-- +

The array to insert the values to.

+
......T-- +

The values to insert.

+
) → {T}-- +

The array with the values inserted.

-

Gets a value from an array at the given index.

+

Inserts values to the beginning of an array.

+

Aliases

+

prepend

local array = { 1, 2, 3 }
 
-local value = At(array, 1) -- 1
-local value = At(array, 0) -- 3
+local new = Unshift(array, 4, 5) -- { 4, 5, 1, 2, 3 }
 
-

shift

Array.shift(
array{T},-- -

The array to shift.

-
count?number-- -

The number of items to shift.

+

shuffle

Array.shuffle(
array{T}-- +

The array to shuffle.

) → {T}-- -

The shifted array.

+

The shuffled array.

-

- Removes the first item from an array and returns the array - with the item removed. -

+

Randomises the order of the items in an array.

local array = { 1, 2, 3 }
 
-local new = Shift(array) -- { 2, 3 }
-local new = Shift(array, 2) -- { 3 }
+local new = Shuffle(array) -- { 2, 3, 1 }
+
+

equalsDeep

Array.equalsDeep(
......{any}-- +

The arrays to compare.

+
) → boolean-- +

Whether the arrays are equal.

+
+

Compares two arrays for equality using deep comparison.

+
local array = { 1, 2, 3, { 4, 5 } }
+local other = { 1, 2, 3, { 4, 5 } }
+
+local value = EqualsDeep(array, other) -- true
+local value = EqualsDeep(array, other, { 1, 2, 3, { 4, 5 } }) -- true
+local value = EqualsDeep(array, other, { 1, 2, 3, { 4, 6 } }) -- false
 
-

freezeDeep

Array.freezeDeep(
array{T}-- +

freeze

Array.freeze(
array{T}--

The array to freeze.

) → {T}--

The frozen array.

-

- Freezes the entire array, making it read-only, including all - nested arrays. -

+

Freezes the top level of the array, making it read-only.

local array = { 1, 2, 3, { 4, 5, 6 } }
 
-local new = FreezeDeep(array)
+local new = Freeze(array)
 
 new[1] = 4 -- error!
-new[4][1] = 7 -- error!
+new[4][1] = 7 -- still works!
 
-

removeIndices

Array.removeIndices(
array{T},-- +

removeIndices

Array.removeIndices(
array{T},--

The array to remove the indices from.

......number--

The indices to remove the values from (can be negative).

@@ -512,44 +534,7 @@

Aliases

local new = RemoveIndices(array, 1, 2) -- { 3 } local new = RemoveIndices(array, 0, -1) -- { 1 } -

concat

Array.concat(
......any-- -

The arrays to concatenate.

-
) → {T}-- -

The concatenated array.

-
-

Joins multiple arrays together into a single array.

-

Aliases

-

join, merge

-
local table1 = { 1, 2, 3 }
-local table2 = { 4, 5, 6 }
-
-local new = Concat(table1, table2) -- { 1, 2, 3, 4, 5, 6 }
-
-

reduce

Array.reduce(
array{T},-- -

The array to reduce.

-
reducer(
accumulatorU,
valueT,
indexnumber,
array{T}
) → U,-- -

The reducer to use.

-
initialReduction?U={T}[1]-- -

The initial accumulator value.

-
) → U-- -

The final accumulator value.

-
-

- Reduces the array using the given reducer and initial accumulator value. - If no initialReduction value is given, the first item in the array is used. -

-
local array = { 1, 2, 3 }
-
-local value = Reduce(array, function(accumulator, item, index)
-	return accumulator - item
-end) -- -4
-
-local value = Reduce(array, function(accumulator, item, index)
-	table.insert(accumulator, item)
-	return accumulator
-end, {}) -- { 1, 2, 3 }
-
-

set

Array.set(
array{T},-- +

set

Array.set(
array{T},--

The array to set the value on.

indexnumber,--

The index to set the value at (can be negative).

@@ -564,102 +549,126 @@

Aliases

local new = Set(array, 2, 4) -- { 1, 4, 3 } local new = Set(array, -1, 4) -- { 1, 2, 4 }
-

insert

Array.insert(
array{T},-- -

The array to insert the value into.

-
indexnumber,-- -

The index to insert the value at (can be negative).

-
values...T-- -

The values to insert.

-
) → {T}-- -

The array with the value inserted.

-
-

Inserts the given values into an array at the given index, shifting all values after it to the right. If the index is negative (or 0), it is counted from the end of the array.

-

If the index to insert at is out of range, the array is not modified.

-
local array = { 1, 2, 3 }
-
-local newArray = Insert(array, 2, 4) -- { 1, 4, 2, 3 }
-
-

last

Array.last(
array{T}-- -

The array to get the last element of.

-
) → T-- -

The last element of the array.

+

count

Array.count(
array{T},-- +

The array to count the number of items in.

+
predicate?(
valueT,
indexnumber,
array{T}
) → any-- +

The predicate to use to filter the array.

+
) → number-- +

The number of items in the array.

-

Gets the last element of the array.

+

Counts the number of items in an array.

local array = { 1, 2, 3 }
 
-local value = Last(array) -- 3
+local value = Count(array) -- 3
+local value = Count(array, function(item, index)
+	return item == 2
+end) -- 1
 
-

copy

Array.copy(
array{T}-- -

The array to copy.

+

shift

Array.shift(
array{T},-- +

The array to shift.

+
count?number-- +

The number of items to shift.

) → {T}-- -

The copied array.

+

The shifted array.

-

Copies an array.

+

+ Removes the first item from an array and returns the array + with the item removed. +

local array = { 1, 2, 3 }
 
-local new = Copy(array) -- { 1, 2, 3 }
-
-print(new == array) -- false
+local new = Shift(array) -- { 2, 3 }
+local new = Shift(array, 2) -- { 3 }
 
-

every

Array.every(
array{T},-- -

The array to check.

-
predicate(
valueT,
indexnumber,
array{T}
) → any-- +

findWhereLast

Array.findWhereLast(
array{T},-- +

The array to search.

+
predicate(
valueT,
indexnumber,
array{T}
) → any,--

The predicate to use to check the array.

-
) → boolean-- -

Whether every item in the array passes the predicate.

+
from?number-- +

The index to start searching from.

+
) → number-- +

The index of the last item in the array that matches the predicate.

-

Checks whether every item in the array passes the predicate.

-
local array = { 1, 2, 3 }
+

Finds the index of the last item in the array that passes the predicate.

+
local array = { "hello", "world", "hello" }
 
-local value = Every(array, function(item, index)
-	return item > 0
-end) -- true
+local index = FindWhereLast(array, function(item, index)
+	return item == "hello"
+end) -- 3
 
-local value = Every(array, function(item, index)
-	return item > 1
-end) -- false
+local index = FindWhereLast(array, function(item, index)
+	return item == "hello"
+end, 2) -- 1
 
-

reduceRight

Array.reduceRight(
array{T},-- +

reduce

Array.reduce(
array{T},--

The array to reduce.

reducer(
accumulatorU,
valueT,
indexnumber,
array{T}
) → U,--

The reducer to use.

-
initialReduction?U={T}[#{T}]-- +
initialReduction?U={T}[1]--

The initial accumulator value.

) → U--

The final accumulator value.

- Reduces the array using the given reducer and initial accumulator value, - starting from the end of the array. If no initialReduction value is given, - the last item in the array is used. + Reduces the array using the given reducer and initial accumulator value. + If no initialReduction value is given, the first item in the array is used.

local array = { 1, 2, 3 }
 
-local value = ReduceRight(array, function(accumulator, item, index)
+local value = Reduce(array, function(accumulator, item, index)
 	return accumulator - item
-end) -- 0
+end) -- -4
 
-local value = ReduceRight(array, function(accumulator, item, index)
+local value = Reduce(array, function(accumulator, item, index)
 	table.insert(accumulator, item)
 	return accumulator
-end, {}) -- { 3, 2, 1 }
+end, {}) -- { 1, 2, 3 }
+
+

equals

Array.equals(
......{any}-- +

The arrays to compare.

+
) → boolean-- +

Whether the arrays are equal.

+
+

Compares two arrays for equality.

+
local array = { 1, 2, 3 }
+local other = { 1, 2, 3 }
+
+local value = Equals(array, other) -- true
+local value = Equals(array, other, { 1, 2, 3 }) -- true
+local value = Equals(array, other, { 1, 2, 4 }) -- false
+
+

concatDeep

Array.concatDeep(
......any-- +

The arrays to concatenate.

+
) → {T}-- +

The concatenated array.

+
+

+ Joins multiple arrays together into a single array, with deep copies of all + nested arrays. +

+

Aliases

+

joinDeep, mergeDeep

+
local table1 = { 1, 2, { 3, 4 } }
+local table2 = { 5, 6, { 7, 8 } }
+
+local new = ConcatDeep(table1, table2) -- { 1, 2, { 3, 4 }, 5, 6, { 7, 8 } }
 
-

create

Array.create(
lengthnumber,-- -

The length of the array to create.

-
value?T-- -

The value to fill the array with.

-
) → {T}-- -

The created array.

+

findLast

Array.findLast(
array{T},-- +

The array to search.

+
value?any,-- +

The value to search for.

+
from?number-- +

The index to start searching from.

+
) → number?-- +

The index of the last item in the array that matches the value.

-

- Creates an array of the given length, filled with the given value. - This is just a wrapper around table.create. -

-
local array = Create(3, "Hello")
+

Finds the index of the last item in the array that matches the value.

+
local array = { "hello", "world", "hello" }
 
-print(array) -- { "Hello", "Hello", "Hello" }
+local index = FindLast(array, "hello") -- 3
+local index = FindLast(array, "hello", 2) -- 1
 
-

slice

Array.slice(
array{T},-- +

slice

Array.slice(
array{T},--

The array to slice.

from?number,--

The index to start from (can be negative).

@@ -675,51 +684,21 @@

Aliases

local new = Slice(array, -2, -1) -- { 3, 4 } local new = Slice(array, 3) -- { 3, 4, 5 }
-

difference

Array.difference(
arrayArray<V>,-- -

The array to compare.

-
......Array<V>-- -

The arrays to compare against.

-
) → Array<V>-- -

The difference between the arrays.

-
-

Returns an array of values that are in the first array, but not in the other arrays.

-
local array1 = { "hello", "world" }
-local array2 = { "cat", "dog", "hello" }
-
-local difference = Difference(array1, array2) -- { "world" }
-
-

findWhereLast

Array.findWhereLast(
array{T},-- -

The array to search.

-
predicate(
valueT,
indexnumber,
array{T}
) → any,-- -

The predicate to use to check the array.

-
from?number-- -

The index to start searching from.

-
) → number-- -

The index of the last item in the array that matches the predicate.

-
-

Finds the index of the last item in the array that passes the predicate.

-
local array = { "hello", "world", "hello" }
-
-local index = FindWhereLast(array, function(item, index)
-	return item == "hello"
-end) -- 3
-
-local index = FindWhereLast(array, function(item, index)
-	return item == "hello"
-end, 2) -- 1
-
-

zip

Array.zip(
...{any}-- -

The arrays to zip together.

+

zipAll

Array.zipAll(
......{any}-- +

The arrays to zip.

) → {any}--

The zipped array.

-

Zips multiple arrays together into a single array.

-
local table1 = { 1, 2, 3 }
+

+ Zips multiple arrays together into a single array, filling + in missing values with None. +

+
local table1 = { 1, 2, 3, 4 }
 local table2 = { "hello", "world", "goodbye" }
 
-local new = Zip(table1, table2) -- { { 1, "hello" }, { 2, "world" }, { 3, "goodbye" } }
+local new = ZipAll(table1, table2) -- { { 1, "hello" }, { 2, "world" }, { 3, "goodbye" }, { 4, None } }
 
-

differenceSymmetric

Array.differenceSymmetric(
arrayArray<V>,-- +

differenceSymmetric

Array.differenceSymmetric(
arrayArray<V>,--

The array to compare.

......Array<V>--

The arrays to compare against.

@@ -732,88 +711,60 @@

Aliases

local difference = DifferenceSymmetric(array1, array2) -- { "world", "cat", "dog" }
-

equalsDeep

Array.equalsDeep(
......{any}-- -

The arrays to compare.

+

some

Array.some(
array{T},-- +

The array to check.

+
predicate(
valueT,
indexnumber,
array{T}
) → any-- +

The predicate to use to check the array.

) → boolean-- -

Whether the arrays are equal.

+

Whether some item in the array passes the predicate.

-

Compares two arrays for equality using deep comparison.

-
local array = { 1, 2, 3, { 4, 5 } }
-local other = { 1, 2, 3, { 4, 5 } }
+

Checks whether some item in the array passes the predicate.

+
local array = { 1, 2, 3 }
 
-local value = EqualsDeep(array, other) -- true
-local value = EqualsDeep(array, other, { 1, 2, 3, { 4, 5 } }) -- true
-local value = EqualsDeep(array, other, { 1, 2, 3, { 4, 6 } }) -- false
+local value = Some(array, function(item, index)
+	return item > 1
+end) -- true
+
+local value = Some(array, function(item, index)
+	return item > 3
+end) -- false
 
-

findLast

Array.findLast(
array{T},-- -

The array to search.

-
value?any,-- -

The value to search for.

-
from?number-- -

The index to start searching from.

-
) → number?-- -

The index of the last item in the array that matches the value.

+

insert

Array.insert(
array{T},-- +

The array to insert the value into.

+
indexnumber,-- +

The index to insert the value at (can be negative).

+
values...T-- +

The values to insert.

+
) → {T}-- +

The array with the value inserted.

-

Finds the index of the last item in the array that matches the value.

-
local array = { "hello", "world", "hello" }
+

Inserts the given values into an array at the given index, shifting all values after it to the right. If the index is negative (or 0), it is counted from the end of the array.

+

If the index to insert at is out of range, the array is not modified.

+
local array = { 1, 2, 3 }
 
-local index = FindLast(array, "hello") -- 3
-local index = FindLast(array, "hello", 2) -- 1
+local newArray = Insert(array, 2, 4) -- { 1, 4, 2, 3 }
+
+

freezeDeep

Array.freezeDeep(
array{T}-- +

The array to freeze.

+
) → {T}-- +

The frozen array.

+
+

+ Freezes the entire array, making it read-only, including all + nested arrays. +

+
local array = { 1, 2, 3, { 4, 5, 6 } }
+
+local new = FreezeDeep(array)
+
+new[1] = 4 -- error!
+new[4][1] = 7 -- error!
 
Show raw api
{
     "functions": [
         {
-            "name": "count",
-            "desc": "Counts the number of items in an array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = Count(array) -- 3\nlocal value = Count(array, function(item, index)\n\treturn item == 2\nend) -- 1\n```",
-            "params": [
-                {
-                    "name": "array",
-                    "desc": "The array to count the number of items in.",
-                    "lua_type": "{T}"
-                },
-                {
-                    "name": "predicate?",
-                    "desc": "The predicate to use to filter the array.",
-                    "lua_type": "(value: T, index: number, array: {T}) -> any"
-                }
-            ],
-            "returns": [
-                {
-                    "desc": "The number of items in the array.",
-                    "lua_type": "number"
-                }
-            ],
-            "function_type": "static",
-            "source": {
-                "line": 25,
-                "path": "src/Array/count.lua"
-            }
-        },
-        {
-            "name": "toSet",
-            "desc": "Converts an array to a set.\n\n```lua\nlocal array = { \"a\", \"b\", \"b\", \"c\", \"d\" }\n\nlocal set = ToSet(array) -- { a = true, b = true, c = true, d = true }\n```",
-            "params": [
-                {
-                    "name": "array",
-                    "desc": "The array to convert to a set.",
-                    "lua_type": "{T}"
-                }
-            ],
-            "returns": [
-                {
-                    "desc": "The set.",
-                    "lua_type": "Set<T>"
-                }
-            ],
-            "function_type": "static",
-            "source": {
-                "line": 20,
-                "path": "src/Array/toSet.lua"
-            }
-        },
-        {
-            "name": "concatDeep",
-            "desc": "Joins multiple arrays together into a single array, with deep copies of all\nnested arrays.\n\n#### Aliases\n\n`joinDeep`, `mergeDeep`\n\n```lua\nlocal table1 = { 1, 2, { 3, 4 } }\nlocal table2 = { 5, 6, { 7, 8 } }\n\nlocal new = ConcatDeep(table1, table2) -- { 1, 2, { 3, 4 }, 5, 6, { 7, 8 } }\n```",
+            "name": "concat",
+            "desc": "Joins multiple arrays together into a single array.\n\n#### Aliases\n\n`join`, `merge`\n\n```lua\nlocal table1 = { 1, 2, 3 }\nlocal table2 = { 4, 5, 6 }\n\nlocal new = Concat(table1, table2) -- { 1, 2, 3, 4, 5, 6 }\n```",
             "params": [
                 {
                     "name": "...",
@@ -829,40 +780,8 @@ 

Aliases

], "function_type": "static", "source": { - "line": 28, - "path": "src/Array/concatDeep.lua" - } - }, - { - "name": "find", - "desc": "Finds the index of the first item in the array that matches the value. This is\nmostly a wrapper around `table.find`, with the ability to specify a negative\nnumber as the start index (to search relative to the end of the array).\n\n#### Aliases\n`indexOf`\n\n```lua\nlocal array = { \"hello\", \"world\", \"hello\" }\n\nlocal index = Find(array, \"hello\") -- 1\nlocal index = Find(array, \"hello\", 2) -- 3\n```", - "params": [ - { - "name": "array", - "desc": "The array to search.", - "lua_type": "{T}" - }, - { - "name": "value?", - "desc": "The value to search for.", - "lua_type": "any" - }, - { - "name": "from?", - "desc": "The index to start searching from.", - "lua_type": "number" - } - ], - "returns": [ - { - "desc": "The index of the first item in the array that matches the value.", - "lua_type": "number?" - } - ], - "function_type": "static", - "source": { - "line": 25, - "path": "src/Array/find.lua" + "line": 26, + "path": "src/Array/concat.lua" } }, { @@ -893,106 +812,121 @@

Aliases

} }, { - "name": "first", - "desc": "Gets the first item in the array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = First(array) -- 1\n```", + "name": "pop", + "desc": "Removes an element from the end of the array, and returns\nthe array with the popped elements removed.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Pop(array) -- { 1, 2 }\nlocal new = Pop(array, 2) -- { 1 }\n```", "params": [ { "name": "array", - "desc": "The array to get the first item from.", + "desc": "The array to pop an element from.", "lua_type": "{T}" + }, + { + "name": "count?", + "desc": "The number of elements to pop.", + "lua_type": "number = 1" } ], "returns": [ { - "desc": "The first item in the array.", - "lua_type": "T" + "desc": "An array with the popped elements removed.", + "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 19, - "path": "src/Array/first.lua" + "line": 20, + "path": "src/Array/pop.lua" } }, { - "name": "unshift", - "desc": "Inserts values to the beginning of an array.\n\n#### Aliases\n\n`prepend`\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Unshift(array, 4, 5) -- { 4, 5, 1, 2, 3 }\n```", + "name": "copy", + "desc": "Copies an array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Copy(array) -- { 1, 2, 3 }\n\nprint(new == array) -- false\n```", "params": [ { "name": "array", - "desc": "The array to insert the values to.", + "desc": "The array to copy.", "lua_type": "{T}" - }, - { - "name": "...", - "desc": "The values to insert.", - "lua_type": "...T" } ], "returns": [ { - "desc": "The array with the values inserted.", + "desc": "The copied array.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 22, - "path": "src/Array/unshift.lua" + "line": 19, + "path": "src/Array/copy.lua" } }, { - "name": "pop", - "desc": "Removes an element from the end of the array, and returns\nthe array with the popped elements removed.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Pop(array) -- { 1, 2 }\nlocal new = Pop(array, 2) -- { 1 }\n```", + "name": "push", + "desc": "Adds elements to the end of the array.\n\n#### Aliases\n\n`append`\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Push(array, 4, 5, 6) -- { 1, 2, 3, 4, 5, 6 }\n```", "params": [ { "name": "array", - "desc": "The array to pop an element from.", + "desc": "The array to push an element to.", "lua_type": "{T}" }, { - "name": "count?", - "desc": "The number of elements to pop.", - "lua_type": "number = 1" + "name": "...", + "desc": "The elements to push.", + "lua_type": "...T" } ], "returns": [ { - "desc": "An array with the popped elements removed.", + "desc": "The array with the pushed elements.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 20, - "path": "src/Array/pop.lua" + "line": 22, + "path": "src/Array/push.lua" } }, { - "name": "reverse", - "desc": "Reverses the order of the items in an array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Reverse(array) -- { 3, 2, 1 }\n```", + "name": "update", + "desc": "Updates an array at the given index. If the value at the given index does\nnot exist, `callback` will be called, and its return value will be used\nas the value at the given index.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Update(array, 2, function(value)\n\treturn value + 1\nend) -- { 2, 3, 3 }\n\nlocal new = Update(array, 4, function(value)\n\treturn value + 1\nend, function(value)\n\treturn 10\nend) -- { 1, 2, 3, 10 }\n```", "params": [ { "name": "array", - "desc": "The array to reverse.", + "desc": "The array to update.", "lua_type": "{T}" + }, + { + "name": "index", + "desc": "The index to update.", + "lua_type": "number" + }, + { + "name": "updater?", + "desc": "The updater function.", + "lua_type": "(value: T, index: number) -> T" + }, + { + "name": "callback?", + "desc": "The callback function.", + "lua_type": "(index: number) -> T" } ], "returns": [ { - "desc": "The reversed array.", + "desc": "The updated array.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 17, - "path": "src/Array/reverse.lua" + "line": 44, + "path": "src/Array/update.lua" } }, { - "name": "includes", - "desc": "Checks whether the array contains the value. This is a wrapper\naround `Find`.\n\n#### Aliases\n\n`contains`, `has`\n\n```lua\nlocal array = { \"hello\", \"world\", \"goodbye\" }\n\nlocal value = Includes(array, \"hello\") -- true\nlocal value = Includes(array, \"sift\") -- false\nlocal value = Includes(array, \"hello\", 2) -- false\n```", + "name": "find", + "desc": "Finds the index of the first item in the array that matches the value. This is\nmostly a wrapper around `table.find`, with the ability to specify a negative\nnumber as the start index (to search relative to the end of the array).\n\n#### Aliases\n`indexOf`\n\n```lua\nlocal array = { \"hello\", \"world\", \"hello\" }\n\nlocal index = Find(array, \"hello\") -- 1\nlocal index = Find(array, \"hello\", 2) -- 3\n```", "params": [ { "name": "array", @@ -1000,7 +934,7 @@

Aliases

"lua_type": "{T}" }, { - "name": "value", + "name": "value?", "desc": "The value to search for.", "lua_type": "any" }, @@ -1012,63 +946,63 @@

Aliases

], "returns": [ { - "desc": "Whether the array contains the value.", - "lua_type": "boolean" + "desc": "The index of the first item in the array that matches the value.", + "lua_type": "number?" } ], "function_type": "static", "source": { - "line": 28, - "path": "src/Array/includes.lua" + "line": 25, + "path": "src/Array/find.lua" } }, { - "name": "zipAll", - "desc": "Zips multiple arrays together into a single array, filling\nin missing values with `None`.\n\n```lua\nlocal table1 = { 1, 2, 3, 4 }\nlocal table2 = { \"hello\", \"world\", \"goodbye\" }\n\nlocal new = ZipAll(table1, table2) -- { { 1, \"hello\" }, { 2, \"world\" }, { 3, \"goodbye\" }, { 4, None } }\n```", + "name": "first", + "desc": "Gets the first item in the array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = First(array) -- 1\n```", "params": [ { - "name": "...", - "desc": "The arrays to zip.", - "lua_type": "...{any}" + "name": "array", + "desc": "The array to get the first item from.", + "lua_type": "{T}" } ], "returns": [ { - "desc": "The zipped array.", - "lua_type": "{any}" + "desc": "The first item in the array.", + "lua_type": "T" } ], "function_type": "static", "source": { - "line": 24, - "path": "src/Array/zipAll.lua" + "line": 19, + "path": "src/Array/first.lua" } }, { - "name": "removeValue", - "desc": "Removes a value from an array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = RemoveValue(array, 2) -- { 1, 3 }\n```", + "name": "map", + "desc": "Maps the array using the mapper function.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Map(array, function(value, index)\n\treturn value * 2\nend) -- { 2, 4, 6 }\n```", "params": [ { "name": "array", - "desc": "The array to remove the value from.", + "desc": "The array to map.", "lua_type": "{T}" }, { - "name": "value", - "desc": "The value to remove.", - "lua_type": "T" + "name": "mapper", + "desc": "The mapper function.", + "lua_type": "(value: T, index: number, array: {T}) -> U?" } ], "returns": [ { - "desc": "The array with the value removed.", - "lua_type": "{T}" + "desc": "The mapped array.", + "lua_type": "{U}" } ], "function_type": "static", "source": { - "line": 18, - "path": "src/Array/removeValue.lua" + "line": 20, + "path": "src/Array/map.lua" } }, { @@ -1094,101 +1028,106 @@

Aliases

} }, { - "name": "copyDeep", - "desc": "Copies an array, with deep copies of all nested arrays.\n\n```lua\nlocal array = { 1, 2, 3, { 4, 5 } }\n\nlocal result = CopyDeep(array) -- { 1, 2, 3, { 4, 5 } }\n\nprint(result == array) -- false\nprint(result[4] == array[4]) -- false\n```", + "name": "reverse", + "desc": "Reverses the order of the items in an array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Reverse(array) -- { 3, 2, 1 }\n```", "params": [ { "name": "array", - "desc": "The array to copy.", + "desc": "The array to reverse.", "lua_type": "{T}" } ], "returns": [ { - "desc": "The copied array.", + "desc": "The reversed array.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 20, - "path": "src/Array/copyDeep.lua" + "line": 17, + "path": "src/Array/reverse.lua" } }, { - "name": "map", - "desc": "Maps the array using the mapper function.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Map(array, function(value, index)\n\treturn value * 2\nend) -- { 2, 4, 6 }\n```", + "name": "zip", + "desc": "Zips multiple arrays together into a single array.\n\n```lua\nlocal table1 = { 1, 2, 3 }\nlocal table2 = { \"hello\", \"world\", \"goodbye\" }\n\nlocal new = Zip(table1, table2) -- { { 1, \"hello\" }, { 2, \"world\" }, { 3, \"goodbye\" } }\n```", "params": [ { - "name": "array", - "desc": "The array to map.", - "lua_type": "{T}" - }, - { - "name": "mapper", - "desc": "The mapper function.", - "lua_type": "(value: T, index: number, array: {T}) -> U?" + "name": "...", + "desc": "The arrays to zip together.", + "lua_type": "{any}" } ], "returns": [ { - "desc": "The mapped array.", - "lua_type": "{U}" + "desc": "The zipped array.", + "lua_type": "{any}" } ], "function_type": "static", "source": { "line": 20, - "path": "src/Array/map.lua" + "path": "src/Array/zip.lua" } }, { - "name": "freeze", - "desc": "Freezes the top level of the array, making it read-only.\n\n```lua\nlocal array = { 1, 2, 3, { 4, 5, 6 } }\n\nlocal new = Freeze(array)\n\nnew[1] = 4 -- error!\nnew[4][1] = 7 -- still works!\n```", + "name": "flatten", + "desc": "Flattens an array. If depth is not specified, it will flatten\nthe array as far as it can go.\n\n```lua\nlocal array = {\n\t{ 1, 2, 3 },\n\t{ 4, 5, 6 },\n\t{ 7, { 8, 9 } },\n}\n\nlocal new = Flatten(array) -- { 1, 2, 3, 4, 5, 6, 7, 8, 9 }\nlocal new = Flatten(array, 1) -- { 1, 2, 3, 4, 5, 6, 7, { 8, 9 } }\n```", "params": [ { "name": "array", - "desc": "The array to freeze.", + "desc": "The array to flatten.", "lua_type": "{T}" + }, + { + "name": "depth?", + "desc": "The depth to flatten the array to.", + "lua_type": "number" } ], "returns": [ { - "desc": "The frozen array.", + "desc": "The flattened array.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 22, - "path": "src/Array/freeze.lua" + "line": 24, + "path": "src/Array/flatten.lua" } }, { - "name": "removeIndex", - "desc": "Removes a value from an array at the given index.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = RemoveIndex(array, 1) -- { 2, 3 }\nlocal new = RemoveIndex(array, -1) -- { 1, 3 }\n```", + "name": "includes", + "desc": "Checks whether the array contains the value. This is a wrapper\naround `Find`.\n\n#### Aliases\n\n`contains`, `has`\n\n```lua\nlocal array = { \"hello\", \"world\", \"goodbye\" }\n\nlocal value = Includes(array, \"hello\") -- true\nlocal value = Includes(array, \"sift\") -- false\nlocal value = Includes(array, \"hello\", 2) -- false\n```", "params": [ { "name": "array", - "desc": "The array to remove the value from.", + "desc": "The array to search.", "lua_type": "{T}" }, { - "name": "index", - "desc": "The index to remove the value from (can be negative).", + "name": "value", + "desc": "The value to search for.", + "lua_type": "any" + }, + { + "name": "from?", + "desc": "The index to start searching from.", "lua_type": "number" } ], "returns": [ { - "desc": "The array with the value removed.", - "lua_type": "{T}" + "desc": "Whether the array contains the value.", + "lua_type": "boolean" } ], "function_type": "static", "source": { - "line": 19, - "path": "src/Array/removeIndex.lua" + "line": 28, + "path": "src/Array/includes.lua" } }, { @@ -1219,192 +1158,192 @@

Aliases

} }, { - "name": "equals", - "desc": "Compares two arrays for equality.\n\n```lua\nlocal array = { 1, 2, 3 }\nlocal other = { 1, 2, 3 }\n\nlocal value = Equals(array, other) -- true\nlocal value = Equals(array, other, { 1, 2, 3 }) -- true\nlocal value = Equals(array, other, { 1, 2, 4 }) -- false\n```", + "name": "create", + "desc": "Creates an array of the given length, filled with the given value.\nThis is just a wrapper around `table.create`.\n\n```lua\nlocal array = Create(3, \"Hello\")\n\nprint(array) -- { \"Hello\", \"Hello\", \"Hello\" }\n```", "params": [ { - "name": "...", - "desc": "The arrays to compare.", - "lua_type": "...{any}" + "name": "length", + "desc": "The length of the array to create.", + "lua_type": "number" + }, + { + "name": "value?", + "desc": "The value to fill the array with.", + "lua_type": "T" } ], "returns": [ { - "desc": "Whether the arrays are equal.", - "lua_type": "boolean" + "desc": "The created array.", + "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 44, - "path": "src/Array/equals.lua" + "line": 19, + "path": "src/Array/create.lua" } }, { - "name": "flatten", - "desc": "Flattens an array. If depth is not specified, it will flatten\nthe array as far as it can go.\n\n```lua\nlocal array = {\n\t{ 1, 2, 3 },\n\t{ 4, 5, 6 },\n\t{ 7, { 8, 9 } },\n}\n\nlocal new = Flatten(array) -- { 1, 2, 3, 4, 5, 6, 7, 8, 9 }\nlocal new = Flatten(array, 1) -- { 1, 2, 3, 4, 5, 6, 7, { 8, 9 } }\n```", + "name": "splice", + "desc": "Splices an array.\n\n```lua\nlocal array = { 1, 2, 3, 4, 5 }\n\nlocal new = Splice(array, 3, 4, 6, 7) -- { 1, 2, 6, 7, 4, 5 }\nlocal new = Splice(array, -1, 0, 6, 7) -- { 1, 2, 3, 4, 6, 7 }\nlocal new = Splice(array, 4, -1, 6, 7) -- { 1, 2, 3, 6, 7, 5 }\n```", "params": [ { "name": "array", - "desc": "The array to flatten.", + "desc": "The array to splice.", "lua_type": "{T}" }, { - "name": "depth?", - "desc": "The depth to flatten the array to.", + "name": "start?", + "desc": "The index to start splicing at (can be negative).", + "lua_type": "number" + }, + { + "name": "end?", + "desc": "The index to end splicing at (can be negative).", "lua_type": "number" + }, + { + "name": "...", + "desc": "The values to insert.", + "lua_type": "...T" } ], "returns": [ { - "desc": "The flattened array.", + "desc": "The spliced array.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 24, - "path": "src/Array/flatten.lua" + "line": 22, + "path": "src/Array/splice.lua" } }, { - "name": "update", - "desc": "Updates an array at the given index. If the value at the given index does\nnot exist, `callback` will be called, and its return value will be used\nas the value at the given index.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Update(array, 2, function(value)\n\treturn value + 1\nend) -- { 2, 3, 3 }\n\nlocal new = Update(array, 4, function(value)\n\treturn value + 1\nend, function(value)\n\treturn 10\nend) -- { 1, 2, 3, 10 }\n```", + "name": "difference", + "desc": "Returns an array of values that are in the first array, but not in the other arrays.\n\n```lua\nlocal array1 = { \"hello\", \"world\" }\nlocal array2 = { \"cat\", \"dog\", \"hello\" }\n\nlocal difference = Difference(array1, array2) -- { \"world\" }\n```", "params": [ { "name": "array", - "desc": "The array to update.", - "lua_type": "{T}" - }, - { - "name": "index", - "desc": "The index to update.", - "lua_type": "number" - }, - { - "name": "updater?", - "desc": "The updater function.", - "lua_type": "(value: T, index: number) -> T" + "desc": "The array to compare.", + "lua_type": "Array<V>" }, { - "name": "callback?", - "desc": "The callback function.", - "lua_type": "(index: number) -> T" + "name": "...", + "desc": "The arrays to compare against.", + "lua_type": "...Array<V>" } ], "returns": [ { - "desc": "The updated array.", - "lua_type": "{T}" + "desc": "The difference between the arrays.", + "lua_type": "Array<V>" } ], "function_type": "static", "source": { - "line": 44, - "path": "src/Array/update.lua" + "line": 25, + "path": "src/Array/difference.lua" } }, { - "name": "some", - "desc": "Checks whether some item in the array passes the predicate.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = Some(array, function(item, index)\n\treturn item > 1\nend) -- true\n\nlocal value = Some(array, function(item, index)\n\treturn item > 3\nend) -- false\n```", + "name": "last", + "desc": "Gets the last element of the array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = Last(array) -- 3\n```", "params": [ { "name": "array", - "desc": "The array to check.", + "desc": "The array to get the last element of.", "lua_type": "{T}" - }, - { - "name": "predicate", - "desc": "The predicate to use to check the array.", - "lua_type": "(value: T, index: number, array: {T}) -> any" } ], "returns": [ - { - "desc": "Whether some item in the array passes the predicate.", - "lua_type": "boolean" + { + "desc": "The last element of the array.", + "lua_type": "T" } ], "function_type": "static", "source": { - "line": 24, - "path": "src/Array/some.lua" + "line": 19, + "path": "src/Array/last.lua" } }, { - "name": "push", - "desc": "Adds elements to the end of the array.\n\n#### Aliases\n\n`append`\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Push(array, 4, 5, 6) -- { 1, 2, 3, 4, 5, 6 }\n```", + "name": "removeIndex", + "desc": "Removes a value from an array at the given index.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = RemoveIndex(array, 1) -- { 2, 3 }\nlocal new = RemoveIndex(array, -1) -- { 1, 3 }\n```", "params": [ { "name": "array", - "desc": "The array to push an element to.", + "desc": "The array to remove the value from.", "lua_type": "{T}" }, { - "name": "...", - "desc": "The elements to push.", - "lua_type": "...T" + "name": "index", + "desc": "The index to remove the value from (can be negative).", + "lua_type": "number" } ], "returns": [ { - "desc": "The array with the pushed elements.", + "desc": "The array with the value removed.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 22, - "path": "src/Array/push.lua" + "line": 19, + "path": "src/Array/removeIndex.lua" } }, { - "name": "shuffle", - "desc": "Randomises the order of the items in an array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Shuffle(array) -- { 2, 3, 1 }\n```", + "name": "toSet", + "desc": "Converts an array to a set.\n\n```lua\nlocal array = { \"a\", \"b\", \"b\", \"c\", \"d\" }\n\nlocal set = ToSet(array) -- { a = true, b = true, c = true, d = true }\n```", "params": [ { "name": "array", - "desc": "The array to shuffle.", + "desc": "The array to convert to a set.", "lua_type": "{T}" } ], "returns": [ { - "desc": "The shuffled array.", - "lua_type": "{T}" + "desc": "The set.", + "lua_type": "Set<T>" } ], "function_type": "static", "source": { - "line": 19, - "path": "src/Array/shuffle.lua" + "line": 20, + "path": "src/Array/toSet.lua" } }, { - "name": "filter", - "desc": "Filters an array using a filterer callback. Any items that do not pass the filterer will be removed from the array.\n\nIf no filterer is provided, all items will be kept.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal result = Filter(array, function(item, index)\n\treturn item > 1\nend) -- { 2, 3 }\n```", + "name": "removeValue", + "desc": "Removes a value from an array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = RemoveValue(array, 2) -- { 1, 3 }\n```", "params": [ { "name": "array", - "desc": "The array to filter.", + "desc": "The array to remove the value from.", "lua_type": "{T}" }, { - "name": "filterer?", - "desc": "The callback to use to filter the array.", - "lua_type": "(value: T, index: number, array: {T}) -> any" + "name": "value", + "desc": "The value to remove.", + "lua_type": "T" } ], "returns": [ { - "desc": "The filtered array.", + "desc": "The array with the value removed.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 26, - "path": "src/Array/filter.lua" + "line": 18, + "path": "src/Array/removeValue.lua" } }, { @@ -1440,40 +1379,35 @@

Aliases

} }, { - "name": "splice", - "desc": "Splices an array.\n\n```lua\nlocal array = { 1, 2, 3, 4, 5 }\n\nlocal new = Splice(array, 3, 4, 6, 7) -- { 1, 2, 6, 7, 4, 5 }\nlocal new = Splice(array, -1, 0, 6, 7) -- { 1, 2, 3, 4, 6, 7 }\nlocal new = Splice(array, 4, -1, 6, 7) -- { 1, 2, 3, 6, 7, 5 }\n```", + "name": "reduceRight", + "desc": "Reduces the array using the given reducer and initial accumulator value,\nstarting from the end of the array. If no `initialReduction` value is given,\nthe last item in the array is used.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = ReduceRight(array, function(accumulator, item, index)\n\treturn accumulator - item\nend) -- 0\n\nlocal value = ReduceRight(array, function(accumulator, item, index)\n\ttable.insert(accumulator, item)\n\treturn accumulator\nend, {}) -- { 3, 2, 1 }\n```", "params": [ { "name": "array", - "desc": "The array to splice.", + "desc": "The array to reduce.", "lua_type": "{T}" }, { - "name": "start?", - "desc": "The index to start splicing at (can be negative).", - "lua_type": "number" - }, - { - "name": "end?", - "desc": "The index to end splicing at (can be negative).", - "lua_type": "number" + "name": "reducer", + "desc": "The reducer to use.", + "lua_type": "(accumulator: U, value: T, index: number, array: {T}) -> U" }, { - "name": "...", - "desc": "The values to insert.", - "lua_type": "...T" + "name": "initialReduction?", + "desc": "The initial accumulator value.", + "lua_type": "U = {T}[#{T}]" } ], "returns": [ { - "desc": "The spliced array.", - "lua_type": "{T}" + "desc": "The final accumulator value.", + "lua_type": "U" } ], "function_type": "static", "source": { - "line": 22, - "path": "src/Array/splice.lua" + "line": 28, + "path": "src/Array/reduceRight.lua" } }, { @@ -1504,273 +1438,322 @@

Aliases

} }, { - "name": "shift", - "desc": "Removes the first item from an array and returns the array\nwith the item removed.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Shift(array) -- { 2, 3 }\nlocal new = Shift(array, 2) -- { 3 }\n```", + "name": "filter", + "desc": "Filters an array using a filterer callback. Any items that do not pass the filterer will be removed from the array.\n\nIf no filterer is provided, all items will be kept.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal result = Filter(array, function(item, index)\n\treturn item > 1\nend) -- { 2, 3 }\n```", "params": [ { "name": "array", - "desc": "The array to shift.", + "desc": "The array to filter.", "lua_type": "{T}" }, { - "name": "count?", - "desc": "The number of items to shift.", - "lua_type": "number" + "name": "filterer?", + "desc": "The callback to use to filter the array.", + "lua_type": "(value: T, index: number, array: {T}) -> any" } ], "returns": [ { - "desc": "The shifted array.", + "desc": "The filtered array.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 20, - "path": "src/Array/shift.lua" + "line": 26, + "path": "src/Array/filter.lua" } }, { - "name": "freezeDeep", - "desc": "Freezes the entire array, making it read-only, including all\nnested arrays.\n\n```lua\nlocal array = { 1, 2, 3, { 4, 5, 6 } }\n\nlocal new = FreezeDeep(array)\n\nnew[1] = 4 -- error!\nnew[4][1] = 7 -- error!\n```", + "name": "every", + "desc": "Checks whether every item in the array passes the predicate.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = Every(array, function(item, index)\n\treturn item > 0\nend) -- true\n\nlocal value = Every(array, function(item, index)\n\treturn item > 1\nend) -- false\n```", "params": [ { "name": "array", - "desc": "The array to freeze.", + "desc": "The array to check.", "lua_type": "{T}" + }, + { + "name": "predicate", + "desc": "The predicate to use to check the array.", + "lua_type": "(value: T, index: number, array: {T}) -> any" } ], "returns": [ { - "desc": "The frozen array.", + "desc": "Whether every item in the array passes the predicate.", + "lua_type": "boolean" + } + ], + "function_type": "static", + "source": { + "line": 24, + "path": "src/Array/every.lua" + } + }, + { + "name": "copyDeep", + "desc": "Copies an array, with deep copies of all nested arrays.\n\n```lua\nlocal array = { 1, 2, 3, { 4, 5 } }\n\nlocal result = CopyDeep(array) -- { 1, 2, 3, { 4, 5 } }\n\nprint(result == array) -- false\nprint(result[4] == array[4]) -- false\n```", + "params": [ + { + "name": "array", + "desc": "The array to copy.", + "lua_type": "{T}" + } + ], + "returns": [ + { + "desc": "The copied array.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 21, - "path": "src/Array/freezeDeep.lua" + "line": 20, + "path": "src/Array/copyDeep.lua" } }, { - "name": "removeIndices", - "desc": "Removes values from an array at the given indices.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = RemoveIndices(array, 1, 2) -- { 3 }\nlocal new = RemoveIndices(array, 0, -1) -- { 1 }\n```", + "name": "unshift", + "desc": "Inserts values to the beginning of an array.\n\n#### Aliases\n\n`prepend`\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Unshift(array, 4, 5) -- { 4, 5, 1, 2, 3 }\n```", "params": [ { "name": "array", - "desc": "The array to remove the indices from.", + "desc": "The array to insert the values to.", "lua_type": "{T}" }, { "name": "...", - "desc": "The indices to remove the values from (can be negative).", - "lua_type": "...number" + "desc": "The values to insert.", + "lua_type": "...T" } ], "returns": [ { - "desc": "The array with the values removed.", + "desc": "The array with the values inserted.", + "lua_type": "{T}" + } + ], + "function_type": "static", + "source": { + "line": 22, + "path": "src/Array/unshift.lua" + } + }, + { + "name": "shuffle", + "desc": "Randomises the order of the items in an array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Shuffle(array) -- { 2, 3, 1 }\n```", + "params": [ + { + "name": "array", + "desc": "The array to shuffle.", + "lua_type": "{T}" + } + ], + "returns": [ + { + "desc": "The shuffled array.", "lua_type": "{T}" } ], "function_type": "static", "source": { "line": 19, - "path": "src/Array/removeIndices.lua" + "path": "src/Array/shuffle.lua" } }, { - "name": "concat", - "desc": "Joins multiple arrays together into a single array.\n\n#### Aliases\n\n`join`, `merge`\n\n```lua\nlocal table1 = { 1, 2, 3 }\nlocal table2 = { 4, 5, 6 }\n\nlocal new = Concat(table1, table2) -- { 1, 2, 3, 4, 5, 6 }\n```", + "name": "equalsDeep", + "desc": "Compares two arrays for equality using deep comparison.\n\n```lua\nlocal array = { 1, 2, 3, { 4, 5 } }\nlocal other = { 1, 2, 3, { 4, 5 } }\n\nlocal value = EqualsDeep(array, other) -- true\nlocal value = EqualsDeep(array, other, { 1, 2, 3, { 4, 5 } }) -- true\nlocal value = EqualsDeep(array, other, { 1, 2, 3, { 4, 6 } }) -- false\n```", "params": [ { "name": "...", - "desc": "The arrays to concatenate.", - "lua_type": "...any" + "desc": "The arrays to compare.", + "lua_type": "...{any}" } ], "returns": [ { - "desc": "The concatenated array.", - "lua_type": "{T}" + "desc": "Whether the arrays are equal.", + "lua_type": "boolean" } ], "function_type": "static", "source": { - "line": 26, - "path": "src/Array/concat.lua" + "line": 44, + "path": "src/Array/equalsDeep.lua" } }, { - "name": "reduce", - "desc": "Reduces the array using the given reducer and initial accumulator value.\nIf no `initialReduction` value is given, the first item in the array is used.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = Reduce(array, function(accumulator, item, index)\n\treturn accumulator - item\nend) -- -4\n\nlocal value = Reduce(array, function(accumulator, item, index)\n\ttable.insert(accumulator, item)\n\treturn accumulator\nend, {}) -- { 1, 2, 3 }\n```", + "name": "freeze", + "desc": "Freezes the top level of the array, making it read-only.\n\n```lua\nlocal array = { 1, 2, 3, { 4, 5, 6 } }\n\nlocal new = Freeze(array)\n\nnew[1] = 4 -- error!\nnew[4][1] = 7 -- still works!\n```", "params": [ { "name": "array", - "desc": "The array to reduce.", + "desc": "The array to freeze.", "lua_type": "{T}" - }, - { - "name": "reducer", - "desc": "The reducer to use.", - "lua_type": "(accumulator: U, value: T, index: number, array: {T}) -> U" - }, - { - "name": "initialReduction?", - "desc": "The initial accumulator value.", - "lua_type": "U = {T}[1]" } ], "returns": [ { - "desc": "The final accumulator value.", - "lua_type": "U" + "desc": "The frozen array.", + "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 27, - "path": "src/Array/reduce.lua" + "line": 22, + "path": "src/Array/freeze.lua" } }, { - "name": "set", - "desc": "Sets a value on an array at the given index.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Set(array, 2, 4) -- { 1, 4, 3 }\nlocal new = Set(array, -1, 4) -- { 1, 2, 4 }\n```", + "name": "removeIndices", + "desc": "Removes values from an array at the given indices.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = RemoveIndices(array, 1, 2) -- { 3 }\nlocal new = RemoveIndices(array, 0, -1) -- { 1 }\n```", "params": [ { "name": "array", - "desc": "The array to set the value on.", + "desc": "The array to remove the indices from.", "lua_type": "{T}" }, { - "name": "index", - "desc": "The index to set the value at (can be negative).", - "lua_type": "number" - }, - { - "name": "value", - "desc": "The value to set.", - "lua_type": "T" + "name": "...", + "desc": "The indices to remove the values from (can be negative).", + "lua_type": "...number" } ], "returns": [ { - "desc": "The array with the value set.", + "desc": "The array with the values removed.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 20, - "path": "src/Array/set.lua" + "line": 19, + "path": "src/Array/removeIndices.lua" } }, { - "name": "insert", - "desc": "Inserts the given values into an array at the given index, shifting all values after it to the right. If the index is negative (or 0), it is counted from the end of the array.\n\nIf the index to insert at is out of range, the array is not modified.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal newArray = Insert(array, 2, 4) -- { 1, 4, 2, 3 }\n```", + "name": "set", + "desc": "Sets a value on an array at the given index.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Set(array, 2, 4) -- { 1, 4, 3 }\nlocal new = Set(array, -1, 4) -- { 1, 2, 4 }\n```", "params": [ { "name": "array", - "desc": "The array to insert the value into.", + "desc": "The array to set the value on.", "lua_type": "{T}" }, { "name": "index", - "desc": "The index to insert the value at (can be negative).", + "desc": "The index to set the value at (can be negative).", "lua_type": "number" }, - { - "name": "values", - "desc": "The values to insert.", - "lua_type": "...T" + { + "name": "value", + "desc": "The value to set.", + "lua_type": "T" } ], "returns": [ { - "desc": "The array with the value inserted.", + "desc": "The array with the value set.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 21, - "path": "src/Array/insert.lua" + "line": 20, + "path": "src/Array/set.lua" } }, { - "name": "last", - "desc": "Gets the last element of the array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = Last(array) -- 3\n```", + "name": "count", + "desc": "Counts the number of items in an array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = Count(array) -- 3\nlocal value = Count(array, function(item, index)\n\treturn item == 2\nend) -- 1\n```", "params": [ { "name": "array", - "desc": "The array to get the last element of.", + "desc": "The array to count the number of items in.", "lua_type": "{T}" + }, + { + "name": "predicate?", + "desc": "The predicate to use to filter the array.", + "lua_type": "(value: T, index: number, array: {T}) -> any" } ], "returns": [ { - "desc": "The last element of the array.", - "lua_type": "T" + "desc": "The number of items in the array.", + "lua_type": "number" } ], "function_type": "static", "source": { - "line": 19, - "path": "src/Array/last.lua" + "line": 25, + "path": "src/Array/count.lua" } }, { - "name": "copy", - "desc": "Copies an array.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Copy(array) -- { 1, 2, 3 }\n\nprint(new == array) -- false\n```", + "name": "shift", + "desc": "Removes the first item from an array and returns the array\nwith the item removed.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal new = Shift(array) -- { 2, 3 }\nlocal new = Shift(array, 2) -- { 3 }\n```", "params": [ { "name": "array", - "desc": "The array to copy.", + "desc": "The array to shift.", "lua_type": "{T}" + }, + { + "name": "count?", + "desc": "The number of items to shift.", + "lua_type": "number" } ], "returns": [ { - "desc": "The copied array.", + "desc": "The shifted array.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 19, - "path": "src/Array/copy.lua" + "line": 20, + "path": "src/Array/shift.lua" } }, { - "name": "every", - "desc": "Checks whether every item in the array passes the predicate.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = Every(array, function(item, index)\n\treturn item > 0\nend) -- true\n\nlocal value = Every(array, function(item, index)\n\treturn item > 1\nend) -- false\n```", + "name": "findWhereLast", + "desc": "Finds the index of the last item in the array that passes the predicate.\n\n```lua\nlocal array = { \"hello\", \"world\", \"hello\" }\n\nlocal index = FindWhereLast(array, function(item, index)\n\treturn item == \"hello\"\nend) -- 3\n\nlocal index = FindWhereLast(array, function(item, index)\n\treturn item == \"hello\"\nend, 2) -- 1\n```", "params": [ { "name": "array", - "desc": "The array to check.", + "desc": "The array to search.", "lua_type": "{T}" }, { "name": "predicate", "desc": "The predicate to use to check the array.", "lua_type": "(value: T, index: number, array: {T}) -> any" + }, + { + "name": "from?", + "desc": "The index to start searching from.", + "lua_type": "number" } ], "returns": [ { - "desc": "Whether every item in the array passes the predicate.", - "lua_type": "boolean" + "desc": "The index of the last item in the array that matches the predicate.", + "lua_type": "number" } ], "function_type": "static", "source": { - "line": 24, - "path": "src/Array/every.lua" + "line": 25, + "path": "src/Array/findWhereLast.lua" } }, { - "name": "reduceRight", - "desc": "Reduces the array using the given reducer and initial accumulator value,\nstarting from the end of the array. If no `initialReduction` value is given,\nthe last item in the array is used.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = ReduceRight(array, function(accumulator, item, index)\n\treturn accumulator - item\nend) -- 0\n\nlocal value = ReduceRight(array, function(accumulator, item, index)\n\ttable.insert(accumulator, item)\n\treturn accumulator\nend, {}) -- { 3, 2, 1 }\n```", + "name": "reduce", + "desc": "Reduces the array using the given reducer and initial accumulator value.\nIf no `initialReduction` value is given, the first item in the array is used.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = Reduce(array, function(accumulator, item, index)\n\treturn accumulator - item\nend) -- -4\n\nlocal value = Reduce(array, function(accumulator, item, index)\n\ttable.insert(accumulator, item)\n\treturn accumulator\nend, {}) -- { 1, 2, 3 }\n```", "params": [ { "name": "array", @@ -1785,7 +1768,7 @@

Aliases

{ "name": "initialReduction?", "desc": "The initial accumulator value.", - "lua_type": "U = {T}[#{T}]" + "lua_type": "U = {T}[1]" } ], "returns": [ @@ -1796,136 +1779,126 @@

Aliases

], "function_type": "static", "source": { - "line": 28, - "path": "src/Array/reduceRight.lua" + "line": 27, + "path": "src/Array/reduce.lua" } }, { - "name": "create", - "desc": "Creates an array of the given length, filled with the given value.\nThis is just a wrapper around `table.create`.\n\n```lua\nlocal array = Create(3, \"Hello\")\n\nprint(array) -- { \"Hello\", \"Hello\", \"Hello\" }\n```", + "name": "equals", + "desc": "Compares two arrays for equality.\n\n```lua\nlocal array = { 1, 2, 3 }\nlocal other = { 1, 2, 3 }\n\nlocal value = Equals(array, other) -- true\nlocal value = Equals(array, other, { 1, 2, 3 }) -- true\nlocal value = Equals(array, other, { 1, 2, 4 }) -- false\n```", "params": [ { - "name": "length", - "desc": "The length of the array to create.", - "lua_type": "number" - }, - { - "name": "value?", - "desc": "The value to fill the array with.", - "lua_type": "T" + "name": "...", + "desc": "The arrays to compare.", + "lua_type": "...{any}" } ], "returns": [ { - "desc": "The created array.", - "lua_type": "{T}" + "desc": "Whether the arrays are equal.", + "lua_type": "boolean" } ], "function_type": "static", "source": { - "line": 19, - "path": "src/Array/create.lua" + "line": 44, + "path": "src/Array/equals.lua" } }, { - "name": "slice", - "desc": "Slices an array.\n\n```lua\nlocal array = { 1, 2, 3, 4, 5 }\n\nlocal new = Slice(array, 2, 3) -- { 2, 3 }\nlocal new = Slice(array, -2, -1) -- { 3, 4 }\nlocal new = Slice(array, 3) -- { 3, 4, 5 }\n```", + "name": "concatDeep", + "desc": "Joins multiple arrays together into a single array, with deep copies of all\nnested arrays.\n\n#### Aliases\n\n`joinDeep`, `mergeDeep`\n\n```lua\nlocal table1 = { 1, 2, { 3, 4 } }\nlocal table2 = { 5, 6, { 7, 8 } }\n\nlocal new = ConcatDeep(table1, table2) -- { 1, 2, { 3, 4 }, 5, 6, { 7, 8 } }\n```", "params": [ { - "name": "array", - "desc": "The array to slice.", - "lua_type": "{T}" - }, - { - "name": "from?", - "desc": "The index to start from (can be negative).", - "lua_type": "number" - }, - { - "name": "to?", - "desc": "The index to end at (can be negative).", - "lua_type": "number" + "name": "...", + "desc": "The arrays to concatenate.", + "lua_type": "...any" } ], "returns": [ { - "desc": "The sliced array.", + "desc": "The concatenated array.", "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 21, - "path": "src/Array/slice.lua" + "line": 28, + "path": "src/Array/concatDeep.lua" } }, { - "name": "difference", - "desc": "Returns an array of values that are in the first array, but not in the other arrays.\n\n```lua\nlocal array1 = { \"hello\", \"world\" }\nlocal array2 = { \"cat\", \"dog\", \"hello\" }\n\nlocal difference = Difference(array1, array2) -- { \"world\" }\n```", + "name": "findLast", + "desc": "Finds the index of the last item in the array that matches the value.\n\n```lua\nlocal array = { \"hello\", \"world\", \"hello\" }\n\nlocal index = FindLast(array, \"hello\") -- 3\nlocal index = FindLast(array, \"hello\", 2) -- 1\n```", "params": [ { "name": "array", - "desc": "The array to compare.", - "lua_type": "Array<V>" + "desc": "The array to search.", + "lua_type": "{T}" }, { - "name": "...", - "desc": "The arrays to compare against.", - "lua_type": "...Array<V>" + "name": "value?", + "desc": "The value to search for.", + "lua_type": "any" + }, + { + "name": "from?", + "desc": "The index to start searching from.", + "lua_type": "number" } ], "returns": [ { - "desc": "The difference between the arrays.", - "lua_type": "Array<V>" + "desc": "The index of the last item in the array that matches the value.", + "lua_type": "number?" } ], "function_type": "static", "source": { - "line": 25, - "path": "src/Array/difference.lua" + "line": 20, + "path": "src/Array/findLast.lua" } }, { - "name": "findWhereLast", - "desc": "Finds the index of the last item in the array that passes the predicate.\n\n```lua\nlocal array = { \"hello\", \"world\", \"hello\" }\n\nlocal index = FindWhereLast(array, function(item, index)\n\treturn item == \"hello\"\nend) -- 3\n\nlocal index = FindWhereLast(array, function(item, index)\n\treturn item == \"hello\"\nend, 2) -- 1\n```", + "name": "slice", + "desc": "Slices an array.\n\n```lua\nlocal array = { 1, 2, 3, 4, 5 }\n\nlocal new = Slice(array, 2, 3) -- { 2, 3 }\nlocal new = Slice(array, -2, -1) -- { 3, 4 }\nlocal new = Slice(array, 3) -- { 3, 4, 5 }\n```", "params": [ { "name": "array", - "desc": "The array to search.", + "desc": "The array to slice.", "lua_type": "{T}" }, { - "name": "predicate", - "desc": "The predicate to use to check the array.", - "lua_type": "(value: T, index: number, array: {T}) -> any" + "name": "from?", + "desc": "The index to start from (can be negative).", + "lua_type": "number" }, { - "name": "from?", - "desc": "The index to start searching from.", + "name": "to?", + "desc": "The index to end at (can be negative).", "lua_type": "number" } ], "returns": [ { - "desc": "The index of the last item in the array that matches the predicate.", - "lua_type": "number" + "desc": "The sliced array.", + "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 25, - "path": "src/Array/findWhereLast.lua" + "line": 21, + "path": "src/Array/slice.lua" } }, { - "name": "zip", - "desc": "Zips multiple arrays together into a single array.\n\n```lua\nlocal table1 = { 1, 2, 3 }\nlocal table2 = { \"hello\", \"world\", \"goodbye\" }\n\nlocal new = Zip(table1, table2) -- { { 1, \"hello\" }, { 2, \"world\" }, { 3, \"goodbye\" } }\n```", + "name": "zipAll", + "desc": "Zips multiple arrays together into a single array, filling\nin missing values with `None`.\n\n```lua\nlocal table1 = { 1, 2, 3, 4 }\nlocal table2 = { \"hello\", \"world\", \"goodbye\" }\n\nlocal new = ZipAll(table1, table2) -- { { 1, \"hello\" }, { 2, \"world\" }, { 3, \"goodbye\" }, { 4, None } }\n```", "params": [ { "name": "...", - "desc": "The arrays to zip together.", - "lua_type": "{any}" + "desc": "The arrays to zip.", + "lua_type": "...{any}" } ], "returns": [ @@ -1936,8 +1909,8 @@

Aliases

], "function_type": "static", "source": { - "line": 20, - "path": "src/Array/zip.lua" + "line": 24, + "path": "src/Array/zipAll.lua" } }, { @@ -1968,57 +1941,84 @@

Aliases

} }, { - "name": "equalsDeep", - "desc": "Compares two arrays for equality using deep comparison.\n\n```lua\nlocal array = { 1, 2, 3, { 4, 5 } }\nlocal other = { 1, 2, 3, { 4, 5 } }\n\nlocal value = EqualsDeep(array, other) -- true\nlocal value = EqualsDeep(array, other, { 1, 2, 3, { 4, 5 } }) -- true\nlocal value = EqualsDeep(array, other, { 1, 2, 3, { 4, 6 } }) -- false\n```", + "name": "some", + "desc": "Checks whether some item in the array passes the predicate.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal value = Some(array, function(item, index)\n\treturn item > 1\nend) -- true\n\nlocal value = Some(array, function(item, index)\n\treturn item > 3\nend) -- false\n```", "params": [ { - "name": "...", - "desc": "The arrays to compare.", - "lua_type": "...{any}" + "name": "array", + "desc": "The array to check.", + "lua_type": "{T}" + }, + { + "name": "predicate", + "desc": "The predicate to use to check the array.", + "lua_type": "(value: T, index: number, array: {T}) -> any" } ], "returns": [ { - "desc": "Whether the arrays are equal.", + "desc": "Whether some item in the array passes the predicate.", "lua_type": "boolean" } ], "function_type": "static", "source": { - "line": 44, - "path": "src/Array/equalsDeep.lua" + "line": 24, + "path": "src/Array/some.lua" } }, { - "name": "findLast", - "desc": "Finds the index of the last item in the array that matches the value.\n\n```lua\nlocal array = { \"hello\", \"world\", \"hello\" }\n\nlocal index = FindLast(array, \"hello\") -- 3\nlocal index = FindLast(array, \"hello\", 2) -- 1\n```", + "name": "insert", + "desc": "Inserts the given values into an array at the given index, shifting all values after it to the right. If the index is negative (or 0), it is counted from the end of the array.\n\nIf the index to insert at is out of range, the array is not modified.\n\n```lua\nlocal array = { 1, 2, 3 }\n\nlocal newArray = Insert(array, 2, 4) -- { 1, 4, 2, 3 }\n```", "params": [ { "name": "array", - "desc": "The array to search.", + "desc": "The array to insert the value into.", "lua_type": "{T}" }, { - "name": "value?", - "desc": "The value to search for.", - "lua_type": "any" + "name": "index", + "desc": "The index to insert the value at (can be negative).", + "lua_type": "number" }, { - "name": "from?", - "desc": "The index to start searching from.", - "lua_type": "number" + "name": "values", + "desc": "The values to insert.", + "lua_type": "...T" } ], "returns": [ { - "desc": "The index of the last item in the array that matches the value.", - "lua_type": "number?" + "desc": "The array with the value inserted.", + "lua_type": "{T}" } ], "function_type": "static", "source": { - "line": 20, - "path": "src/Array/findLast.lua" + "line": 21, + "path": "src/Array/insert.lua" + } + }, + { + "name": "freezeDeep", + "desc": "Freezes the entire array, making it read-only, including all\nnested arrays.\n\n```lua\nlocal array = { 1, 2, 3, { 4, 5, 6 } }\n\nlocal new = FreezeDeep(array)\n\nnew[1] = 4 -- error!\nnew[4][1] = 7 -- error!\n```", + "params": [ + { + "name": "array", + "desc": "The array to freeze.", + "lua_type": "{T}" + } + ], + "returns": [ + { + "desc": "The frozen array.", + "lua_type": "{T}" + } + ], + "function_type": "static", + "source": { + "line": 21, + "path": "src/Array/freezeDeep.lua" } } ], @@ -2030,8 +2030,8 @@

Aliases

"line": 21, "path": "src/Array/init.lua" } -}
- - +}
+ + \ No newline at end of file diff --git a/api/Dictionary/index.html b/api/Dictionary/index.html index 2a0130a..5bf4723 100644 --- a/api/Dictionary/index.html +++ b/api/Dictionary/index.html @@ -3,7 +3,7 @@ -Dictionary | SiftDictionary | Sift - - +```"> + +
-
Skip to main content

Dictionary

+

Dictionary

Dictionaries are a type of data structure that can be used to store key-value pairs.

local dictionary = {
 	cats = 2,
@@ -36,55 +36,88 @@
 
 print(dictionary.cats) -- 2
 
-

Functions

count

Dictionary.count(
dictionaryT,-- -

The dictionary to count.

-
predicate?(
valueT,
keyK,
dictionaryT
) → any-- -

The predicate to use to filter the dictionary.

-
) → number-- -

The number of items in the dictionary.

+

Functions

copy

Dictionary.copy(
dictionaryT-- +

The dictionary to copy.

+
) → T-- +

The copied dictionary.

-

Counts the number of items in a dictionary.

-
local dictionary = { hello = "world", goodbye = "world" }
+

Copies a dictionary.

+
local dictionary = { hello = "world" }
 
-local value = Count(dictionary) -- 2
-local value = Count(dictionary, function(item, key)
-  return item == "world"
-end) -- 1
+local new = Copy(dictionary) -- { hello = "world" }
+
+print(new == dictionary) -- false
+print(new.hello == dictionary.hello) -- true
 
-

fromEntries

Dictionary.fromEntries(
entries{{
K,
V
}}-- -

An array of key-value pairs.

-
) → {[K]V}-- -

A dictionary composed of the given key-value pairs.

+

update

Dictionary.update(
dictionary{[K]V?},-- +

The dictionary to update.

+
keyK,-- +

The key to update.

+
updater?(
valueV,
keyK
) → U,-- +

The updater function.

+
callback?(keyK) → C-- +

The callback function.

+
) → {[K]V | U | C}-- +

The updated dictionary.

-

Creates a dictionary from the given key-value pairs.

-
local entries = { { "hello", "roblox" }, { "goodbye", "world" } }
+

Updates a value in a dictionary at the given key. If the value at the given key does not exist, callback will be called, and its return value will be used as the value at the given key.

+
local dictionary = { cats = 2 }
 
-local dictionary = FromEntries(entries) -- { hello = "roblox", goodbye = "world" }
+local new = Update(dictionary, "cats", function(value)
+  return value + 1
+end) -- { cats = 3 }
+
+local new = Update(dictionary, "dogs", function(value)
+  return value + 1
+end, function(value)
+  return 1
+end) -- { cats = 3, dogs = 1 }
 
-

values

Dictionary.values(
dictionary{[K]V}-- -

The dictionary to get the values from.

-
) → {V}-- -

The values in the dictionary.

+

map

Dictionary.map(
dictionary{[K]V},-- +

The dictionary to map.

+
mapper(
valueV,
keyK,
dictionary{[K]V}
) → (
Y?,
X?
)-- +

The mapper function.

+
) → {[X]Y}-- +

The mapped dictionary.

-

Gets the values in the given dictionary.

-
local dictionary = { hello = "roblox", goodbye = "world" }
+

+ Maps the dictionary using the mapper function. The mapper function can + return a value and a key. If the mapper function does not return a key, + the original key will be used. +

+
local dictionary = { hello = 10, goodbye = 20 }
 
-local values = Values(dictionary) -- { "roblox", "world" }
+local new = Map(dictionary, function(value, key)
+  return value * 2, key .. "!"
+end) -- { ["hello!"] = 20, ["goodbye!"] = 40 }
+
+local new = Map(dictionary, function(value, key)
+  return value * 10
+end) -- { hello = 100, goodbye = 200 }
 
-

has

Dictionary.has(
dictionary{[K]V},-- -

The dictionary to check.

-
keyany-- -

The key to check for.

-
) → boolean-- -

Whether or not the dictionary has the given key.

+

flatten

Dictionary.flatten(
dictionaryT,-- +

The dictionary to flatten.

+
depth?number-- +

The depth to flatten the dictionary to.

+
) → T-- +

The flattened dictionary.

-

Checks whether or not the given dictionary has the given key.

-
local dictionary = { hello = "roblox", goodbye = "world" }
+

Flattens a dictionary. If depth is not specified, it will flatten the dictionary as far as it can go.

+
local dictionary = {
+  hello = "world",
+  goodbye = {
+    world = "hello",
+    roblox = {
+      yes = "no",
+      no = "yes",
+    }
+  }
+}
 
-local hasHello = Has(dictionary, "hello") -- true
-local hasCat = Has(dictionary, "cat") -- false
+local new = Flatten(dictionary) -- { hello = "world", world = "hello", yes = "no", no = "yes" }
+local new = Flatten(dictionary, 1) -- { hello = "world", world = "hello", roblox = { yes = "no", no = "yes" } }
 
-

includes

Dictionary.includes(
dictionary{[K]V},-- +

includes

Dictionary.includes(
dictionary{[K]V},--

The dictionary to check.

valueV--

The value to check for.

@@ -97,68 +130,50 @@ local includesRoblox = Includes(dictionary, "roblox") -- true local includesCat = Includes(dictionary, "cat") -- false
-

removeValue

Dictionary.removeValue(
dictionary{[K]V},-- -

The dictionary to remove the value from.

-
valueV-- -

The value to remove.

+

removeValues

Dictionary.removeValues(
dictionary{[K]V},-- +

The dictionary to remove the values from.

+
values...V-- +

The values to remove.

) → {[K]V}-- -

The dictionary without the given value.

+

The dictionary without the given values.

-

Removes the given value from the given dictionary.

-
local dictionary = { hello = "roblox", goodbye = "world" }
+

Removes the given values from the given dictionary.

+
local dictionary = { hello = "world", cat = "meow", unicorn = "rainbow", goodbye = "world" }
 
-local withoutHello = RemoveValue(dictionary, "roblox") -- { goodbye = "world" }
-local withoutGoodbye = RemoveValue(dictionary, "world") -- { hello = "roblox" }
+local withoutWorld = RemoveValues(dictionary, "world") -- { cat = "meow", unicorn = "rainbow" }
+local onlyWorld = RemoveValues(dictionary, "meow", "rainbow") -- { hello = "world", goodbye = "world" }
 
-

copyDeep

Dictionary.copyDeep(
dictionaryT-- -

The dictionary to copy.

+

mergeDeep

Dictionary.mergeDeep(
dictionaries?...any-- +

The dictionaries to merge.

) → T-- -

The copied dictionary.

-
-

Copies a dictionary recursively.

-
local dictionary = { hello = { world = "goodbye" } }
-
-local new = CopyDeep(dictionary) -- { hello = { world = "goodbye" } }
-
-print(new == dictionary) -- false
-print(new.hello == dictionary.hello) -- false
-
-

map

Dictionary.map(
dictionary{[K]V},-- -

The dictionary to map.

-
mapper(
valueV,
keyK,
dictionary{[K]V}
) → (
Y?,
X?
)-- -

The mapper function.

-
) → {[X]Y}-- -

The mapped dictionary.

+

The merged dictionary.

- Maps the dictionary using the mapper function. The mapper function can - return a value and a key. If the mapper function does not return a key, - the original key will be used. + Merges the given dictionaries into a single dictionary. If the + value is None, it will be removed from the result. This is + recursive. The parameters may be any number of dictionaries or + nil. Non-dictonaries will be ignored.

-
local dictionary = { hello = 10, goodbye = 20 }
-
-local new = Map(dictionary, function(value, key)
-  return value * 2, key .. "!"
-end) -- { ["hello!"] = 20, ["goodbye!"] = 40 }
+

Aliases: joinDeep

+
local dictionary1 = { hello = "roblox", goodbye = { world = "goodbye" } }
+local dictionary2 = { goodbye = { world = "world" } }
 
-local new = Map(dictionary, function(value, key)
-  return value * 10
-end) -- { hello = 100, goodbye = 200 }
+local merged = MergeDeep(dictionary1, dictionary2) -- { hello = "roblox", goodbye = { world = "world" } }
 
-

freeze

Dictionary.freeze(
dictionaryT-- -

The dictionary to freeze.

-
) → T-- -

The frozen dictionary.

+

removeValue

Dictionary.removeValue(
dictionary{[K]V},-- +

The dictionary to remove the value from.

+
valueV-- +

The value to remove.

+
) → {[K]V}-- +

The dictionary without the given value.

-

Freezes the given dictionary at the top level, making it read-only.

-
local dictionary = { hello = "roblox", goodbye = { world = "world" } }
-
-local new = Freeze(dictionary)
+

Removes the given value from the given dictionary.

+
local dictionary = { hello = "roblox", goodbye = "world" }
 
-new.hello = "world" -- error!
-new.goodbye.world = "hello" -- still works!
+local withoutHello = RemoveValue(dictionary, "roblox") -- { goodbye = "world" }
+local withoutGoodbye = RemoveValue(dictionary, "world") -- { hello = "roblox" }
 
-

merge

Dictionary.merge(
dictionaries?...any-- +

merge

Dictionary.merge(
dictionaries?...any--

The dictionaries to merge.

) → T--

The merged dictionary.

@@ -175,161 +190,111 @@ local merged = Merge(dictionary1, dictionary2) -- { hello = "roblox", goodbye = "goodbye" }
-

keys

Dictionary.keys(
dictionary{[K]V}-- -

The dictionary to get the keys of.

-
) → {K}-- -

An array containing the keys of the given dictionary.

-
-

Gets the keys of the given dictionary as an array.

-
local dictionary = { hello = "roblox", goodbye = "world" }
-
-local keys = Keys(dictionary) -- { "hello", "goodbye" }
-
-

removeValues

Dictionary.removeValues(
dictionary{[K]V},-- -

The dictionary to remove the values from.

-
values...V-- -

The values to remove.

+

filter

Dictionary.filter(
dictionary{[K]V},-- +

The dictionary to filter.

+
predicate?(
valueV,
keyK,
dictionary{[K]V}
) → any-- +

The predicate to use to filter the dictionary.

) → {[K]V}-- -

The dictionary without the given values.

+

The filtered dictionary.

-

Removes the given values from the given dictionary.

-
local dictionary = { hello = "world", cat = "meow", unicorn = "rainbow", goodbye = "world" }
+

Filters a dictionary using a predicate. Any items that do not pass the predicate will be removed from the dictionary.

+
local dictionary = { hello = "world", goodbye = "goodbye" }
 
-local withoutWorld = RemoveValues(dictionary, "world") -- { cat = "meow", unicorn = "rainbow" }
-local onlyWorld = RemoveValues(dictionary, "meow", "rainbow") -- { hello = "world", goodbye = "world" }
+local result = Filter(dictionary, function(value, key)
+  return value == "world"
+end) -- { hello = "world" }
 
-

removeKey

Dictionary.removeKey(
dictionary{[K]V},-- -

The dictionary to remove the key from.

-
keyK-- -

The key to remove.

-
) → {[K]V}-- -

The dictionary without the given key.

+

every

Dictionary.every(
dictionary{[K]V},-- +

The dictionary to check.

+
predicate(
valueV,
keyK,
dictionary{[K]V}
) → any-- +

The predicate to use to check the dictionary.

+
) → boolean-- +

Whether every item in the dictionary passes the predicate.

-

Removes the given key from the given dictionary.

-
local dictionary = { hello = "roblox", goodbye = "world" }
+

Checks whether every item in the dictionary passes the predicate.

+
local dictionary = { hello = "world", goodbye = "world" }
 
-local withoutHello = RemoveKey(dictionary, "hello") -- { goodbye = "world" }
-local withoutGoodbye = RemoveKey(dictionary, "goodbye") -- { hello = "roblox" }
+local value = Every(dictionary, function(value, key)
+  return value == "world"
+end) -- true
+
+local value = Every(dictionary, function(value, key)
+  return value == "hello"
+end) -- false
 
-

equals

Dictionary.equals(
......{[any]any}-- -

The dictionaries to compare.

-
) → boolean-- -

Whether the dictionaries are equal.

+

values

Dictionary.values(
dictionary{[K]V}-- +

The dictionary to get the values from.

+
) → {V}-- +

The values in the dictionary.

-

Compares two dictionaries for equality.

-
local dictionary = { hello = "world", goodbye = "world" }
-local other1 = { hello = "world", goodbye = "world" }
-local other2 = { hello = "hello", world = "goodbye" }
+

Gets the values in the given dictionary.

+
local dictionary = { hello = "roblox", goodbye = "world" }
 
-local value = Equals(dictionary, other1) -- true
-local value = Equals(dictionary, other1, other2) -- false
+local values = Values(dictionary) -- { "roblox", "world" }
 
-

flatten

Dictionary.flatten(
dictionaryT,-- -

The dictionary to flatten.

-
depth?number-- -

The depth to flatten the dictionary to.

+

copyDeep

Dictionary.copyDeep(
dictionaryT-- +

The dictionary to copy.

) → T-- -

The flattened dictionary.

+

The copied dictionary.

-

Flattens a dictionary. If depth is not specified, it will flatten the dictionary as far as it can go.

-
local dictionary = {
-  hello = "world",
-  goodbye = {
-    world = "hello",
-    roblox = {
-      yes = "no",
-      no = "yes",
-    }
-  }
-}
+

Copies a dictionary recursively.

+
local dictionary = { hello = { world = "goodbye" } }
 
-local new = Flatten(dictionary) -- { hello = "world", world = "hello", yes = "no", no = "yes" }
-local new = Flatten(dictionary, 1) -- { hello = "world", world = "hello", roblox = { yes = "no", no = "yes" } }
+local new = CopyDeep(dictionary) -- { hello = { world = "goodbye" } }
+
+print(new == dictionary) -- false
+print(new.hello == dictionary.hello) -- false
 
-

update

Dictionary.update(
dictionary{[K]V},-- -

The dictionary to update.

-
keyK,-- -

The key to update.

-
updater?(
valueV,
keyK
) → U,-- -

The updater function.

-
callback?(keyK) → C-- -

The callback function.

-
) → {[K]V&U&C}-- -

The updated dictionary.

+

fromEntries

Dictionary.fromEntries(
entries{{
K,
V
}}-- +

An array of key-value pairs.

+
) → {[K]V}-- +

A dictionary composed of the given key-value pairs.

-

Updates a value in a dictionary at the given key. If the value at the given key does not exist, callback will be called, and its return value will be used as the value at the given key.

-
local dictionary = { cats = 2 }
-
-local new = Update(dictionary, "cats", function(value)
-  return value + 1
-end) -- { cats = 3 }
+

Creates a dictionary from the given key-value pairs.

+
local entries = { { "hello", "roblox" }, { "goodbye", "world" } }
 
-local new = Update(dictionary, "dogs", function(value)
-  return value + 1
-end, function(value)
-  return 1
-end) -- { cats = 3, dogs = 1 }
+local dictionary = FromEntries(entries) -- { hello = "roblox", goodbye = "world" }
 
-

flip

Dictionary.flip(
dictionary{[K]V}-- -

The dictionary to flip.

-
) → {[V]K}-- -

The flipped dictionary.

+

removeKey

Dictionary.removeKey(
dictionary{[K]V},-- +

The dictionary to remove the key from.

+
keyK-- +

The key to remove.

+
) → {[K]V}-- +

The dictionary without the given key.

-

Flips a dictionary. Keys become values and values become keys.

+

Removes the given key from the given dictionary.

local dictionary = { hello = "roblox", goodbye = "world" }
 
-local new = Flip(dictionary) -- { world = "goodbye", roblox = "hello" }
+local withoutHello = RemoveKey(dictionary, "hello") -- { goodbye = "world" }
+local withoutGoodbye = RemoveKey(dictionary, "goodbye") -- { hello = "roblox" }
 
-

some

Dictionary.some(
dictionary{[K]V},-- -

The dictionary to check.

-
predicate(
valueV,
keyK,
dictionary{[K]V}
) → any-- -

The predicate to check against.

+

equalsDeep

Dictionary.equalsDeep(
......{[any]any}-- +

The dictionaries to compare.

) → boolean-- -

Whether or not the predicate returned true for any value.

+

Whether the dictionaries are equal.

-

Checks whether or not the predicate returned true for any value in the dictionary.

-
local dictionary = { hello = "world", cat = "meow", unicorn = "rainbow" }
-
-local hasMeow = Some(dictionary, function(value)
-  return value == "meow"
-end) -- true
+

Compares two dictionaries for equality using deep comparison.

+
local dictionary = { hello = "world", goodbye = { world = "hello" } }
+local other1 = { hello = "world", goodbye = { world = "hello" } }
+local other2 = { hello = "hello", world = "goodbye" }
 
-local hasDog = Some(dictionary, function(_, key)
-  return key == "dog"
-end) -- false
+local value = EqualsDeep(dictionary, other1) -- true
+local value = EqualsDeep(dictionary, other1, other2) -- false
 
-

mergeDeep

Dictionary.mergeDeep(
dictionaries?...any-- -

The dictionaries to merge.

+

freeze

Dictionary.freeze(
dictionaryT-- +

The dictionary to freeze.

) → T-- -

The merged dictionary.

+

The frozen dictionary.

-

- Merges the given dictionaries into a single dictionary. If the - value is None, it will be removed from the result. This is - recursive. The parameters may be any number of dictionaries or - nil. Non-dictonaries will be ignored. -

-

Aliases: joinDeep

-
local dictionary1 = { hello = "roblox", goodbye = { world = "goodbye" } }
-local dictionary2 = { goodbye = { world = "world" } }
+

Freezes the given dictionary at the top level, making it read-only.

+
local dictionary = { hello = "roblox", goodbye = { world = "world" } }
 
-local merged = MergeDeep(dictionary1, dictionary2) -- { hello = "roblox", goodbye = { world = "world" } }
-
-

filter

Dictionary.filter(
dictionary{[K]V},-- -

The dictionary to filter.

-
predicate?(
valueV,
keyK,
dictionary{[K]V}
) → any-- -

The predicate to use to filter the dictionary.

-
) → {[K]V}-- -

The filtered dictionary.

-
-

Filters a dictionary using a predicate. Any items that do not pass the predicate will be removed from the dictionary.

-
local dictionary = { hello = "world", goodbye = "goodbye" }
+local new = Freeze(dictionary)
 
-local result = Filter(dictionary, function(value, key)
-  return value == "world"
-end) -- { hello = "world" }
+new.hello = "world" -- error!
+new.goodbye.world = "hello" -- still works!
 
-

fromArrays

Dictionary.fromArrays(
keys{K},-- +

fromArrays

Dictionary.fromArrays(
keys{K},--

An array containing values to be used as keys.

values{V}--

An array containing values to be used as values.

@@ -345,20 +310,7 @@ local dictionary = FromArrays(keys, values) -- { hello = "roblox", goodbye = "world" }
-

freezeDeep

Dictionary.freezeDeep(
dictionaryT-- -

The dictionary to freeze.

-
) → T-- -

The frozen dictionary.

-
-

Freezes the entire dictionary, making it read-only, including all nested dictionaries.

-
local dictionary = { hello = "roblox", goodbye = { world = "world" } }
-
-local new = FreezeDeep(dictionary)
-
-new.hello = "world" -- error!
-new.goodbye.world = "hello" -- error!
-
-

set

Dictionary.set(
dictionary{[K]V},-- +

set

Dictionary.set(
dictionary{[K]V},--

The dictionary to set the value in.

keyK,--

The key to set the value in.

@@ -372,32 +324,42 @@ local setCat = Set(dictionary, "cat", "woof") -- { hello = "world", cat = "woof", unicorn = "rainbow" } -

removeKeys

Dictionary.removeKeys(
dictionary{[K]V},-- -

The dictionary to remove the keys from.

-
keys...K-- -

The keys to remove.

-
) → {[K]V}-- -

The dictionary without the given keys.

+

count

Dictionary.count(
dictionaryT,-- +

The dictionary to count.

+
predicate?(
valueT,
keyK,
dictionaryT
) → any-- +

The predicate to use to filter the dictionary.

+
) → number-- +

The number of items in the dictionary.

-

Removes the given keys from the given dictionary.

-
local dictionary = { hello = "world", cat = "meow", dog = "woof", unicorn = "rainbow" }
+

Counts the number of items in a dictionary.

+
local dictionary = { hello = "world", goodbye = "world" }
 
-local withoutCatDog = RemoveKeys(dictionary, "cat", "dog") -- { hello = "world", unicorn = "rainbow" }
+local value = Count(dictionary) -- 2
+local value = Count(dictionary, function(item, key)
+  return item == "world"
+end) -- 1
 
-

copy

Dictionary.copy(
dictionaryT-- -

The dictionary to copy.

-
) → T-- -

The copied dictionary.

+

keys

Dictionary.keys(
dictionary{[K]V}-- +

The dictionary to get the keys of.

+
) → {K}-- +

An array containing the keys of the given dictionary.

-

Copies a dictionary.

-
local dictionary = { hello = "world" }
+

Gets the keys of the given dictionary as an array.

+
local dictionary = { hello = "roblox", goodbye = "world" }
 
-local new = Copy(dictionary) -- { hello = "world" }
+local keys = Keys(dictionary) -- { "hello", "goodbye" }
+
+

flip

Dictionary.flip(
dictionary{[K]V}-- +

The dictionary to flip.

+
) → {[V]K}-- +

The flipped dictionary.

+
+

Flips a dictionary. Keys become values and values become keys.

+
local dictionary = { hello = "roblox", goodbye = "world" }
 
-print(new == dictionary) -- false
-print(new.hello == dictionary.hello) -- true
+local new = Flip(dictionary) -- { world = "goodbye", roblox = "hello" }
 
-

withKeys

Dictionary.withKeys(
dictionary{[K]V},-- +

withKeys

Dictionary.withKeys(
dictionary{[K]V},--

The dictionary to select the keys from.

keys...K--

The keys to keep.

@@ -409,25 +371,45 @@ local withoutCatDog = WithKeys(dictionary, "cat", "dog") -- { cat = "meow", dog = "woof" }
-

every

Dictionary.every(
dictionary{[K]V},-- -

The dictionary to check.

-
predicate(
valueV,
keyK,
dictionary{[K]V}
) → any-- -

The predicate to use to check the dictionary.

+

equals

Dictionary.equals(
......{[any]any}-- +

The dictionaries to compare.

) → boolean-- -

Whether every item in the dictionary passes the predicate.

+

Whether the dictionaries are equal.

-

Checks whether every item in the dictionary passes the predicate.

+

Compares two dictionaries for equality.

local dictionary = { hello = "world", goodbye = "world" }
+local other1 = { hello = "world", goodbye = "world" }
+local other2 = { hello = "hello", world = "goodbye" }
 
-local value = Every(dictionary, function(value, key)
-  return value == "world"
-end) -- true
+local value = Equals(dictionary, other1) -- true
+local value = Equals(dictionary, other1, other2) -- false
+
+

removeKeys

Dictionary.removeKeys(
dictionary{[K]V},-- +

The dictionary to remove the keys from.

+
keys...K-- +

The keys to remove.

+
) → {[K]V}-- +

The dictionary without the given keys.

+
+

Removes the given keys from the given dictionary.

+
local dictionary = { hello = "world", cat = "meow", dog = "woof", unicorn = "rainbow" }
 
-local value = Every(dictionary, function(value, key)
-  return value == "hello"
-end) -- false
+local withoutCatDog = RemoveKeys(dictionary, "cat", "dog") -- { hello = "world", unicorn = "rainbow" }
+
+

has

Dictionary.has(
dictionary{[K]V},-- +

The dictionary to check.

+
keyany-- +

The key to check for.

+
) → boolean-- +

Whether or not the dictionary has the given key.

+
+

Checks whether or not the given dictionary has the given key.

+
local dictionary = { hello = "roblox", goodbye = "world" }
+
+local hasHello = Has(dictionary, "hello") -- true
+local hasCat = Has(dictionary, "cat") -- false
 
-

entries

Dictionary.entries(
dictionary{[K]V}-- +

entries

Dictionary.entries(
dictionary{[K]V}--

The dictionary to get the entries from.

) → {{
K,
V
}}--

The entries in the dictionary.

@@ -437,117 +419,150 @@ local entries = Entries(dictionary) -- { { "hello", "roblox" }, { "goodbye", "world" } } -

equalsDeep

Dictionary.equalsDeep(
......{[any]any}-- -

The dictionaries to compare.

+

some

Dictionary.some(
dictionary{[K]V},-- +

The dictionary to check.

+
predicate(
valueV,
keyK,
dictionary{[K]V}
) → any-- +

The predicate to check against.

) → boolean-- -

Whether the dictionaries are equal.

+

Whether or not the predicate returned true for any value.

-

Compares two dictionaries for equality using deep comparison.

-
local dictionary = { hello = "world", goodbye = { world = "hello" } }
-local other1 = { hello = "world", goodbye = { world = "hello" } }
-local other2 = { hello = "hello", world = "goodbye" }
+

Checks whether or not the predicate returned true for any value in the dictionary.

+
local dictionary = { hello = "world", cat = "meow", unicorn = "rainbow" }
 
-local value = EqualsDeep(dictionary, other1) -- true
-local value = EqualsDeep(dictionary, other1, other2) -- false
+local hasMeow = Some(dictionary, function(value)
+  return value == "meow"
+end) -- true
+
+local hasDog = Some(dictionary, function(_, key)
+  return key == "dog"
+end) -- false
+
+

freezeDeep

Dictionary.freezeDeep(
dictionaryT-- +

The dictionary to freeze.

+
) → T-- +

The frozen dictionary.

+
+

Freezes the entire dictionary, making it read-only, including all nested dictionaries.

+
local dictionary = { hello = "roblox", goodbye = { world = "world" } }
+
+local new = FreezeDeep(dictionary)
+
+new.hello = "world" -- error!
+new.goodbye.world = "hello" -- error!
 
Show raw api
{
     "functions": [
         {
-            "name": "count",
-            "desc": "Counts the number of items in a dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\", goodbye = \"world\" }\n\nlocal value = Count(dictionary) -- 2\nlocal value = Count(dictionary, function(item, key)\n  return item == \"world\"\nend) -- 1\n```",
+            "name": "copy",
+            "desc": "Copies a dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\" }\n\nlocal new = Copy(dictionary) -- { hello = \"world\" }\n\nprint(new == dictionary) -- false\nprint(new.hello == dictionary.hello) -- true\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to count.",
+                    "desc": "The dictionary to copy.",
                     "lua_type": "T"
-                },
-                {
-                    "name": "predicate?",
-                    "desc": "The predicate to use to filter the dictionary.",
-                    "lua_type": "(value: T, key: K, dictionary: T) -> any"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The number of items in the dictionary.",
-                    "lua_type": "number"
+                    "desc": "The copied dictionary.",
+                    "lua_type": "T"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 25,
-                "path": "src/Dictionary/count.lua"
+                "line": 20,
+                "path": "src/Dictionary/copy.lua"
             }
         },
         {
-            "name": "fromEntries",
-            "desc": "Creates a dictionary from the given key-value pairs.\n\n```lua\nlocal entries = { { \"hello\", \"roblox\" }, { \"goodbye\", \"world\" } }\n\nlocal dictionary = FromEntries(entries) -- { hello = \"roblox\", goodbye = \"world\" }\n```",
+            "name": "update",
+            "desc": "Updates a value in a dictionary at the given key. If the value at the given key does not exist, `callback` will be called, and its return value will be used as the value at the given key.\n\n```lua\nlocal dictionary = { cats = 2 }\n\nlocal new = Update(dictionary, \"cats\", function(value)\n  return value + 1\nend) -- { cats = 3 }\n\nlocal new = Update(dictionary, \"dogs\", function(value)\n  return value + 1\nend, function(value)\n  return 1\nend) -- { cats = 3, dogs = 1 }\n```",
             "params": [
                 {
-                    "name": "entries",
-                    "desc": "An array of key-value pairs.",
-                    "lua_type": "{{ K, V }}"
+                    "name": "dictionary",
+                    "desc": "The dictionary to update.",
+                    "lua_type": "{[K]: V?}"
+                },
+                {
+                    "name": "key",
+                    "desc": "The key to update.",
+                    "lua_type": "K"
+                },
+                {
+                    "name": "updater?",
+                    "desc": "The updater function.",
+                    "lua_type": "(value: V, key: K) -> U"
+                },
+                {
+                    "name": "callback?",
+                    "desc": "The callback function.",
+                    "lua_type": "(key: K) -> C"
                 }
             ],
             "returns": [
                 {
-                    "desc": "A dictionary composed of the given key-value pairs.",
-                    "lua_type": "{[K]: V}"
+                    "desc": "The updated dictionary.",
+                    "lua_type": "{[K]: V | U | C}"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 17,
-                "path": "src/Dictionary/fromEntries.lua"
+                "line": 30,
+                "path": "src/Dictionary/update.lua"
             }
         },
         {
-            "name": "values",
-            "desc": "Gets the values in the given dictionary.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal values = Values(dictionary) -- { \"roblox\", \"world\" }\n```",
+            "name": "map",
+            "desc": "Maps the dictionary using the mapper function. The mapper function can\nreturn a value and a key. If the mapper function does not return a key,\nthe original key will be used.\n\n```lua\nlocal dictionary = { hello = 10, goodbye = 20 }\n\nlocal new = Map(dictionary, function(value, key)\n  return value * 2, key .. \"!\"\nend) -- { [\"hello!\"] = 20, [\"goodbye!\"] = 40 }\n\nlocal new = Map(dictionary, function(value, key)\n  return value * 10\nend) -- { hello = 100, goodbye = 200 }\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to get the values from.",
+                    "desc": "The dictionary to map.",
                     "lua_type": "{[K]: V}"
+                },
+                {
+                    "name": "mapper",
+                    "desc": "The mapper function.",
+                    "lua_type": "(value: V, key: K, dictionary: {[K]: V}) -> (Y?, X?)"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The values in the dictionary.",
-                    "lua_type": "{V}"
+                    "desc": "The mapped dictionary.",
+                    "lua_type": "{[X]: Y}"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 17,
-                "path": "src/Dictionary/values.lua"
+                "line": 26,
+                "path": "src/Dictionary/map.lua"
             }
         },
         {
-            "name": "has",
-            "desc": "Checks whether or not the given dictionary has the given key.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal hasHello = Has(dictionary, \"hello\") -- true\nlocal hasCat = Has(dictionary, \"cat\") -- false\n```",
+            "name": "flatten",
+            "desc": "Flattens a dictionary. If depth is not specified, it will flatten the dictionary as far as it can go.\n\n```lua\nlocal dictionary = {\n  hello = \"world\",\n  goodbye = {\n    world = \"hello\",\n    roblox = {\n      yes = \"no\",\n      no = \"yes\",\n    }\n  }\n}\n\nlocal new = Flatten(dictionary) -- { hello = \"world\", world = \"hello\", yes = \"no\", no = \"yes\" }\nlocal new = Flatten(dictionary, 1) -- { hello = \"world\", world = \"hello\", roblox = { yes = \"no\", no = \"yes\" } }\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to check.",
-                    "lua_type": "{[K]: V}"
+                    "desc": "The dictionary to flatten.",
+                    "lua_type": "T"
                 },
                 {
-                    "name": "key",
-                    "desc": "The key to check for.",
-                    "lua_type": "any"
+                    "name": "depth?",
+                    "desc": "The depth to flatten the dictionary to.",
+                    "lua_type": "number"
                 }
             ],
             "returns": [
                 {
-                    "desc": "Whether or not the dictionary has the given key.",
-                    "lua_type": "boolean"
+                    "desc": "The flattened dictionary.",
+                    "lua_type": "T"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 21,
-                "path": "src/Dictionary/has.lua"
+                "line": 30,
+                "path": "src/Dictionary/flatten.lua"
             }
         },
         {
@@ -578,101 +593,79 @@
             }
         },
         {
-            "name": "removeValue",
-            "desc": "Removes the given value from the given dictionary.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal withoutHello = RemoveValue(dictionary, \"roblox\") -- { goodbye = \"world\" }\nlocal withoutGoodbye = RemoveValue(dictionary, \"world\") -- { hello = \"roblox\" }\n```",
+            "name": "removeValues",
+            "desc": "Removes the given values from the given dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\", cat = \"meow\", unicorn = \"rainbow\", goodbye = \"world\" }\n\nlocal withoutWorld = RemoveValues(dictionary, \"world\") -- { cat = \"meow\", unicorn = \"rainbow\" }\nlocal onlyWorld = RemoveValues(dictionary, \"meow\", \"rainbow\") -- { hello = \"world\", goodbye = \"world\" }\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to remove the value from.",
+                    "desc": "The dictionary to remove the values from.",
                     "lua_type": "{[K]: V}"
                 },
                 {
-                    "name": "value",
-                    "desc": "The value to remove.",
-                    "lua_type": "V"
+                    "name": "values",
+                    "desc": "The values to remove.",
+                    "lua_type": "...V"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The dictionary without the given value.",
+                    "desc": "The dictionary without the given values.",
                     "lua_type": "{[K]: V}"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 19,
-                "path": "src/Dictionary/removeValue.lua"
+                "line": 23,
+                "path": "src/Dictionary/removeValues.lua"
             }
         },
         {
-            "name": "copyDeep",
-            "desc": "Copies a dictionary recursively.\n\n```lua\nlocal dictionary = { hello = { world = \"goodbye\" } }\n\nlocal new = CopyDeep(dictionary) -- { hello = { world = \"goodbye\" } }\n\nprint(new == dictionary) -- false\nprint(new.hello == dictionary.hello) -- false\n```",
+            "name": "mergeDeep",
+            "desc": "Merges the given dictionaries into a single dictionary. If the\nvalue is `None`, it will be removed from the result. This is\nrecursive. The parameters may be any number of dictionaries or\n`nil`. Non-dictonaries will be ignored.\n\nAliases: `joinDeep`\n\n```lua\nlocal dictionary1 = { hello = \"roblox\", goodbye = { world = \"goodbye\" } }\nlocal dictionary2 = { goodbye = { world = \"world\" } }\n\nlocal merged = MergeDeep(dictionary1, dictionary2) -- { hello = \"roblox\", goodbye = { world = \"world\" } }\n```",
             "params": [
                 {
-                    "name": "dictionary",
-                    "desc": "The dictionary to copy.",
-                    "lua_type": "T"
+                    "name": "dictionaries?",
+                    "desc": "The dictionaries to merge.",
+                    "lua_type": "...any"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The copied dictionary.",
+                    "desc": "The merged dictionary.",
                     "lua_type": "T"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 20,
-                "path": "src/Dictionary/copyDeep.lua"
+                "line": 28,
+                "path": "src/Dictionary/mergeDeep.lua"
             }
         },
         {
-            "name": "map",
-            "desc": "Maps the dictionary using the mapper function. The mapper function can\nreturn a value and a key. If the mapper function does not return a key,\nthe original key will be used.\n\n```lua\nlocal dictionary = { hello = 10, goodbye = 20 }\n\nlocal new = Map(dictionary, function(value, key)\n  return value * 2, key .. \"!\"\nend) -- { [\"hello!\"] = 20, [\"goodbye!\"] = 40 }\n\nlocal new = Map(dictionary, function(value, key)\n  return value * 10\nend) -- { hello = 100, goodbye = 200 }\n```",
+            "name": "removeValue",
+            "desc": "Removes the given value from the given dictionary.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal withoutHello = RemoveValue(dictionary, \"roblox\") -- { goodbye = \"world\" }\nlocal withoutGoodbye = RemoveValue(dictionary, \"world\") -- { hello = \"roblox\" }\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to map.",
+                    "desc": "The dictionary to remove the value from.",
                     "lua_type": "{[K]: V}"
                 },
                 {
-                    "name": "mapper",
-                    "desc": "The mapper function.",
-                    "lua_type": "(value: V, key: K, dictionary: {[K]: V}) -> (Y?, X?)"
-                }
-            ],
-            "returns": [
-                {
-                    "desc": "The mapped dictionary.",
-                    "lua_type": "{[X]: Y}"
-                }
-            ],
-            "function_type": "static",
-            "source": {
-                "line": 26,
-                "path": "src/Dictionary/map.lua"
-            }
-        },
-        {
-            "name": "freeze",
-            "desc": "Freezes the given dictionary at the top level, making it read-only.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = { world = \"world\" } }\n\nlocal new = Freeze(dictionary)\n\nnew.hello = \"world\" -- error!\nnew.goodbye.world = \"hello\" -- still works!\n```",
-            "params": [
-                {
-                    "name": "dictionary",
-                    "desc": "The dictionary to freeze.",
-                    "lua_type": "T"
+                    "name": "value",
+                    "desc": "The value to remove.",
+                    "lua_type": "V"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The frozen dictionary.",
-                    "lua_type": "T"
+                    "desc": "The dictionary without the given value.",
+                    "lua_type": "{[K]: V}"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 23,
-                "path": "src/Dictionary/freeze.lua"
+                "line": 19,
+                "path": "src/Dictionary/removeValue.lua"
             }
         },
         {
@@ -698,263 +691,194 @@
             }
         },
         {
-            "name": "keys",
-            "desc": "Gets the keys of the given dictionary as an array.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal keys = Keys(dictionary) -- { \"hello\", \"goodbye\" }\n```",
-            "params": [
-                {
-                    "name": "dictionary",
-                    "desc": "The dictionary to get the keys of.",
-                    "lua_type": "{[K]: V}"
-                }
-            ],
-            "returns": [
-                {
-                    "desc": "An array containing the keys of the given dictionary.",
-                    "lua_type": "{K}"
-                }
-            ],
-            "function_type": "static",
-            "source": {
-                "line": 17,
-                "path": "src/Dictionary/keys.lua"
-            }
-        },
-        {
-            "name": "removeValues",
-            "desc": "Removes the given values from the given dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\", cat = \"meow\", unicorn = \"rainbow\", goodbye = \"world\" }\n\nlocal withoutWorld = RemoveValues(dictionary, \"world\") -- { cat = \"meow\", unicorn = \"rainbow\" }\nlocal onlyWorld = RemoveValues(dictionary, \"meow\", \"rainbow\") -- { hello = \"world\", goodbye = \"world\" }\n```",
+            "name": "filter",
+            "desc": "Filters a dictionary using a predicate. Any items that do not pass the predicate will be removed from the dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\", goodbye = \"goodbye\" }\n\nlocal result = Filter(dictionary, function(value, key)\n  return value == \"world\"\nend) -- { hello = \"world\" }\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to remove the values from.",
+                    "desc": "The dictionary to filter.",
                     "lua_type": "{[K]: V}"
                 },
                 {
-                    "name": "values",
-                    "desc": "The values to remove.",
-                    "lua_type": "...V"
+                    "name": "predicate?",
+                    "desc": "The predicate to use to filter the dictionary.",
+                    "lua_type": "(value: V, key: K, dictionary: {[K]: V}) -> any"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The dictionary without the given values.",
+                    "desc": "The filtered dictionary.",
                     "lua_type": "{[K]: V}"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 23,
-                "path": "src/Dictionary/removeValues.lua"
+                "line": 24,
+                "path": "src/Dictionary/filter.lua"
             }
         },
         {
-            "name": "removeKey",
-            "desc": "Removes the given key from the given dictionary.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal withoutHello = RemoveKey(dictionary, \"hello\") -- { goodbye = \"world\" }\nlocal withoutGoodbye = RemoveKey(dictionary, \"goodbye\") -- { hello = \"roblox\" }\n```",
+            "name": "every",
+            "desc": "Checks whether every item in the dictionary passes the predicate.\n\n```lua\nlocal dictionary = { hello = \"world\", goodbye = \"world\" }\n\nlocal value = Every(dictionary, function(value, key)\n  return value == \"world\"\nend) -- true\n\nlocal value = Every(dictionary, function(value, key)\n  return value == \"hello\"\nend) -- false\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to remove the key from.",
+                    "desc": "The dictionary to check.",
                     "lua_type": "{[K]: V}"
                 },
                 {
-                    "name": "key",
-                    "desc": "The key to remove.",
-                    "lua_type": "K"
-                }
-            ],
-            "returns": [
-                {
-                    "desc": "The dictionary without the given key.",
-                    "lua_type": "{[K]: V}"
-                }
-            ],
-            "function_type": "static",
-            "source": {
-                "line": 21,
-                "path": "src/Dictionary/removeKey.lua"
-            }
-        },
-        {
-            "name": "equals",
-            "desc": "Compares two dictionaries for equality.\n\n```lua\nlocal dictionary = { hello = \"world\", goodbye = \"world\" }\nlocal other1 = { hello = \"world\", goodbye = \"world\" }\nlocal other2 = { hello = \"hello\", world = \"goodbye\" }\n\nlocal value = Equals(dictionary, other1) -- true\nlocal value = Equals(dictionary, other1, other2) -- false\n```",
-            "params": [
-                {
-                    "name": "...",
-                    "desc": "The dictionaries to compare.",
-                    "lua_type": "...{ [any]: any }"
+                    "name": "predicate",
+                    "desc": "The predicate to use to check the dictionary.",
+                    "lua_type": "(value: V, key: K, dictionary: {[K]: V}) -> any"
                 }
             ],
             "returns": [
                 {
-                    "desc": "Whether the dictionaries are equal.",
+                    "desc": "Whether every item in the dictionary passes the predicate.",
                     "lua_type": "boolean"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 45,
-                "path": "src/Dictionary/equals.lua"
+                "line": 24,
+                "path": "src/Dictionary/every.lua"
             }
         },
         {
-            "name": "flatten",
-            "desc": "Flattens a dictionary. If depth is not specified, it will flatten the dictionary as far as it can go.\n\n```lua\nlocal dictionary = {\n  hello = \"world\",\n  goodbye = {\n    world = \"hello\",\n    roblox = {\n      yes = \"no\",\n      no = \"yes\",\n    }\n  }\n}\n\nlocal new = Flatten(dictionary) -- { hello = \"world\", world = \"hello\", yes = \"no\", no = \"yes\" }\nlocal new = Flatten(dictionary, 1) -- { hello = \"world\", world = \"hello\", roblox = { yes = \"no\", no = \"yes\" } }\n```",
+            "name": "values",
+            "desc": "Gets the values in the given dictionary.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal values = Values(dictionary) -- { \"roblox\", \"world\" }\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to flatten.",
-                    "lua_type": "T"
-                },
-                {
-                    "name": "depth?",
-                    "desc": "The depth to flatten the dictionary to.",
-                    "lua_type": "number"
+                    "desc": "The dictionary to get the values from.",
+                    "lua_type": "{[K]: V}"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The flattened dictionary.",
-                    "lua_type": "T"
+                    "desc": "The values in the dictionary.",
+                    "lua_type": "{V}"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 30,
-                "path": "src/Dictionary/flatten.lua"
+                "line": 17,
+                "path": "src/Dictionary/values.lua"
             }
         },
         {
-            "name": "update",
-            "desc": "Updates a value in a dictionary at the given key. If the value at the given key does not exist, `callback` will be called, and its return value will be used as the value at the given key.\n\n```lua\nlocal dictionary = { cats = 2 }\n\nlocal new = Update(dictionary, \"cats\", function(value)\n  return value + 1\nend) -- { cats = 3 }\n\nlocal new = Update(dictionary, \"dogs\", function(value)\n  return value + 1\nend, function(value)\n  return 1\nend) -- { cats = 3, dogs = 1 }\n```",
+            "name": "copyDeep",
+            "desc": "Copies a dictionary recursively.\n\n```lua\nlocal dictionary = { hello = { world = \"goodbye\" } }\n\nlocal new = CopyDeep(dictionary) -- { hello = { world = \"goodbye\" } }\n\nprint(new == dictionary) -- false\nprint(new.hello == dictionary.hello) -- false\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to update.",
-                    "lua_type": "{[K]: V}"
-                },
-                {
-                    "name": "key",
-                    "desc": "The key to update.",
-                    "lua_type": "K"
-                },
-                {
-                    "name": "updater?",
-                    "desc": "The updater function.",
-                    "lua_type": "(value: V, key: K) -> U"
-                },
-                {
-                    "name": "callback?",
-                    "desc": "The callback function.",
-                    "lua_type": "(key: K) -> C"
+                    "desc": "The dictionary to copy.",
+                    "lua_type": "T"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The updated dictionary.",
-                    "lua_type": "{[K]: V & U & C }"
+                    "desc": "The copied dictionary.",
+                    "lua_type": "T"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 39,
-                "path": "src/Dictionary/update.lua"
+                "line": 20,
+                "path": "src/Dictionary/copyDeep.lua"
             }
         },
         {
-            "name": "flip",
-            "desc": "Flips a dictionary. Keys become values and values become keys.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal new = Flip(dictionary) -- { world = \"goodbye\", roblox = \"hello\" }\n```",
+            "name": "fromEntries",
+            "desc": "Creates a dictionary from the given key-value pairs.\n\n```lua\nlocal entries = { { \"hello\", \"roblox\" }, { \"goodbye\", \"world\" } }\n\nlocal dictionary = FromEntries(entries) -- { hello = \"roblox\", goodbye = \"world\" }\n```",
             "params": [
                 {
-                    "name": "dictionary",
-                    "desc": "The dictionary to flip.",
-                    "lua_type": "{ [K]: V }"
+                    "name": "entries",
+                    "desc": "An array of key-value pairs.",
+                    "lua_type": "{{ K, V }}"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The flipped dictionary.",
-                    "lua_type": "{ [V]: K }"
+                    "desc": "A dictionary composed of the given key-value pairs.",
+                    "lua_type": "{[K]: V}"
                 }
             ],
             "function_type": "static",
             "source": {
                 "line": 17,
-                "path": "src/Dictionary/flip.lua"
+                "path": "src/Dictionary/fromEntries.lua"
             }
         },
         {
-            "name": "some",
-            "desc": "Checks whether or not the predicate returned true for any value in the dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\", cat = \"meow\", unicorn = \"rainbow\" }\n\nlocal hasMeow = Some(dictionary, function(value)\n  return value == \"meow\"\nend) -- true\n\nlocal hasDog = Some(dictionary, function(_, key)\n  return key == \"dog\"\nend) -- false\n```",
+            "name": "removeKey",
+            "desc": "Removes the given key from the given dictionary.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal withoutHello = RemoveKey(dictionary, \"hello\") -- { goodbye = \"world\" }\nlocal withoutGoodbye = RemoveKey(dictionary, \"goodbye\") -- { hello = \"roblox\" }\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to check.",
+                    "desc": "The dictionary to remove the key from.",
                     "lua_type": "{[K]: V}"
                 },
                 {
-                    "name": "predicate",
-                    "desc": "The predicate to check against.",
-                    "lua_type": "(value: V, key: K, dictionary: { [K]: V }) -> any"
+                    "name": "key",
+                    "desc": "The key to remove.",
+                    "lua_type": "K"
                 }
             ],
             "returns": [
                 {
-                    "desc": "Whether or not the predicate returned true for any value.",
-                    "lua_type": "boolean"
+                    "desc": "The dictionary without the given key.",
+                    "lua_type": "{[K]: V}"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 24,
-                "path": "src/Dictionary/some.lua"
+                "line": 21,
+                "path": "src/Dictionary/removeKey.lua"
             }
         },
         {
-            "name": "mergeDeep",
-            "desc": "Merges the given dictionaries into a single dictionary. If the\nvalue is `None`, it will be removed from the result. This is\nrecursive. The parameters may be any number of dictionaries or\n`nil`. Non-dictonaries will be ignored.\n\nAliases: `joinDeep`\n\n```lua\nlocal dictionary1 = { hello = \"roblox\", goodbye = { world = \"goodbye\" } }\nlocal dictionary2 = { goodbye = { world = \"world\" } }\n\nlocal merged = MergeDeep(dictionary1, dictionary2) -- { hello = \"roblox\", goodbye = { world = \"world\" } }\n```",
+            "name": "equalsDeep",
+            "desc": "Compares two dictionaries for equality using deep comparison.\n\n```lua\nlocal dictionary = { hello = \"world\", goodbye = { world = \"hello\" } }\nlocal other1 = { hello = \"world\", goodbye = { world = \"hello\" } }\nlocal other2 = { hello = \"hello\", world = \"goodbye\" }\n\nlocal value = EqualsDeep(dictionary, other1) -- true\nlocal value = EqualsDeep(dictionary, other1, other2) -- false\n```",
             "params": [
                 {
-                    "name": "dictionaries?",
-                    "desc": "The dictionaries to merge.",
-                    "lua_type": "...any"
+                    "name": "...",
+                    "desc": "The dictionaries to compare.",
+                    "lua_type": "...{ [any]: any }"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The merged dictionary.",
-                    "lua_type": "T"
+                    "desc": "Whether the dictionaries are equal.",
+                    "lua_type": "boolean"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 28,
-                "path": "src/Dictionary/mergeDeep.lua"
+                "line": 45,
+                "path": "src/Dictionary/equalsDeep.lua"
             }
         },
         {
-            "name": "filter",
-            "desc": "Filters a dictionary using a predicate. Any items that do not pass the predicate will be removed from the dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\", goodbye = \"goodbye\" }\n\nlocal result = Filter(dictionary, function(value, key)\n  return value == \"world\"\nend) -- { hello = \"world\" }\n```",
+            "name": "freeze",
+            "desc": "Freezes the given dictionary at the top level, making it read-only.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = { world = \"world\" } }\n\nlocal new = Freeze(dictionary)\n\nnew.hello = \"world\" -- error!\nnew.goodbye.world = \"hello\" -- still works!\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to filter.",
-                    "lua_type": "{[K]: V}"
-                },
-                {
-                    "name": "predicate?",
-                    "desc": "The predicate to use to filter the dictionary.",
-                    "lua_type": "(value: V, key: K, dictionary: {[K]: V}) -> any"
+                    "desc": "The dictionary to freeze.",
+                    "lua_type": "T"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The filtered dictionary.",
-                    "lua_type": "{[K]: V}"
+                    "desc": "The frozen dictionary.",
+                    "lua_type": "T"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 24,
-                "path": "src/Dictionary/filter.lua"
+                "line": 23,
+                "path": "src/Dictionary/freeze.lua"
             }
         },
         {
@@ -984,28 +908,6 @@
                 "path": "src/Dictionary/fromArrays.lua"
             }
         },
-        {
-            "name": "freezeDeep",
-            "desc": "Freezes the entire dictionary, making it read-only, including all nested dictionaries.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = { world = \"world\" } }\n\nlocal new = FreezeDeep(dictionary)\n\nnew.hello = \"world\" -- error!\nnew.goodbye.world = \"hello\" -- error!\n```",
-            "params": [
-                {
-                    "name": "dictionary",
-                    "desc": "The dictionary to freeze.",
-                    "lua_type": "T"
-                }
-            ],
-            "returns": [
-                {
-                    "desc": "The frozen dictionary.",
-                    "lua_type": "T"
-                }
-            ],
-            "function_type": "static",
-            "source": {
-                "line": 22,
-                "path": "src/Dictionary/freezeDeep.lua"
-            }
-        },
         {
             "name": "set",
             "desc": "Sets the given value in the given dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\", cat = \"meow\", unicorn = \"rainbow\" }\n\nlocal setCat = Set(dictionary, \"cat\", \"woof\") -- { hello = \"world\", cat = \"woof\", unicorn = \"rainbow\" }\n```",
@@ -1039,52 +941,74 @@
             }
         },
         {
-            "name": "removeKeys",
-            "desc": "Removes the given keys from the given dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\", cat = \"meow\", dog = \"woof\", unicorn = \"rainbow\" }\n\nlocal withoutCatDog = RemoveKeys(dictionary, \"cat\", \"dog\") -- { hello = \"world\", unicorn = \"rainbow\" }\n```",
+            "name": "count",
+            "desc": "Counts the number of items in a dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\", goodbye = \"world\" }\n\nlocal value = Count(dictionary) -- 2\nlocal value = Count(dictionary, function(item, key)\n  return item == \"world\"\nend) -- 1\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to remove the keys from.",
-                    "lua_type": "{[K]: V}"
+                    "desc": "The dictionary to count.",
+                    "lua_type": "T"
                 },
                 {
-                    "name": "keys",
-                    "desc": "The keys to remove.",
-                    "lua_type": "...K"
+                    "name": "predicate?",
+                    "desc": "The predicate to use to filter the dictionary.",
+                    "lua_type": "(value: T, key: K, dictionary: T) -> any"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The dictionary without the given keys.",
+                    "desc": "The number of items in the dictionary.",
+                    "lua_type": "number"
+                }
+            ],
+            "function_type": "static",
+            "source": {
+                "line": 25,
+                "path": "src/Dictionary/count.lua"
+            }
+        },
+        {
+            "name": "keys",
+            "desc": "Gets the keys of the given dictionary as an array.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal keys = Keys(dictionary) -- { \"hello\", \"goodbye\" }\n```",
+            "params": [
+                {
+                    "name": "dictionary",
+                    "desc": "The dictionary to get the keys of.",
                     "lua_type": "{[K]: V}"
                 }
             ],
+            "returns": [
+                {
+                    "desc": "An array containing the keys of the given dictionary.",
+                    "lua_type": "{K}"
+                }
+            ],
             "function_type": "static",
             "source": {
-                "line": 20,
-                "path": "src/Dictionary/removeKeys.lua"
+                "line": 17,
+                "path": "src/Dictionary/keys.lua"
             }
         },
         {
-            "name": "copy",
-            "desc": "Copies a dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\" }\n\nlocal new = Copy(dictionary) -- { hello = \"world\" }\n\nprint(new == dictionary) -- false\nprint(new.hello == dictionary.hello) -- true\n```",
+            "name": "flip",
+            "desc": "Flips a dictionary. Keys become values and values become keys.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal new = Flip(dictionary) -- { world = \"goodbye\", roblox = \"hello\" }\n```",
             "params": [
                 {
                     "name": "dictionary",
-                    "desc": "The dictionary to copy.",
-                    "lua_type": "T"
+                    "desc": "The dictionary to flip.",
+                    "lua_type": "{ [K]: V }"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The copied dictionary.",
-                    "lua_type": "T"
+                    "desc": "The flipped dictionary.",
+                    "lua_type": "{ [V]: K }"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 20,
-                "path": "src/Dictionary/copy.lua"
+                "line": 17,
+                "path": "src/Dictionary/flip.lua"
             }
         },
         {
@@ -1115,8 +1039,57 @@
             }
         },
         {
-            "name": "every",
-            "desc": "Checks whether every item in the dictionary passes the predicate.\n\n```lua\nlocal dictionary = { hello = \"world\", goodbye = \"world\" }\n\nlocal value = Every(dictionary, function(value, key)\n  return value == \"world\"\nend) -- true\n\nlocal value = Every(dictionary, function(value, key)\n  return value == \"hello\"\nend) -- false\n```",
+            "name": "equals",
+            "desc": "Compares two dictionaries for equality.\n\n```lua\nlocal dictionary = { hello = \"world\", goodbye = \"world\" }\nlocal other1 = { hello = \"world\", goodbye = \"world\" }\nlocal other2 = { hello = \"hello\", world = \"goodbye\" }\n\nlocal value = Equals(dictionary, other1) -- true\nlocal value = Equals(dictionary, other1, other2) -- false\n```",
+            "params": [
+                {
+                    "name": "...",
+                    "desc": "The dictionaries to compare.",
+                    "lua_type": "...{ [any]: any }"
+                }
+            ],
+            "returns": [
+                {
+                    "desc": "Whether the dictionaries are equal.",
+                    "lua_type": "boolean"
+                }
+            ],
+            "function_type": "static",
+            "source": {
+                "line": 45,
+                "path": "src/Dictionary/equals.lua"
+            }
+        },
+        {
+            "name": "removeKeys",
+            "desc": "Removes the given keys from the given dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\", cat = \"meow\", dog = \"woof\", unicorn = \"rainbow\" }\n\nlocal withoutCatDog = RemoveKeys(dictionary, \"cat\", \"dog\") -- { hello = \"world\", unicorn = \"rainbow\" }\n```",
+            "params": [
+                {
+                    "name": "dictionary",
+                    "desc": "The dictionary to remove the keys from.",
+                    "lua_type": "{[K]: V}"
+                },
+                {
+                    "name": "keys",
+                    "desc": "The keys to remove.",
+                    "lua_type": "...K"
+                }
+            ],
+            "returns": [
+                {
+                    "desc": "The dictionary without the given keys.",
+                    "lua_type": "{[K]: V}"
+                }
+            ],
+            "function_type": "static",
+            "source": {
+                "line": 20,
+                "path": "src/Dictionary/removeKeys.lua"
+            }
+        },
+        {
+            "name": "has",
+            "desc": "Checks whether or not the given dictionary has the given key.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = \"world\" }\n\nlocal hasHello = Has(dictionary, \"hello\") -- true\nlocal hasCat = Has(dictionary, \"cat\") -- false\n```",
             "params": [
                 {
                     "name": "dictionary",
@@ -1124,21 +1097,21 @@
                     "lua_type": "{[K]: V}"
                 },
                 {
-                    "name": "predicate",
-                    "desc": "The predicate to use to check the dictionary.",
-                    "lua_type": "(value: V, key: K, dictionary: {[K]: V}) -> any"
+                    "name": "key",
+                    "desc": "The key to check for.",
+                    "lua_type": "any"
                 }
             ],
             "returns": [
                 {
-                    "desc": "Whether every item in the dictionary passes the predicate.",
+                    "desc": "Whether or not the dictionary has the given key.",
                     "lua_type": "boolean"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 24,
-                "path": "src/Dictionary/every.lua"
+                "line": 21,
+                "path": "src/Dictionary/has.lua"
             }
         },
         {
@@ -1164,25 +1137,52 @@
             }
         },
         {
-            "name": "equalsDeep",
-            "desc": "Compares two dictionaries for equality using deep comparison.\n\n```lua\nlocal dictionary = { hello = \"world\", goodbye = { world = \"hello\" } }\nlocal other1 = { hello = \"world\", goodbye = { world = \"hello\" } }\nlocal other2 = { hello = \"hello\", world = \"goodbye\" }\n\nlocal value = EqualsDeep(dictionary, other1) -- true\nlocal value = EqualsDeep(dictionary, other1, other2) -- false\n```",
+            "name": "some",
+            "desc": "Checks whether or not the predicate returned true for any value in the dictionary.\n\n```lua\nlocal dictionary = { hello = \"world\", cat = \"meow\", unicorn = \"rainbow\" }\n\nlocal hasMeow = Some(dictionary, function(value)\n  return value == \"meow\"\nend) -- true\n\nlocal hasDog = Some(dictionary, function(_, key)\n  return key == \"dog\"\nend) -- false\n```",
             "params": [
                 {
-                    "name": "...",
-                    "desc": "The dictionaries to compare.",
-                    "lua_type": "...{ [any]: any }"
+                    "name": "dictionary",
+                    "desc": "The dictionary to check.",
+                    "lua_type": "{[K]: V}"
+                },
+                {
+                    "name": "predicate",
+                    "desc": "The predicate to check against.",
+                    "lua_type": "(value: V, key: K, dictionary: { [K]: V }) -> any"
                 }
             ],
             "returns": [
                 {
-                    "desc": "Whether the dictionaries are equal.",
+                    "desc": "Whether or not the predicate returned true for any value.",
                     "lua_type": "boolean"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 45,
-                "path": "src/Dictionary/equalsDeep.lua"
+                "line": 24,
+                "path": "src/Dictionary/some.lua"
+            }
+        },
+        {
+            "name": "freezeDeep",
+            "desc": "Freezes the entire dictionary, making it read-only, including all nested dictionaries.\n\n```lua\nlocal dictionary = { hello = \"roblox\", goodbye = { world = \"world\" } }\n\nlocal new = FreezeDeep(dictionary)\n\nnew.hello = \"world\" -- error!\nnew.goodbye.world = \"hello\" -- error!\n```",
+            "params": [
+                {
+                    "name": "dictionary",
+                    "desc": "The dictionary to freeze.",
+                    "lua_type": "T"
+                }
+            ],
+            "returns": [
+                {
+                    "desc": "The frozen dictionary.",
+                    "lua_type": "T"
+                }
+            ],
+            "function_type": "static",
+            "source": {
+                "line": 22,
+                "path": "src/Dictionary/freezeDeep.lua"
             }
         }
     ],
@@ -1194,8 +1194,8 @@
         "line": 16,
         "path": "src/Dictionary/init.lua"
     }
-}
- - +}
+ + \ No newline at end of file diff --git a/api/Set/index.html b/api/Set/index.html index 13bf3bd..dd731ec 100644 --- a/api/Set/index.html +++ b/api/Set/index.html @@ -3,7 +3,7 @@ -Set | SiftSet | Sift - - +```"> + +
-

Set

+

Set

Sets are a collection of values. They are used to store unique values. They are essentially a dictionary, but each value is stored as a boolean. @@ -35,57 +35,31 @@ local newSet = Add(set, "world") -- { hello = true, world = true } -

Functions

count

Set.count(
set{[T]boolean},-- -

The set to count.

-
predicate?(
itemT,
set{[T]boolean}
) → boolean?-- -

The predicate to use to count.

-
) → number-- -

The number of items in the set.

-
-

Counts the number of items in a set.

-
local set = { hello = true, world = true }
-
-local count = Count(set) -- 2
-local count = Count(set, function(item)
-  return item == "hello"
-end) -- 1
-
-

isSuperset

Set.isSuperset(
superset{[any]boolean},-- -

The superset to check.

-
subset{[any]boolean}-- -

The subset to check against.

-
) → boolean-- -

Whether the superset is a superset of the subset.

-
-

Checks whether a set is a superset of another set.

-
local set = { hello = true, world = true }
-local subset = { hello = true }
-
-local isSuperset = IsSuperset(set, subset) -- true
-
-

has

Set.has(
set{[T]boolean},-- -

The set to check.

-
valueany-- -

The value to check for.

-
) → boolean-- -

Whether the value is in the set.

+

Functions

copy

Set.copy(
set{[T]boolean}-- +

The set to copy.

+
) → {[T]boolean}-- +

A copy of the set.

-

Checks whether a value is in a set.

+

Creates a copy of a set.

local set = { hello = true }
 
-local has = Has(set, "hello") -- true
+local newSet = Copy(set) -- { hello = true }
 
-

toArray

Set.toArray(
set{[T]boolean}-- -

The set to convert to an array.

-
) → {T}-- -

The array.

+

fromArray

Set.fromArray(
array{T}-- +

The array to convert to a set.

+
) → {[T]boolean}-- +

The set.

-

Converts a set to an array.

-
local set = { hello = true, world = true }
+

+ Converts an array to a set, where each item is mapped to true. + Duplicate items are discarded. +

+

Aliases: fromList

+
local array = { "hello", "world", "hello" }
 
-local array = ToArray(set) -- { "hello", "world" }
+local set = FromArray(array) -- { hello = true, world = true }
 
-

map

Set.map(
set{[T]boolean},-- +

map

Set.map(
set{[T]boolean},--

The set to map.

mapper(
T,
{[T]boolean}
) → U--

The mapper function.

@@ -99,19 +73,7 @@ return value .. "!" end) -- { ["hello!"] = true, ["world!"] = true }
-

merge

Set.merge(
......any-- -

The sets to merge.

-
) → {[T]boolean}-- -

The merged set.

-
-

Combines one or more sets into a single set.

-

Aliases: join, union

-
local set1 = { hello = true, world = true }
-local set2 = { cat = true, dog = true, hello = true }
-
-local merge = Merge(set1, set2) -- { hello = true, world = true, cat = true, dog = true }
-
-

intersection

Set.intersection(
......{[any]boolean}-- +

intersection

Set.intersection(
......{[any]boolean}--

The sets to intersect.

) → {[T]boolean}--

The intersection of the sets.

@@ -126,19 +88,45 @@ local intersection = Intersection(set1, set2) -- { world = true } -

add

Set.add(
set{[T]boolean},-- -

The set to add the value to.

-
......T-- -

The values to add.

+

difference

Set.difference(
setSet<V>,-- +

The set to compare.

+
......Set<V>-- +

The sets to compare against.

+
) → Set<V>-- +

The difference between the sets.

+
+

Returns a set of values that are in the first set, but not in the other sets.

+
local set1 = { hello = true, world = true }
+local set2 = { cat = true, dog = true, hello = true }
+
+local difference = Difference(set1, set2) -- { world = true }
+
+

isSuperset

Set.isSuperset(
superset{[any]boolean},-- +

The superset to check.

+
subset{[any]boolean}-- +

The subset to check against.

+
) → boolean-- +

Whether the superset is a superset of the subset.

+
+

Checks whether a set is a superset of another set.

+
local set = { hello = true, world = true }
+local subset = { hello = true }
+
+local isSuperset = IsSuperset(set, subset) -- true
+
+

merge

Set.merge(
......any-- +

The sets to merge.

) → {[T]boolean}-- -

The set with the values added.

+

The merged set.

-

Adds values to a set.

-
local set = { hello = true }
+

Combines one or more sets into a single set.

+

Aliases: join, union

+
local set1 = { hello = true, world = true }
+local set2 = { cat = true, dog = true, hello = true }
 
-local newSet = Add(set, "world") -- { hello = true, world = true }
+local merge = Merge(set1, set2) -- { hello = true, world = true, cat = true, dog = true }
 
-

filter

Set.filter(
set{[T]boolean},-- +

filter

Set.filter(
set{[T]boolean},--

The set to filter.

predicate?(
itemT,
set{[T]boolean}
) → any--

The function to filter the set with.

@@ -152,21 +140,7 @@ return value ~= "hello" end) -- { world = true }
-

fromArray

Set.fromArray(
array{T}-- -

The array to convert to a set.

-
) → {[T]boolean}-- -

The set.

-
-

- Converts an array to a set, where each item is mapped to true. - Duplicate items are discarded. -

-

Aliases: fromList

-
local array = { "hello", "world", "hello" }
-
-local set = FromArray(array) -- { hello = true, world = true }
-
-

isSubset

Set.isSubset(
subset{[any]boolean},-- +

isSubset

Set.isSubset(
subset{[any]boolean},--

The subset to check.

superset{[any]boolean}--

The superset to check against.

@@ -179,7 +153,32 @@ local isSubset = IsSubset(subset, set) -- true -

delete

Set.delete(
set{[T]boolean},-- +

count

Set.count(
set{[T]boolean},-- +

The set to count.

+
predicate?(
itemT,
set{[T]boolean}
) → boolean?-- +

The predicate to use to count.

+
) → number-- +

The number of items in the set.

+
+

Counts the number of items in a set.

+
local set = { hello = true, world = true }
+
+local count = Count(set) -- 2
+local count = Count(set, function(item)
+  return item == "hello"
+end) -- 1
+
+

toArray

Set.toArray(
set{[T]boolean}-- +

The set to convert to an array.

+
) → {T}-- +

The array.

+
+

Converts a set to an array.

+
local set = { hello = true, world = true }
+
+local array = ToArray(set) -- { "hello", "world" }
+
+

delete

Set.delete(
set{[T]boolean},--

The set to delete from.

......T--

The values to delete.

@@ -192,30 +191,31 @@ local newSet = Delete(set, "hello") -- { world = true }
-

copy

Set.copy(
set{[T]boolean}-- -

The set to copy.

-
) → {[T]boolean}-- -

A copy of the set.

+

has

Set.has(
set{[T]boolean},-- +

The set to check.

+
valueany-- +

The value to check for.

+
) → boolean-- +

Whether the value is in the set.

-

Creates a copy of a set.

+

Checks whether a value is in a set.

local set = { hello = true }
 
-local newSet = Copy(set) -- { hello = true }
+local has = Has(set, "hello") -- true
 
-

difference

Set.difference(
setSet<V>,-- -

The set to compare.

-
......Set<V>-- -

The sets to compare against.

-
) → Set<V>-- -

The difference between the sets.

+

add

Set.add(
set{[T]boolean},-- +

The set to add the value to.

+
......T-- +

The values to add.

+
) → {[T]boolean}-- +

The set with the values added.

-

Returns a set of values that are in the first set, but not in the other sets.

-
local set1 = { hello = true, world = true }
-local set2 = { cat = true, dog = true, hello = true }
+

Adds values to a set.

+
local set = { hello = true }
 
-local difference = Difference(set1, set2) -- { world = true }
+local newSet = Add(set, "world") -- { hello = true, world = true }
 
-

differenceSymmetric

Set.differenceSymmetric(
setSet<V>,-- +

differenceSymmetric

Set.differenceSymmetric(
setSet<V>,--

The set to compare.

......Set<V>--

The sets to compare against.

@@ -231,280 +231,275 @@
Show raw api
{
     "functions": [
         {
-            "name": "count",
-            "desc": "Counts the number of items in a set.\n\n```lua\nlocal set = { hello = true, world = true }\n\nlocal count = Count(set) -- 2\nlocal count = Count(set, function(item)\n  return item == \"hello\"\nend) -- 1\n```",
+            "name": "copy",
+            "desc": "Creates a copy of a set.\n\n```lua\nlocal set = { hello = true }\n\nlocal newSet = Copy(set) -- { hello = true }\n```",
             "params": [
                 {
                     "name": "set",
-                    "desc": "The set to count.",
+                    "desc": "The set to copy.",
                     "lua_type": "{ [T]: boolean }"
-                },
-                {
-                    "name": "predicate?",
-                    "desc": "The predicate to use to count.",
-                    "lua_type": "(item: T, set: { [T]: boolean }) -> boolean?"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The number of items in the set.",
-                    "lua_type": "number"
+                    "desc": "A copy of the set.",
+                    "lua_type": "{ [T]: boolean }"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 25,
-                "path": "src/Set/count.lua"
+                "line": 21,
+                "path": "src/Set/copy.lua"
             }
         },
         {
-            "name": "isSuperset",
-            "desc": "Checks whether a set is a superset of another set.\n\n```lua\nlocal set = { hello = true, world = true }\nlocal subset = { hello = true }\n\nlocal isSuperset = IsSuperset(set, subset) -- true\n```",
+            "name": "fromArray",
+            "desc": "Converts an array to a set, where each item is mapped to true.\nDuplicate items are discarded.\n\nAliases: `fromList`\n\n```lua\nlocal array = { \"hello\", \"world\", \"hello\" }\n\nlocal set = FromArray(array) -- { hello = true, world = true }\n```",
             "params": [
                 {
-                    "name": "superset",
-                    "desc": "The superset to check.",
-                    "lua_type": "{ [any]: boolean }"
-                },
-                {
-                    "name": "subset",
-                    "desc": "The subset to check against.",
-                    "lua_type": "{ [any]: boolean }"
+                    "name": "array",
+                    "desc": "The array to convert to a set.",
+                    "lua_type": "{T}"
                 }
             ],
             "returns": [
                 {
-                    "desc": "Whether the superset is a superset of the subset.",
-                    "lua_type": "boolean"
+                    "desc": "The set.",
+                    "lua_type": "{[T]: boolean}"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 21,
-                "path": "src/Set/isSuperset.lua"
+                "line": 20,
+                "path": "src/Set/fromArray.lua"
             }
         },
         {
-            "name": "has",
-            "desc": "Checks whether a value is in a set.\n\n```lua\nlocal set = { hello = true }\n\nlocal has = Has(set, \"hello\") -- true\n```",
+            "name": "map",
+            "desc": "Iterates over a set, calling a mapper function for each item.\n\n```lua\nlocal set = { hello = true, world = true }\n\nlocal mappedSet = Map(set, function(value)\n  return value .. \"!\"\nend) -- { [\"hello!\"] = true, [\"world!\"] = true }\n```",
             "params": [
                 {
                     "name": "set",
-                    "desc": "The set to check.",
+                    "desc": "The set to map.",
                     "lua_type": "{ [T]: boolean }"
                 },
                 {
-                    "name": "value",
-                    "desc": "The value to check for.",
-                    "lua_type": "any"
+                    "name": "mapper",
+                    "desc": "The mapper function.",
+                    "lua_type": "(T, {[T]: boolean}) -> U"
                 }
             ],
             "returns": [
                 {
-                    "desc": "Whether the value is in the set.",
-                    "lua_type": "boolean"
+                    "desc": "The mapped set.",
+                    "lua_type": "{[U]: boolean}"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 18,
-                "path": "src/Set/has.lua"
+                "line": 20,
+                "path": "src/Set/map.lua"
             }
         },
         {
-            "name": "toArray",
-            "desc": "Converts a set to an array.\n\n```lua\nlocal set = { hello = true, world = true }\n\nlocal array = ToArray(set) -- { \"hello\", \"world\" }\n```",
+            "name": "intersection",
+            "desc": "Creates the intersection of multiple sets. The intersection\nis when both sets have a value in common. Unmatched values\nare discarded.\n\n```lua\nlocal set1 = { hello = true, world = true }\nlocal set2 = { world = true, universe = true }\n\nlocal intersection = Intersection(set1, set2) -- { world = true }\n```",
             "params": [
                 {
-                    "name": "set",
-                    "desc": "The set to convert to an array.",
-                    "lua_type": "{ [T]: boolean }"
+                    "name": "...",
+                    "desc": "The sets to intersect.",
+                    "lua_type": "...{ [any]: boolean }"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The array.",
-                    "lua_type": "{T}"
+                    "desc": "The intersection of the sets.",
+                    "lua_type": "{ [T]: boolean }"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 17,
-                "path": "src/Set/toArray.lua"
+                "line": 20,
+                "path": "src/Set/intersection.lua"
             }
         },
         {
-            "name": "map",
-            "desc": "Iterates over a set, calling a mapper function for each item.\n\n```lua\nlocal set = { hello = true, world = true }\n\nlocal mappedSet = Map(set, function(value)\n  return value .. \"!\"\nend) -- { [\"hello!\"] = true, [\"world!\"] = true }\n```",
+            "name": "difference",
+            "desc": "Returns a set of values that are in the first set, but not in the other sets.\n\n```lua\nlocal set1 = { hello = true, world = true }\nlocal set2 = { cat = true, dog = true, hello = true }\n\nlocal difference = Difference(set1, set2) -- { world = true }\n```",
             "params": [
                 {
                     "name": "set",
-                    "desc": "The set to map.",
-                    "lua_type": "{ [T]: boolean }"
+                    "desc": "The set to compare.",
+                    "lua_type": "Set<V>"
                 },
                 {
-                    "name": "mapper",
-                    "desc": "The mapper function.",
-                    "lua_type": "(T, {[T]: boolean}) -> U"
+                    "name": "...",
+                    "desc": "The sets to compare against.",
+                    "lua_type": "...Set<V>"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The mapped set.",
-                    "lua_type": "{[U]: boolean}"
+                    "desc": "The difference between the sets.",
+                    "lua_type": "Set<V>"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 20,
-                "path": "src/Set/map.lua"
+                "line": 21,
+                "path": "src/Set/difference.lua"
             }
         },
         {
-            "name": "merge",
-            "desc": "Combines one or more sets into a single set.\n\nAliases: `join`, `union`\n\n```lua\nlocal set1 = { hello = true, world = true }\nlocal set2 = { cat = true, dog = true, hello = true }\n\nlocal merge = Merge(set1, set2) -- { hello = true, world = true, cat = true, dog = true }\n```",
+            "name": "isSuperset",
+            "desc": "Checks whether a set is a superset of another set.\n\n```lua\nlocal set = { hello = true, world = true }\nlocal subset = { hello = true }\n\nlocal isSuperset = IsSuperset(set, subset) -- true\n```",
             "params": [
                 {
-                    "name": "...",
-                    "desc": "The sets to merge.",
-                    "lua_type": "...any"
+                    "name": "superset",
+                    "desc": "The superset to check.",
+                    "lua_type": "{ [any]: boolean }"
+                },
+                {
+                    "name": "subset",
+                    "desc": "The subset to check against.",
+                    "lua_type": "{ [any]: boolean }"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The merged set.",
-                    "lua_type": "{ [T]: boolean }"
+                    "desc": "Whether the superset is a superset of the subset.",
+                    "lua_type": "boolean"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 20,
-                "path": "src/Set/merge.lua"
+                "line": 21,
+                "path": "src/Set/isSuperset.lua"
             }
         },
         {
-            "name": "intersection",
-            "desc": "Creates the intersection of multiple sets. The intersection\nis when both sets have a value in common. Unmatched values\nare discarded.\n\n```lua\nlocal set1 = { hello = true, world = true }\nlocal set2 = { world = true, universe = true }\n\nlocal intersection = Intersection(set1, set2) -- { world = true }\n```",
+            "name": "merge",
+            "desc": "Combines one or more sets into a single set.\n\nAliases: `join`, `union`\n\n```lua\nlocal set1 = { hello = true, world = true }\nlocal set2 = { cat = true, dog = true, hello = true }\n\nlocal merge = Merge(set1, set2) -- { hello = true, world = true, cat = true, dog = true }\n```",
             "params": [
                 {
                     "name": "...",
-                    "desc": "The sets to intersect.",
-                    "lua_type": "...{ [any]: boolean }"
+                    "desc": "The sets to merge.",
+                    "lua_type": "...any"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The intersection of the sets.",
+                    "desc": "The merged set.",
                     "lua_type": "{ [T]: boolean }"
                 }
             ],
             "function_type": "static",
             "source": {
                 "line": 20,
-                "path": "src/Set/intersection.lua"
+                "path": "src/Set/merge.lua"
             }
         },
         {
-            "name": "add",
-            "desc": "Adds values to a set.\n\n```lua\nlocal set = { hello = true }\n\nlocal newSet = Add(set, \"world\") -- { hello = true, world = true }\n```",
+            "name": "filter",
+            "desc": "Filters a set using a predicate. Any items that do not pass the predicate will be removed from the set.\n\n```lua\nlocal set = { hello = true, world = true }\n\nlocal newSet = Filter(set, function(value)\n  return value ~= \"hello\"\nend) -- { world = true }\n```",
             "params": [
                 {
                     "name": "set",
-                    "desc": "The set to add the value to.",
+                    "desc": "The set to filter.",
                     "lua_type": "{ [T]: boolean }"
                 },
                 {
-                    "name": "...",
-                    "desc": "The values to add.",
-                    "lua_type": "...T"
+                    "name": "predicate?",
+                    "desc": "The function to filter the set with.",
+                    "lua_type": "(item: T, set: { [T]: boolean }) -> any"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The set with the values added.",
+                    "desc": "The filtered set.",
                     "lua_type": "{ [T]: boolean }"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 18,
-                "path": "src/Set/add.lua"
+                "line": 24,
+                "path": "src/Set/filter.lua"
             }
         },
         {
-            "name": "filter",
-            "desc": "Filters a set using a predicate. Any items that do not pass the predicate will be removed from the set.\n\n```lua\nlocal set = { hello = true, world = true }\n\nlocal newSet = Filter(set, function(value)\n  return value ~= \"hello\"\nend) -- { world = true }\n```",
+            "name": "isSubset",
+            "desc": "Checks whether a set is a subset of another set.\n\n```lua\nlocal set = { hello = true, world = true }\nlocal subset = { hello = true }\n\nlocal isSubset = IsSubset(subset, set) -- true\n```",
             "params": [
                 {
-                    "name": "set",
-                    "desc": "The set to filter.",
-                    "lua_type": "{ [T]: boolean }"
+                    "name": "subset",
+                    "desc": "The subset to check.",
+                    "lua_type": "{ [any]: boolean }"
                 },
                 {
-                    "name": "predicate?",
-                    "desc": "The function to filter the set with.",
-                    "lua_type": "(item: T, set: { [T]: boolean }) -> any"
+                    "name": "superset",
+                    "desc": "The superset to check against.",
+                    "lua_type": "{ [any]: boolean }"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The filtered set.",
-                    "lua_type": "{ [T]: boolean }"
+                    "desc": "Whether the subset is a subset of the superset.",
+                    "lua_type": "boolean"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 24,
-                "path": "src/Set/filter.lua"
+                "line": 19,
+                "path": "src/Set/isSubset.lua"
             }
         },
         {
-            "name": "fromArray",
-            "desc": "Converts an array to a set, where each item is mapped to true.\nDuplicate items are discarded.\n\nAliases: `fromList`\n\n```lua\nlocal array = { \"hello\", \"world\", \"hello\" }\n\nlocal set = FromArray(array) -- { hello = true, world = true }\n```",
+            "name": "count",
+            "desc": "Counts the number of items in a set.\n\n```lua\nlocal set = { hello = true, world = true }\n\nlocal count = Count(set) -- 2\nlocal count = Count(set, function(item)\n  return item == \"hello\"\nend) -- 1\n```",
             "params": [
                 {
-                    "name": "array",
-                    "desc": "The array to convert to a set.",
-                    "lua_type": "{T}"
+                    "name": "set",
+                    "desc": "The set to count.",
+                    "lua_type": "{ [T]: boolean }"
+                },
+                {
+                    "name": "predicate?",
+                    "desc": "The predicate to use to count.",
+                    "lua_type": "(item: T, set: { [T]: boolean }) -> boolean?"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The set.",
-                    "lua_type": "{[T]: boolean}"
+                    "desc": "The number of items in the set.",
+                    "lua_type": "number"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 20,
-                "path": "src/Set/fromArray.lua"
+                "line": 25,
+                "path": "src/Set/count.lua"
             }
         },
         {
-            "name": "isSubset",
-            "desc": "Checks whether a set is a subset of another set.\n\n```lua\nlocal set = { hello = true, world = true }\nlocal subset = { hello = true }\n\nlocal isSubset = IsSubset(subset, set) -- true\n```",
+            "name": "toArray",
+            "desc": "Converts a set to an array.\n\n```lua\nlocal set = { hello = true, world = true }\n\nlocal array = ToArray(set) -- { \"hello\", \"world\" }\n```",
             "params": [
                 {
-                    "name": "subset",
-                    "desc": "The subset to check.",
-                    "lua_type": "{ [any]: boolean }"
-                },
-                {
-                    "name": "superset",
-                    "desc": "The superset to check against.",
-                    "lua_type": "{ [any]: boolean }"
+                    "name": "set",
+                    "desc": "The set to convert to an array.",
+                    "lua_type": "{ [T]: boolean }"
                 }
             ],
             "returns": [
                 {
-                    "desc": "Whether the subset is a subset of the superset.",
-                    "lua_type": "boolean"
+                    "desc": "The array.",
+                    "lua_type": "{T}"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 19,
-                "path": "src/Set/isSubset.lua"
+                "line": 17,
+                "path": "src/Set/toArray.lua"
             }
         },
         {
@@ -535,52 +530,57 @@
             }
         },
         {
-            "name": "copy",
-            "desc": "Creates a copy of a set.\n\n```lua\nlocal set = { hello = true }\n\nlocal newSet = Copy(set) -- { hello = true }\n```",
+            "name": "has",
+            "desc": "Checks whether a value is in a set.\n\n```lua\nlocal set = { hello = true }\n\nlocal has = Has(set, \"hello\") -- true\n```",
             "params": [
                 {
                     "name": "set",
-                    "desc": "The set to copy.",
+                    "desc": "The set to check.",
                     "lua_type": "{ [T]: boolean }"
+                },
+                {
+                    "name": "value",
+                    "desc": "The value to check for.",
+                    "lua_type": "any"
                 }
             ],
             "returns": [
                 {
-                    "desc": "A copy of the set.",
-                    "lua_type": "{ [T]: boolean }"
+                    "desc": "Whether the value is in the set.",
+                    "lua_type": "boolean"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 21,
-                "path": "src/Set/copy.lua"
+                "line": 18,
+                "path": "src/Set/has.lua"
             }
         },
         {
-            "name": "difference",
-            "desc": "Returns a set of values that are in the first set, but not in the other sets.\n\n```lua\nlocal set1 = { hello = true, world = true }\nlocal set2 = { cat = true, dog = true, hello = true }\n\nlocal difference = Difference(set1, set2) -- { world = true }\n```",
+            "name": "add",
+            "desc": "Adds values to a set.\n\n```lua\nlocal set = { hello = true }\n\nlocal newSet = Add(set, \"world\") -- { hello = true, world = true }\n```",
             "params": [
                 {
                     "name": "set",
-                    "desc": "The set to compare.",
-                    "lua_type": "Set<V>"
+                    "desc": "The set to add the value to.",
+                    "lua_type": "{ [T]: boolean }"
                 },
                 {
                     "name": "...",
-                    "desc": "The sets to compare against.",
-                    "lua_type": "...Set<V>"
+                    "desc": "The values to add.",
+                    "lua_type": "...T"
                 }
             ],
             "returns": [
                 {
-                    "desc": "The difference between the sets.",
-                    "lua_type": "Set<V>"
+                    "desc": "The set with the values added.",
+                    "lua_type": "{ [T]: boolean }"
                 }
             ],
             "function_type": "static",
             "source": {
-                "line": 21,
-                "path": "src/Set/difference.lua"
+                "line": 18,
+                "path": "src/Set/add.lua"
             }
         },
         {
@@ -619,8 +619,8 @@
         "line": 15,
         "path": "src/Set/init.lua"
     }
-}
- - +}
+ + \ No newline at end of file diff --git a/api/Sift/index.html b/api/Sift/index.html index 4a88e70..d0f7e5a 100644 --- a/api/Sift/index.html +++ b/api/Sift/index.html @@ -3,7 +3,7 @@ -Sift | SiftSift | Sift - - +The Luau types `Dictionary<K, V>`, `Array<T>` (aliased as `List<T>`) and `Set<T>` are exported from the Sift module (e.g. they can be used via `Sift.Array<string>`), but are also available from [Sift.Types]."> + +
-

Sift

+

Sift

Sift is a library for manipulating arrays. It provides a number of functions for manipulating arrays (lists), dictionaries, and sets. @@ -52,13 +52,13 @@

See the individual submodule pages for full documentation.

The Luau types Dictionary<K, V>, Array<T> (aliased as List<T>) and Set<T> are exported from the Sift module (e.g. they can be used via Sift.Array<string>), but are also available from Sift.Types.

-

Types

None

type None = None

Properties

Array

Sift.Array: Array

List

Alias
Sift.List: Array

Dictionary

Sift.Dictionary: Dictionary

Set

Sift.Set: Set

Types

Sift.Types: Types

None

Sift.None: None
+

Types

None

type None = None

Properties

Array

Sift.Array: Array

List

Alias
Sift.List: Array

Dictionary

Sift.Dictionary: Dictionary

Set

Sift.Set: Set

Types

Sift.Types: Types

None

Sift.None: None

Luau can't distinguish between a nil value and a non-existent value. This constant is used to represent a non-existent value. It can be used in methods like Array.Concat or Dictionary.Merge to remove the value from the result.

-

Functions

isEmpty

since v0.0.1
</>
Sift.isEmpty(
tabletable-- +

Functions

isEmpty

since v0.0.1
</>
Sift.isEmpty(
tabletable--

The table to check.

) → boolean--

Whether or not the table is empty.

@@ -70,7 +70,7 @@ local value = isEmpty(a) -- true local value = isEmpty(b) -- false -

equalObjects

Sift.equalObjects(
......table-- +

equalObjects

Sift.equalObjects(
......table--

The tables to compare.

) → boolean--

Whether or not the tables are equal.

@@ -205,8 +205,8 @@ "line": 22, "path": "src/init.lua" } -}
- - +}
+ + \ No newline at end of file diff --git a/api/index.html b/api/index.html index 7ac6c3d..8dc7a8a 100644 --- a/api/index.html +++ b/api/index.html @@ -3,14 +3,14 @@ -Sift - - +Sift + +
- - + + \ No newline at end of file diff --git a/assets/js/0e384e19.fec97118.js b/assets/js/0e384e19.253faac4.js similarity index 60% rename from assets/js/0e384e19.fec97118.js rename to assets/js/0e384e19.253faac4.js index 1ad44c0..eb5b7a4 100644 --- a/assets/js/0e384e19.fec97118.js +++ b/assets/js/0e384e19.253faac4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[671],{3905:(t,e,r)=>{r.d(e,{Zo:()=>c,kt:()=>m});var n=r(67294);function a(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function i(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function o(t){for(var e=1;e=0||(a[r]=t[r]);return a}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(a[r]=t[r])}return a}var u=n.createContext({}),s=function(t){var e=n.useContext(u),r=e;return t&&(r="function"==typeof t?t(e):o(o({},e),t)),r},c=function(t){var e=s(t.components);return n.createElement(u.Provider,{value:e},t.children)},p="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},f=n.forwardRef((function(t,e){var r=t.components,a=t.mdxType,i=t.originalType,u=t.parentName,c=l(t,["components","mdxType","originalType","parentName"]),p=s(r),f=a,m=p["".concat(u,".").concat(f)]||p[f]||d[f]||i;return r?n.createElement(m,o(o({ref:e},c),{},{components:r})):n.createElement(m,o({ref:e},c))}));function m(t,e){var r=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var i=r.length,o=new Array(i);o[0]=f;var l={};for(var u in e)hasOwnProperty.call(e,u)&&(l[u]=e[u]);l.originalType=t,l[p]="string"==typeof t?t:a,o[1]=l;for(var s=2;s{r.r(e),r.d(e,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const i={sidebar_position:1},o="Sift",l={unversionedId:"intro",id:"intro",title:"Sift",description:"Sift is a utility library for working with immutable data structures in Luau and roblox-ts.",source:"@site/docs/intro.md",sourceDirName:".",slug:"/intro",permalink:"/sift/docs/intro",draft:!1,editUrl:"https://github.com/csqrl/sift/edit/main/docs/intro.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"defaultSidebar",next:{title:"Installation",permalink:"/sift/docs/Installation"}},u={},s=[{value:"Get Started",id:"get-started",level:2},{value:"Why Immutable?",id:"why-immutable",level:2}],c={toc:s},p="wrapper";function d(t){let{components:e,...r}=t;return(0,a.kt)(p,(0,n.Z)({},c,r,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"sift"},"Sift"),(0,a.kt)("p",null,"Sift is a utility library for working with immutable data structures in Luau and roblox-ts."),(0,a.kt)("h2",{id:"get-started"},"Get Started"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/docs/Installation"},"Installation guide")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/api"},(0,a.kt)("strong",{parentName:"a"},"API Documentation"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/docs/Examples"},"Examples"))),(0,a.kt)("h2",{id:"why-immutable"},"Why Immutable?"),(0,a.kt)("p",null,"With immutable data structures, you're in control of your data. You can't accidentally change the data, and you can always predict what will happen to your data and the state of your data. This helps you to prevent bugs and unexpected behavior."),(0,a.kt)("p",null,"Because immutable data structures cannot be changed, this allows for tracking of changes to your data. This is useful for debugging and testing."),(0,a.kt)("p",null,"While Sift doesn't enforce immutability, it provides a way to work with data as if it were immutable."))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[671],{3905:(t,e,r)=>{r.d(e,{Zo:()=>c,kt:()=>m});var n=r(67294);function a(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function i(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function o(t){for(var e=1;e=0||(a[r]=t[r]);return a}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(a[r]=t[r])}return a}var u=n.createContext({}),s=function(t){var e=n.useContext(u),r=e;return t&&(r="function"==typeof t?t(e):o(o({},e),t)),r},c=function(t){var e=s(t.components);return n.createElement(u.Provider,{value:e},t.children)},p="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},f=n.forwardRef((function(t,e){var r=t.components,a=t.mdxType,i=t.originalType,u=t.parentName,c=l(t,["components","mdxType","originalType","parentName"]),p=s(r),f=a,m=p["".concat(u,".").concat(f)]||p[f]||d[f]||i;return r?n.createElement(m,o(o({ref:e},c),{},{components:r})):n.createElement(m,o({ref:e},c))}));function m(t,e){var r=arguments,a=e&&e.mdxType;if("string"==typeof t||a){var i=r.length,o=new Array(i);o[0]=f;var l={};for(var u in e)hasOwnProperty.call(e,u)&&(l[u]=e[u]);l.originalType=t,l[p]="string"==typeof t?t:a,o[1]=l;for(var s=2;s{r.r(e),r.d(e,{assets:()=>u,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=r(87462),a=(r(67294),r(3905));const i={sidebar_position:1},o="Sift",l={unversionedId:"intro",id:"intro",title:"Sift",description:"Sift is a utility library for working with immutable data structures in Luau and roblox-ts.",source:"@site/docs/intro.md",sourceDirName:".",slug:"/intro",permalink:"/sift/docs/intro",draft:!1,editUrl:"https://github.com/cxmeel/sift/edit/main/docs/intro.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1},sidebar:"defaultSidebar",next:{title:"Installation",permalink:"/sift/docs/Installation"}},u={},s=[{value:"Get Started",id:"get-started",level:2},{value:"Why Immutable?",id:"why-immutable",level:2}],c={toc:s},p="wrapper";function d(t){let{components:e,...r}=t;return(0,a.kt)(p,(0,n.Z)({},c,r,{components:e,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"sift"},"Sift"),(0,a.kt)("p",null,"Sift is a utility library for working with immutable data structures in Luau and roblox-ts."),(0,a.kt)("h2",{id:"get-started"},"Get Started"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/docs/Installation"},"Installation guide")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/api"},(0,a.kt)("strong",{parentName:"a"},"API Documentation"))),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"/docs/Examples"},"Examples"))),(0,a.kt)("h2",{id:"why-immutable"},"Why Immutable?"),(0,a.kt)("p",null,"With immutable data structures, you're in control of your data. You can't accidentally change the data, and you can always predict what will happen to your data and the state of your data. This helps you to prevent bugs and unexpected behavior."),(0,a.kt)("p",null,"Because immutable data structures cannot be changed, this allows for tracking of changes to your data. This is useful for debugging and testing."),(0,a.kt)("p",null,"While Sift doesn't enforce immutability, it provides a way to work with data as if it were immutable."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1eea45a3.1ff3ccdf.js b/assets/js/1eea45a3.1ff3ccdf.js new file mode 100644 index 0000000..a97f717 --- /dev/null +++ b/assets/js/1eea45a3.1ff3ccdf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[513],{95250:e=>{e.exports=JSON.parse('{"functions":[{"name":"copy","desc":"Copies a dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\" }\\n\\nlocal new = Copy(dictionary) -- { hello = \\"world\\" }\\n\\nprint(new == dictionary) -- false\\nprint(new.hello == dictionary.hello) -- true\\n```","params":[{"name":"dictionary","desc":"The dictionary to copy.","lua_type":"T"}],"returns":[{"desc":"The copied dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":20,"path":"src/Dictionary/copy.lua"}},{"name":"update","desc":"Updates a value in a dictionary at the given key. If the value at the given key does not exist, `callback` will be called, and its return value will be used as the value at the given key.\\n\\n```lua\\nlocal dictionary = { cats = 2 }\\n\\nlocal new = Update(dictionary, \\"cats\\", function(value)\\n return value + 1\\nend) -- { cats = 3 }\\n\\nlocal new = Update(dictionary, \\"dogs\\", function(value)\\n return value + 1\\nend, function(value)\\n return 1\\nend) -- { cats = 3, dogs = 1 }\\n```","params":[{"name":"dictionary","desc":"The dictionary to update.","lua_type":"{[K]: V?}"},{"name":"key","desc":"The key to update.","lua_type":"K"},{"name":"updater?","desc":"The updater function.","lua_type":"(value: V, key: K) -> U"},{"name":"callback?","desc":"The callback function.","lua_type":"(key: K) -> C"}],"returns":[{"desc":"The updated dictionary.","lua_type":"{[K]: V | U | C}"}],"function_type":"static","source":{"line":30,"path":"src/Dictionary/update.lua"}},{"name":"map","desc":"Maps the dictionary using the mapper function. The mapper function can\\nreturn a value and a key. If the mapper function does not return a key,\\nthe original key will be used.\\n\\n```lua\\nlocal dictionary = { hello = 10, goodbye = 20 }\\n\\nlocal new = Map(dictionary, function(value, key)\\n return value * 2, key .. \\"!\\"\\nend) -- { [\\"hello!\\"] = 20, [\\"goodbye!\\"] = 40 }\\n\\nlocal new = Map(dictionary, function(value, key)\\n return value * 10\\nend) -- { hello = 100, goodbye = 200 }\\n```","params":[{"name":"dictionary","desc":"The dictionary to map.","lua_type":"{[K]: V}"},{"name":"mapper","desc":"The mapper function.","lua_type":"(value: V, key: K, dictionary: {[K]: V}) -> (Y?, X?)"}],"returns":[{"desc":"The mapped dictionary.","lua_type":"{[X]: Y}"}],"function_type":"static","source":{"line":26,"path":"src/Dictionary/map.lua"}},{"name":"flatten","desc":"Flattens a dictionary. If depth is not specified, it will flatten the dictionary as far as it can go.\\n\\n```lua\\nlocal dictionary = {\\n hello = \\"world\\",\\n goodbye = {\\n world = \\"hello\\",\\n roblox = {\\n yes = \\"no\\",\\n no = \\"yes\\",\\n }\\n }\\n}\\n\\nlocal new = Flatten(dictionary) -- { hello = \\"world\\", world = \\"hello\\", yes = \\"no\\", no = \\"yes\\" }\\nlocal new = Flatten(dictionary, 1) -- { hello = \\"world\\", world = \\"hello\\", roblox = { yes = \\"no\\", no = \\"yes\\" } }\\n```","params":[{"name":"dictionary","desc":"The dictionary to flatten.","lua_type":"T"},{"name":"depth?","desc":"The depth to flatten the dictionary to.","lua_type":"number"}],"returns":[{"desc":"The flattened dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":30,"path":"src/Dictionary/flatten.lua"}},{"name":"includes","desc":"Checks whether or not the given dictionary includes the given value.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal includesRoblox = Includes(dictionary, \\"roblox\\") -- true\\nlocal includesCat = Includes(dictionary, \\"cat\\") -- false\\n```","params":[{"name":"dictionary","desc":"The dictionary to check.","lua_type":"{[K]: V}"},{"name":"value","desc":"The value to check for.","lua_type":"V"}],"returns":[{"desc":"Whether or not the dictionary includes the given value.","lua_type":"boolean"}],"function_type":"static","source":{"line":19,"path":"src/Dictionary/includes.lua"}},{"name":"removeValues","desc":"Removes the given values from the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", cat = \\"meow\\", unicorn = \\"rainbow\\", goodbye = \\"world\\" }\\n\\nlocal withoutWorld = RemoveValues(dictionary, \\"world\\") -- { cat = \\"meow\\", unicorn = \\"rainbow\\" }\\nlocal onlyWorld = RemoveValues(dictionary, \\"meow\\", \\"rainbow\\") -- { hello = \\"world\\", goodbye = \\"world\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to remove the values from.","lua_type":"{[K]: V}"},{"name":"values","desc":"The values to remove.","lua_type":"...V"}],"returns":[{"desc":"The dictionary without the given values.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":23,"path":"src/Dictionary/removeValues.lua"}},{"name":"mergeDeep","desc":"Merges the given dictionaries into a single dictionary. If the\\nvalue is `None`, it will be removed from the result. This is\\nrecursive. The parameters may be any number of dictionaries or\\n`nil`. Non-dictonaries will be ignored.\\n\\nAliases: `joinDeep`\\n\\n```lua\\nlocal dictionary1 = { hello = \\"roblox\\", goodbye = { world = \\"goodbye\\" } }\\nlocal dictionary2 = { goodbye = { world = \\"world\\" } }\\n\\nlocal merged = MergeDeep(dictionary1, dictionary2) -- { hello = \\"roblox\\", goodbye = { world = \\"world\\" } }\\n```","params":[{"name":"dictionaries?","desc":"The dictionaries to merge.","lua_type":"...any"}],"returns":[{"desc":"The merged dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":28,"path":"src/Dictionary/mergeDeep.lua"}},{"name":"removeValue","desc":"Removes the given value from the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal withoutHello = RemoveValue(dictionary, \\"roblox\\") -- { goodbye = \\"world\\" }\\nlocal withoutGoodbye = RemoveValue(dictionary, \\"world\\") -- { hello = \\"roblox\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to remove the value from.","lua_type":"{[K]: V}"},{"name":"value","desc":"The value to remove.","lua_type":"V"}],"returns":[{"desc":"The dictionary without the given value.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":19,"path":"src/Dictionary/removeValue.lua"}},{"name":"merge","desc":"Merges the given dictionaries into a single dictionary. If the\\nvalue is `None`, it will be removed from the result. The\\nparameters may be any number of dictionaries or `nil`.\\nNon-dictonaries will be ignored.\\n\\nAliases: `join`\\n\\n```lua\\nlocal dictionary1 = { hello = \\"roblox\\", goodbye = \\"world\\" }\\nlocal dictionary2 = { goodbye = \\"goodbye\\" }\\n\\nlocal merged = Merge(dictionary1, dictionary2) -- { hello = \\"roblox\\", goodbye = \\"goodbye\\" }\\n```","params":[{"name":"dictionaries?","desc":"The dictionaries to merge.","lua_type":"...any"}],"returns":[{"desc":"The merged dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":27,"path":"src/Dictionary/merge.lua"}},{"name":"filter","desc":"Filters a dictionary using a predicate. Any items that do not pass the predicate will be removed from the dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", goodbye = \\"goodbye\\" }\\n\\nlocal result = Filter(dictionary, function(value, key)\\n return value == \\"world\\"\\nend) -- { hello = \\"world\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to filter.","lua_type":"{[K]: V}"},{"name":"predicate?","desc":"The predicate to use to filter the dictionary.","lua_type":"(value: V, key: K, dictionary: {[K]: V}) -> any"}],"returns":[{"desc":"The filtered dictionary.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":24,"path":"src/Dictionary/filter.lua"}},{"name":"every","desc":"Checks whether every item in the dictionary passes the predicate.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", goodbye = \\"world\\" }\\n\\nlocal value = Every(dictionary, function(value, key)\\n return value == \\"world\\"\\nend) -- true\\n\\nlocal value = Every(dictionary, function(value, key)\\n return value == \\"hello\\"\\nend) -- false\\n```","params":[{"name":"dictionary","desc":"The dictionary to check.","lua_type":"{[K]: V}"},{"name":"predicate","desc":"The predicate to use to check the dictionary.","lua_type":"(value: V, key: K, dictionary: {[K]: V}) -> any"}],"returns":[{"desc":"Whether every item in the dictionary passes the predicate.","lua_type":"boolean"}],"function_type":"static","source":{"line":24,"path":"src/Dictionary/every.lua"}},{"name":"values","desc":"Gets the values in the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal values = Values(dictionary) -- { \\"roblox\\", \\"world\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to get the values from.","lua_type":"{[K]: V}"}],"returns":[{"desc":"The values in the dictionary.","lua_type":"{V}"}],"function_type":"static","source":{"line":17,"path":"src/Dictionary/values.lua"}},{"name":"copyDeep","desc":"Copies a dictionary recursively.\\n\\n```lua\\nlocal dictionary = { hello = { world = \\"goodbye\\" } }\\n\\nlocal new = CopyDeep(dictionary) -- { hello = { world = \\"goodbye\\" } }\\n\\nprint(new == dictionary) -- false\\nprint(new.hello == dictionary.hello) -- false\\n```","params":[{"name":"dictionary","desc":"The dictionary to copy.","lua_type":"T"}],"returns":[{"desc":"The copied dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":20,"path":"src/Dictionary/copyDeep.lua"}},{"name":"fromEntries","desc":"Creates a dictionary from the given key-value pairs.\\n\\n```lua\\nlocal entries = { { \\"hello\\", \\"roblox\\" }, { \\"goodbye\\", \\"world\\" } }\\n\\nlocal dictionary = FromEntries(entries) -- { hello = \\"roblox\\", goodbye = \\"world\\" }\\n```","params":[{"name":"entries","desc":"An array of key-value pairs.","lua_type":"{{ K, V }}"}],"returns":[{"desc":"A dictionary composed of the given key-value pairs.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":17,"path":"src/Dictionary/fromEntries.lua"}},{"name":"removeKey","desc":"Removes the given key from the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal withoutHello = RemoveKey(dictionary, \\"hello\\") -- { goodbye = \\"world\\" }\\nlocal withoutGoodbye = RemoveKey(dictionary, \\"goodbye\\") -- { hello = \\"roblox\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to remove the key from.","lua_type":"{[K]: V}"},{"name":"key","desc":"The key to remove.","lua_type":"K"}],"returns":[{"desc":"The dictionary without the given key.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":21,"path":"src/Dictionary/removeKey.lua"}},{"name":"equalsDeep","desc":"Compares two dictionaries for equality using deep comparison.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", goodbye = { world = \\"hello\\" } }\\nlocal other1 = { hello = \\"world\\", goodbye = { world = \\"hello\\" } }\\nlocal other2 = { hello = \\"hello\\", world = \\"goodbye\\" }\\n\\nlocal value = EqualsDeep(dictionary, other1) -- true\\nlocal value = EqualsDeep(dictionary, other1, other2) -- false\\n```","params":[{"name":"...","desc":"The dictionaries to compare.","lua_type":"...{ [any]: any }"}],"returns":[{"desc":"Whether the dictionaries are equal.","lua_type":"boolean"}],"function_type":"static","source":{"line":45,"path":"src/Dictionary/equalsDeep.lua"}},{"name":"freeze","desc":"Freezes the given dictionary at the top level, making it read-only.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = { world = \\"world\\" } }\\n\\nlocal new = Freeze(dictionary)\\n\\nnew.hello = \\"world\\" -- error!\\nnew.goodbye.world = \\"hello\\" -- still works!\\n```","params":[{"name":"dictionary","desc":"The dictionary to freeze.","lua_type":"T"}],"returns":[{"desc":"The frozen dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":23,"path":"src/Dictionary/freeze.lua"}},{"name":"fromArrays","desc":"Creates a dictionary from the given arrays, where the first array is used\\nas keys and the second array is used as values.\\n\\n```lua\\nlocal keys = { \\"hello\\", \\"goodbye\\" }\\nlocal values = { \\"roblox\\", \\"world\\" }\\n\\nlocal dictionary = FromArrays(keys, values) -- { hello = \\"roblox\\", goodbye = \\"world\\" }\\n```","params":[{"name":"keys","desc":"An array containing values to be used as keys.","lua_type":"{K}"},{"name":"values","desc":"An array containing values to be used as values.","lua_type":"{V}"}],"returns":[{"desc":"A dictionary composed of the given keys and values.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":20,"path":"src/Dictionary/fromArrays.lua"}},{"name":"set","desc":"Sets the given value in the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", cat = \\"meow\\", unicorn = \\"rainbow\\" }\\n\\nlocal setCat = Set(dictionary, \\"cat\\", \\"woof\\") -- { hello = \\"world\\", cat = \\"woof\\", unicorn = \\"rainbow\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to set the value in.","lua_type":"{[K]: V}"},{"name":"key","desc":"The key to set the value in.","lua_type":"K"},{"name":"value","desc":"The value to set.","lua_type":"V"}],"returns":[{"desc":"The dictionary with the given value set.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":21,"path":"src/Dictionary/set.lua"}},{"name":"count","desc":"Counts the number of items in a dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", goodbye = \\"world\\" }\\n\\nlocal value = Count(dictionary) -- 2\\nlocal value = Count(dictionary, function(item, key)\\n return item == \\"world\\"\\nend) -- 1\\n```","params":[{"name":"dictionary","desc":"The dictionary to count.","lua_type":"T"},{"name":"predicate?","desc":"The predicate to use to filter the dictionary.","lua_type":"(value: T, key: K, dictionary: T) -> any"}],"returns":[{"desc":"The number of items in the dictionary.","lua_type":"number"}],"function_type":"static","source":{"line":25,"path":"src/Dictionary/count.lua"}},{"name":"keys","desc":"Gets the keys of the given dictionary as an array.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal keys = Keys(dictionary) -- { \\"hello\\", \\"goodbye\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to get the keys of.","lua_type":"{[K]: V}"}],"returns":[{"desc":"An array containing the keys of the given dictionary.","lua_type":"{K}"}],"function_type":"static","source":{"line":17,"path":"src/Dictionary/keys.lua"}},{"name":"flip","desc":"Flips a dictionary. Keys become values and values become keys.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal new = Flip(dictionary) -- { world = \\"goodbye\\", roblox = \\"hello\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to flip.","lua_type":"{ [K]: V }"}],"returns":[{"desc":"The flipped dictionary.","lua_type":"{ [V]: K }"}],"function_type":"static","source":{"line":17,"path":"src/Dictionary/flip.lua"}},{"name":"withKeys","desc":"Returns a dictionary with the given keys.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", cat = \\"meow\\", dog = \\"woof\\", unicorn = \\"rainbow\\" }\\n\\nlocal withoutCatDog = WithKeys(dictionary, \\"cat\\", \\"dog\\") -- { cat = \\"meow\\", dog = \\"woof\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to select the keys from.","lua_type":"{[K]: V}"},{"name":"keys","desc":"The keys to keep.","lua_type":"...K"}],"returns":[{"desc":"The dictionary with only the given keys.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":19,"path":"src/Dictionary/withKeys.lua"}},{"name":"equals","desc":"Compares two dictionaries for equality.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", goodbye = \\"world\\" }\\nlocal other1 = { hello = \\"world\\", goodbye = \\"world\\" }\\nlocal other2 = { hello = \\"hello\\", world = \\"goodbye\\" }\\n\\nlocal value = Equals(dictionary, other1) -- true\\nlocal value = Equals(dictionary, other1, other2) -- false\\n```","params":[{"name":"...","desc":"The dictionaries to compare.","lua_type":"...{ [any]: any }"}],"returns":[{"desc":"Whether the dictionaries are equal.","lua_type":"boolean"}],"function_type":"static","source":{"line":45,"path":"src/Dictionary/equals.lua"}},{"name":"removeKeys","desc":"Removes the given keys from the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", cat = \\"meow\\", dog = \\"woof\\", unicorn = \\"rainbow\\" }\\n\\nlocal withoutCatDog = RemoveKeys(dictionary, \\"cat\\", \\"dog\\") -- { hello = \\"world\\", unicorn = \\"rainbow\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to remove the keys from.","lua_type":"{[K]: V}"},{"name":"keys","desc":"The keys to remove.","lua_type":"...K"}],"returns":[{"desc":"The dictionary without the given keys.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":20,"path":"src/Dictionary/removeKeys.lua"}},{"name":"has","desc":"Checks whether or not the given dictionary has the given key.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal hasHello = Has(dictionary, \\"hello\\") -- true\\nlocal hasCat = Has(dictionary, \\"cat\\") -- false\\n```","params":[{"name":"dictionary","desc":"The dictionary to check.","lua_type":"{[K]: V}"},{"name":"key","desc":"The key to check for.","lua_type":"any"}],"returns":[{"desc":"Whether or not the dictionary has the given key.","lua_type":"boolean"}],"function_type":"static","source":{"line":21,"path":"src/Dictionary/has.lua"}},{"name":"entries","desc":"Returns the entries in the given dictionary as an array of key-value pairs.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal entries = Entries(dictionary) -- { { \\"hello\\", \\"roblox\\" }, { \\"goodbye\\", \\"world\\" } }\\n```","params":[{"name":"dictionary","desc":"The dictionary to get the entries from.","lua_type":"{[K]: V}"}],"returns":[{"desc":"The entries in the dictionary.","lua_type":"{{ K, V }}"}],"function_type":"static","source":{"line":17,"path":"src/Dictionary/entries.lua"}},{"name":"some","desc":"Checks whether or not the predicate returned true for any value in the dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", cat = \\"meow\\", unicorn = \\"rainbow\\" }\\n\\nlocal hasMeow = Some(dictionary, function(value)\\n return value == \\"meow\\"\\nend) -- true\\n\\nlocal hasDog = Some(dictionary, function(_, key)\\n return key == \\"dog\\"\\nend) -- false\\n```","params":[{"name":"dictionary","desc":"The dictionary to check.","lua_type":"{[K]: V}"},{"name":"predicate","desc":"The predicate to check against.","lua_type":"(value: V, key: K, dictionary: { [K]: V }) -> any"}],"returns":[{"desc":"Whether or not the predicate returned true for any value.","lua_type":"boolean"}],"function_type":"static","source":{"line":24,"path":"src/Dictionary/some.lua"}},{"name":"freezeDeep","desc":"Freezes the entire dictionary, making it read-only, including all nested dictionaries.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = { world = \\"world\\" } }\\n\\nlocal new = FreezeDeep(dictionary)\\n\\nnew.hello = \\"world\\" -- error!\\nnew.goodbye.world = \\"hello\\" -- error!\\n```","params":[{"name":"dictionary","desc":"The dictionary to freeze.","lua_type":"T"}],"returns":[{"desc":"The frozen dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":22,"path":"src/Dictionary/freezeDeep.lua"}}],"properties":[],"types":[],"name":"Dictionary","desc":"Dictionaries are a type of data structure that can be used to store key-value pairs.\\n\\n```lua\\nlocal dictionary = {\\n\\tcats = 2,\\n\\tdogs = 1\\n}\\n\\nprint(dictionary.cats) -- 2\\n```","source":{"line":16,"path":"src/Dictionary/init.lua"}}')}}]); \ No newline at end of file diff --git a/assets/js/1eea45a3.2ecff882.js b/assets/js/1eea45a3.2ecff882.js deleted file mode 100644 index e36563a..0000000 --- a/assets/js/1eea45a3.2ecff882.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[513],{95250:e=>{e.exports=JSON.parse('{"functions":[{"name":"count","desc":"Counts the number of items in a dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", goodbye = \\"world\\" }\\n\\nlocal value = Count(dictionary) -- 2\\nlocal value = Count(dictionary, function(item, key)\\n return item == \\"world\\"\\nend) -- 1\\n```","params":[{"name":"dictionary","desc":"The dictionary to count.","lua_type":"T"},{"name":"predicate?","desc":"The predicate to use to filter the dictionary.","lua_type":"(value: T, key: K, dictionary: T) -> any"}],"returns":[{"desc":"The number of items in the dictionary.","lua_type":"number"}],"function_type":"static","source":{"line":25,"path":"src/Dictionary/count.lua"}},{"name":"fromEntries","desc":"Creates a dictionary from the given key-value pairs.\\n\\n```lua\\nlocal entries = { { \\"hello\\", \\"roblox\\" }, { \\"goodbye\\", \\"world\\" } }\\n\\nlocal dictionary = FromEntries(entries) -- { hello = \\"roblox\\", goodbye = \\"world\\" }\\n```","params":[{"name":"entries","desc":"An array of key-value pairs.","lua_type":"{{ K, V }}"}],"returns":[{"desc":"A dictionary composed of the given key-value pairs.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":17,"path":"src/Dictionary/fromEntries.lua"}},{"name":"values","desc":"Gets the values in the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal values = Values(dictionary) -- { \\"roblox\\", \\"world\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to get the values from.","lua_type":"{[K]: V}"}],"returns":[{"desc":"The values in the dictionary.","lua_type":"{V}"}],"function_type":"static","source":{"line":17,"path":"src/Dictionary/values.lua"}},{"name":"has","desc":"Checks whether or not the given dictionary has the given key.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal hasHello = Has(dictionary, \\"hello\\") -- true\\nlocal hasCat = Has(dictionary, \\"cat\\") -- false\\n```","params":[{"name":"dictionary","desc":"The dictionary to check.","lua_type":"{[K]: V}"},{"name":"key","desc":"The key to check for.","lua_type":"any"}],"returns":[{"desc":"Whether or not the dictionary has the given key.","lua_type":"boolean"}],"function_type":"static","source":{"line":21,"path":"src/Dictionary/has.lua"}},{"name":"includes","desc":"Checks whether or not the given dictionary includes the given value.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal includesRoblox = Includes(dictionary, \\"roblox\\") -- true\\nlocal includesCat = Includes(dictionary, \\"cat\\") -- false\\n```","params":[{"name":"dictionary","desc":"The dictionary to check.","lua_type":"{[K]: V}"},{"name":"value","desc":"The value to check for.","lua_type":"V"}],"returns":[{"desc":"Whether or not the dictionary includes the given value.","lua_type":"boolean"}],"function_type":"static","source":{"line":19,"path":"src/Dictionary/includes.lua"}},{"name":"removeValue","desc":"Removes the given value from the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal withoutHello = RemoveValue(dictionary, \\"roblox\\") -- { goodbye = \\"world\\" }\\nlocal withoutGoodbye = RemoveValue(dictionary, \\"world\\") -- { hello = \\"roblox\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to remove the value from.","lua_type":"{[K]: V}"},{"name":"value","desc":"The value to remove.","lua_type":"V"}],"returns":[{"desc":"The dictionary without the given value.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":19,"path":"src/Dictionary/removeValue.lua"}},{"name":"copyDeep","desc":"Copies a dictionary recursively.\\n\\n```lua\\nlocal dictionary = { hello = { world = \\"goodbye\\" } }\\n\\nlocal new = CopyDeep(dictionary) -- { hello = { world = \\"goodbye\\" } }\\n\\nprint(new == dictionary) -- false\\nprint(new.hello == dictionary.hello) -- false\\n```","params":[{"name":"dictionary","desc":"The dictionary to copy.","lua_type":"T"}],"returns":[{"desc":"The copied dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":20,"path":"src/Dictionary/copyDeep.lua"}},{"name":"map","desc":"Maps the dictionary using the mapper function. The mapper function can\\nreturn a value and a key. If the mapper function does not return a key,\\nthe original key will be used.\\n\\n```lua\\nlocal dictionary = { hello = 10, goodbye = 20 }\\n\\nlocal new = Map(dictionary, function(value, key)\\n return value * 2, key .. \\"!\\"\\nend) -- { [\\"hello!\\"] = 20, [\\"goodbye!\\"] = 40 }\\n\\nlocal new = Map(dictionary, function(value, key)\\n return value * 10\\nend) -- { hello = 100, goodbye = 200 }\\n```","params":[{"name":"dictionary","desc":"The dictionary to map.","lua_type":"{[K]: V}"},{"name":"mapper","desc":"The mapper function.","lua_type":"(value: V, key: K, dictionary: {[K]: V}) -> (Y?, X?)"}],"returns":[{"desc":"The mapped dictionary.","lua_type":"{[X]: Y}"}],"function_type":"static","source":{"line":26,"path":"src/Dictionary/map.lua"}},{"name":"freeze","desc":"Freezes the given dictionary at the top level, making it read-only.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = { world = \\"world\\" } }\\n\\nlocal new = Freeze(dictionary)\\n\\nnew.hello = \\"world\\" -- error!\\nnew.goodbye.world = \\"hello\\" -- still works!\\n```","params":[{"name":"dictionary","desc":"The dictionary to freeze.","lua_type":"T"}],"returns":[{"desc":"The frozen dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":23,"path":"src/Dictionary/freeze.lua"}},{"name":"merge","desc":"Merges the given dictionaries into a single dictionary. If the\\nvalue is `None`, it will be removed from the result. The\\nparameters may be any number of dictionaries or `nil`.\\nNon-dictonaries will be ignored.\\n\\nAliases: `join`\\n\\n```lua\\nlocal dictionary1 = { hello = \\"roblox\\", goodbye = \\"world\\" }\\nlocal dictionary2 = { goodbye = \\"goodbye\\" }\\n\\nlocal merged = Merge(dictionary1, dictionary2) -- { hello = \\"roblox\\", goodbye = \\"goodbye\\" }\\n```","params":[{"name":"dictionaries?","desc":"The dictionaries to merge.","lua_type":"...any"}],"returns":[{"desc":"The merged dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":27,"path":"src/Dictionary/merge.lua"}},{"name":"keys","desc":"Gets the keys of the given dictionary as an array.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal keys = Keys(dictionary) -- { \\"hello\\", \\"goodbye\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to get the keys of.","lua_type":"{[K]: V}"}],"returns":[{"desc":"An array containing the keys of the given dictionary.","lua_type":"{K}"}],"function_type":"static","source":{"line":17,"path":"src/Dictionary/keys.lua"}},{"name":"removeValues","desc":"Removes the given values from the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", cat = \\"meow\\", unicorn = \\"rainbow\\", goodbye = \\"world\\" }\\n\\nlocal withoutWorld = RemoveValues(dictionary, \\"world\\") -- { cat = \\"meow\\", unicorn = \\"rainbow\\" }\\nlocal onlyWorld = RemoveValues(dictionary, \\"meow\\", \\"rainbow\\") -- { hello = \\"world\\", goodbye = \\"world\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to remove the values from.","lua_type":"{[K]: V}"},{"name":"values","desc":"The values to remove.","lua_type":"...V"}],"returns":[{"desc":"The dictionary without the given values.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":23,"path":"src/Dictionary/removeValues.lua"}},{"name":"removeKey","desc":"Removes the given key from the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal withoutHello = RemoveKey(dictionary, \\"hello\\") -- { goodbye = \\"world\\" }\\nlocal withoutGoodbye = RemoveKey(dictionary, \\"goodbye\\") -- { hello = \\"roblox\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to remove the key from.","lua_type":"{[K]: V}"},{"name":"key","desc":"The key to remove.","lua_type":"K"}],"returns":[{"desc":"The dictionary without the given key.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":21,"path":"src/Dictionary/removeKey.lua"}},{"name":"equals","desc":"Compares two dictionaries for equality.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", goodbye = \\"world\\" }\\nlocal other1 = { hello = \\"world\\", goodbye = \\"world\\" }\\nlocal other2 = { hello = \\"hello\\", world = \\"goodbye\\" }\\n\\nlocal value = Equals(dictionary, other1) -- true\\nlocal value = Equals(dictionary, other1, other2) -- false\\n```","params":[{"name":"...","desc":"The dictionaries to compare.","lua_type":"...{ [any]: any }"}],"returns":[{"desc":"Whether the dictionaries are equal.","lua_type":"boolean"}],"function_type":"static","source":{"line":45,"path":"src/Dictionary/equals.lua"}},{"name":"flatten","desc":"Flattens a dictionary. If depth is not specified, it will flatten the dictionary as far as it can go.\\n\\n```lua\\nlocal dictionary = {\\n hello = \\"world\\",\\n goodbye = {\\n world = \\"hello\\",\\n roblox = {\\n yes = \\"no\\",\\n no = \\"yes\\",\\n }\\n }\\n}\\n\\nlocal new = Flatten(dictionary) -- { hello = \\"world\\", world = \\"hello\\", yes = \\"no\\", no = \\"yes\\" }\\nlocal new = Flatten(dictionary, 1) -- { hello = \\"world\\", world = \\"hello\\", roblox = { yes = \\"no\\", no = \\"yes\\" } }\\n```","params":[{"name":"dictionary","desc":"The dictionary to flatten.","lua_type":"T"},{"name":"depth?","desc":"The depth to flatten the dictionary to.","lua_type":"number"}],"returns":[{"desc":"The flattened dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":30,"path":"src/Dictionary/flatten.lua"}},{"name":"update","desc":"Updates a value in a dictionary at the given key. If the value at the given key does not exist, `callback` will be called, and its return value will be used as the value at the given key.\\n\\n```lua\\nlocal dictionary = { cats = 2 }\\n\\nlocal new = Update(dictionary, \\"cats\\", function(value)\\n return value + 1\\nend) -- { cats = 3 }\\n\\nlocal new = Update(dictionary, \\"dogs\\", function(value)\\n return value + 1\\nend, function(value)\\n return 1\\nend) -- { cats = 3, dogs = 1 }\\n```","params":[{"name":"dictionary","desc":"The dictionary to update.","lua_type":"{[K]: V}"},{"name":"key","desc":"The key to update.","lua_type":"K"},{"name":"updater?","desc":"The updater function.","lua_type":"(value: V, key: K) -> U"},{"name":"callback?","desc":"The callback function.","lua_type":"(key: K) -> C"}],"returns":[{"desc":"The updated dictionary.","lua_type":"{[K]: V & U & C }"}],"function_type":"static","source":{"line":39,"path":"src/Dictionary/update.lua"}},{"name":"flip","desc":"Flips a dictionary. Keys become values and values become keys.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal new = Flip(dictionary) -- { world = \\"goodbye\\", roblox = \\"hello\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to flip.","lua_type":"{ [K]: V }"}],"returns":[{"desc":"The flipped dictionary.","lua_type":"{ [V]: K }"}],"function_type":"static","source":{"line":17,"path":"src/Dictionary/flip.lua"}},{"name":"some","desc":"Checks whether or not the predicate returned true for any value in the dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", cat = \\"meow\\", unicorn = \\"rainbow\\" }\\n\\nlocal hasMeow = Some(dictionary, function(value)\\n return value == \\"meow\\"\\nend) -- true\\n\\nlocal hasDog = Some(dictionary, function(_, key)\\n return key == \\"dog\\"\\nend) -- false\\n```","params":[{"name":"dictionary","desc":"The dictionary to check.","lua_type":"{[K]: V}"},{"name":"predicate","desc":"The predicate to check against.","lua_type":"(value: V, key: K, dictionary: { [K]: V }) -> any"}],"returns":[{"desc":"Whether or not the predicate returned true for any value.","lua_type":"boolean"}],"function_type":"static","source":{"line":24,"path":"src/Dictionary/some.lua"}},{"name":"mergeDeep","desc":"Merges the given dictionaries into a single dictionary. If the\\nvalue is `None`, it will be removed from the result. This is\\nrecursive. The parameters may be any number of dictionaries or\\n`nil`. Non-dictonaries will be ignored.\\n\\nAliases: `joinDeep`\\n\\n```lua\\nlocal dictionary1 = { hello = \\"roblox\\", goodbye = { world = \\"goodbye\\" } }\\nlocal dictionary2 = { goodbye = { world = \\"world\\" } }\\n\\nlocal merged = MergeDeep(dictionary1, dictionary2) -- { hello = \\"roblox\\", goodbye = { world = \\"world\\" } }\\n```","params":[{"name":"dictionaries?","desc":"The dictionaries to merge.","lua_type":"...any"}],"returns":[{"desc":"The merged dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":28,"path":"src/Dictionary/mergeDeep.lua"}},{"name":"filter","desc":"Filters a dictionary using a predicate. Any items that do not pass the predicate will be removed from the dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", goodbye = \\"goodbye\\" }\\n\\nlocal result = Filter(dictionary, function(value, key)\\n return value == \\"world\\"\\nend) -- { hello = \\"world\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to filter.","lua_type":"{[K]: V}"},{"name":"predicate?","desc":"The predicate to use to filter the dictionary.","lua_type":"(value: V, key: K, dictionary: {[K]: V}) -> any"}],"returns":[{"desc":"The filtered dictionary.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":24,"path":"src/Dictionary/filter.lua"}},{"name":"fromArrays","desc":"Creates a dictionary from the given arrays, where the first array is used\\nas keys and the second array is used as values.\\n\\n```lua\\nlocal keys = { \\"hello\\", \\"goodbye\\" }\\nlocal values = { \\"roblox\\", \\"world\\" }\\n\\nlocal dictionary = FromArrays(keys, values) -- { hello = \\"roblox\\", goodbye = \\"world\\" }\\n```","params":[{"name":"keys","desc":"An array containing values to be used as keys.","lua_type":"{K}"},{"name":"values","desc":"An array containing values to be used as values.","lua_type":"{V}"}],"returns":[{"desc":"A dictionary composed of the given keys and values.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":20,"path":"src/Dictionary/fromArrays.lua"}},{"name":"freezeDeep","desc":"Freezes the entire dictionary, making it read-only, including all nested dictionaries.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = { world = \\"world\\" } }\\n\\nlocal new = FreezeDeep(dictionary)\\n\\nnew.hello = \\"world\\" -- error!\\nnew.goodbye.world = \\"hello\\" -- error!\\n```","params":[{"name":"dictionary","desc":"The dictionary to freeze.","lua_type":"T"}],"returns":[{"desc":"The frozen dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":22,"path":"src/Dictionary/freezeDeep.lua"}},{"name":"set","desc":"Sets the given value in the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", cat = \\"meow\\", unicorn = \\"rainbow\\" }\\n\\nlocal setCat = Set(dictionary, \\"cat\\", \\"woof\\") -- { hello = \\"world\\", cat = \\"woof\\", unicorn = \\"rainbow\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to set the value in.","lua_type":"{[K]: V}"},{"name":"key","desc":"The key to set the value in.","lua_type":"K"},{"name":"value","desc":"The value to set.","lua_type":"V"}],"returns":[{"desc":"The dictionary with the given value set.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":21,"path":"src/Dictionary/set.lua"}},{"name":"removeKeys","desc":"Removes the given keys from the given dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", cat = \\"meow\\", dog = \\"woof\\", unicorn = \\"rainbow\\" }\\n\\nlocal withoutCatDog = RemoveKeys(dictionary, \\"cat\\", \\"dog\\") -- { hello = \\"world\\", unicorn = \\"rainbow\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to remove the keys from.","lua_type":"{[K]: V}"},{"name":"keys","desc":"The keys to remove.","lua_type":"...K"}],"returns":[{"desc":"The dictionary without the given keys.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":20,"path":"src/Dictionary/removeKeys.lua"}},{"name":"copy","desc":"Copies a dictionary.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\" }\\n\\nlocal new = Copy(dictionary) -- { hello = \\"world\\" }\\n\\nprint(new == dictionary) -- false\\nprint(new.hello == dictionary.hello) -- true\\n```","params":[{"name":"dictionary","desc":"The dictionary to copy.","lua_type":"T"}],"returns":[{"desc":"The copied dictionary.","lua_type":"T"}],"function_type":"static","source":{"line":20,"path":"src/Dictionary/copy.lua"}},{"name":"withKeys","desc":"Returns a dictionary with the given keys.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", cat = \\"meow\\", dog = \\"woof\\", unicorn = \\"rainbow\\" }\\n\\nlocal withoutCatDog = WithKeys(dictionary, \\"cat\\", \\"dog\\") -- { cat = \\"meow\\", dog = \\"woof\\" }\\n```","params":[{"name":"dictionary","desc":"The dictionary to select the keys from.","lua_type":"{[K]: V}"},{"name":"keys","desc":"The keys to keep.","lua_type":"...K"}],"returns":[{"desc":"The dictionary with only the given keys.","lua_type":"{[K]: V}"}],"function_type":"static","source":{"line":19,"path":"src/Dictionary/withKeys.lua"}},{"name":"every","desc":"Checks whether every item in the dictionary passes the predicate.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", goodbye = \\"world\\" }\\n\\nlocal value = Every(dictionary, function(value, key)\\n return value == \\"world\\"\\nend) -- true\\n\\nlocal value = Every(dictionary, function(value, key)\\n return value == \\"hello\\"\\nend) -- false\\n```","params":[{"name":"dictionary","desc":"The dictionary to check.","lua_type":"{[K]: V}"},{"name":"predicate","desc":"The predicate to use to check the dictionary.","lua_type":"(value: V, key: K, dictionary: {[K]: V}) -> any"}],"returns":[{"desc":"Whether every item in the dictionary passes the predicate.","lua_type":"boolean"}],"function_type":"static","source":{"line":24,"path":"src/Dictionary/every.lua"}},{"name":"entries","desc":"Returns the entries in the given dictionary as an array of key-value pairs.\\n\\n```lua\\nlocal dictionary = { hello = \\"roblox\\", goodbye = \\"world\\" }\\n\\nlocal entries = Entries(dictionary) -- { { \\"hello\\", \\"roblox\\" }, { \\"goodbye\\", \\"world\\" } }\\n```","params":[{"name":"dictionary","desc":"The dictionary to get the entries from.","lua_type":"{[K]: V}"}],"returns":[{"desc":"The entries in the dictionary.","lua_type":"{{ K, V }}"}],"function_type":"static","source":{"line":17,"path":"src/Dictionary/entries.lua"}},{"name":"equalsDeep","desc":"Compares two dictionaries for equality using deep comparison.\\n\\n```lua\\nlocal dictionary = { hello = \\"world\\", goodbye = { world = \\"hello\\" } }\\nlocal other1 = { hello = \\"world\\", goodbye = { world = \\"hello\\" } }\\nlocal other2 = { hello = \\"hello\\", world = \\"goodbye\\" }\\n\\nlocal value = EqualsDeep(dictionary, other1) -- true\\nlocal value = EqualsDeep(dictionary, other1, other2) -- false\\n```","params":[{"name":"...","desc":"The dictionaries to compare.","lua_type":"...{ [any]: any }"}],"returns":[{"desc":"Whether the dictionaries are equal.","lua_type":"boolean"}],"function_type":"static","source":{"line":45,"path":"src/Dictionary/equalsDeep.lua"}}],"properties":[],"types":[],"name":"Dictionary","desc":"Dictionaries are a type of data structure that can be used to store key-value pairs.\\n\\n```lua\\nlocal dictionary = {\\n\\tcats = 2,\\n\\tdogs = 1\\n}\\n\\nprint(dictionary.cats) -- 2\\n```","source":{"line":16,"path":"src/Dictionary/init.lua"}}')}}]); \ No newline at end of file diff --git a/assets/js/1ff659d4.3d5d43c9.js b/assets/js/1ff659d4.3d5d43c9.js new file mode 100644 index 0000000..7f26ef4 --- /dev/null +++ b/assets/js/1ff659d4.3d5d43c9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[553],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),u=p(r),m=a,d=u["".concat(s,".").concat(m)]||u[m]||f[m]||l;return r?n.createElement(d,i(i({ref:t},c),{},{components:r})):n.createElement(d,i({ref:t},c))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,i=new Array(l);i[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[u]="string"==typeof e?e:a,i[1]=o;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>f,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const l={sidebar_position:2},i=void 0,o={unversionedId:"Installation",id:"Installation",title:"Installation",description:"[sift]//github.com/csqrl/sift",source:"@site/docs/Installation.md",sourceDirName:".",slug:"/Installation",permalink:"/sift/docs/Installation",draft:!1,editUrl:"https://github.com/cxmeel/sift/edit/main/docs/Installation.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"defaultSidebar",previous:{title:"Sift",permalink:"/sift/docs/intro"},next:{title:"Examples",permalink:"/sift/docs/Examples"}},s={},p=[{value:"Wally",id:"wally",level:3},{value:"TypeScript",id:"typescript",level:3},{value:"Manual Installation",id:"manual-installation",level:3}],c={toc:p},u="wrapper";function f(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Sift is available from ",(0,a.kt)("a",{parentName:"p",href:"https://wally.run/package/csqrl/sift"},"Wally"),", ",(0,a.kt)("a",{parentName:"p",href:"https://csqrl.itch.io/sift"},"Itch.io"),", the ",(0,a.kt)("a",{parentName:"p",href:"https://www.roblox.com/library/9486684823"},"Roblox Library"),", and ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/csqrl/sift/releases"},"GitHub releases"),"."),(0,a.kt)("p",null,"While Sift is 100% free and open source, if you feel like sponsoring, Sift is also available on ",(0,a.kt)("a",{parentName:"p",href:"https://csqrl.itch.io/sift"},"Itch.io"),"."),(0,a.kt)("h3",{id:"wally"},"Wally"),(0,a.kt)("p",null,"Wally is a CLI package manager (much like NPM, Yarn or Cargo) for Roblox by @UpliftGames. Find out more at ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/upliftgames/wally"},"https://github.com/upliftgames/wally"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'# wally.toml\n\n[dependencies]\nSift = "csqrl/sift@=0.0.1"\n')),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"$ wally install\n")),(0,a.kt)("h3",{id:"typescript"},"TypeScript"),(0,a.kt)("p",null,"v0.0.1 of Sift includes TypeScript definitions. This means Sift is now compatible with roblox-ts. Refer to the Luau docs for API details."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"$ npm install @rbxts/sift\n")),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://npmjs.com/package/@rbxts/sift"},"View on NPM ","\u2192")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'// example.ts\nimport Sift from "@rbxts/sift"\n\nSift.Dictionary.merge({ a: 1, c: 2 }, { b: 3, c: Sift.None }) // { a: 1, b: 3 }\n')),(0,a.kt)("p",null,"Alternatively, you can use tree-shaking to access the modules directly."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'// example.ts\nimport { Dictionary, None } from "@rbxts/sift"\n\nDictionary.merge({ a: 1, c: 2 }, { b: 3, c: None }) // { a: 1, b: 3 }\n')),(0,a.kt)("h3",{id:"manual-installation"},"Manual Installation"),(0,a.kt)("p",null,"Grab a copy ",(0,a.kt)("a",{parentName:"p",href:"https://www.roblox.com/library/9486684823"},"from the Roblox Library")," or ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/csqrl/sift/releases"},"GitHub releases"),", and drop it into Studio. The Sift model file can be synced in using Rojo."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1ff659d4.cfb9a595.js b/assets/js/1ff659d4.cfb9a595.js deleted file mode 100644 index e25db41..0000000 --- a/assets/js/1ff659d4.cfb9a595.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[553],{3905:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});var n=r(67294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),p=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",f={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,s=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),u=p(r),m=a,d=u["".concat(s,".").concat(m)]||u[m]||f[m]||l;return r?n.createElement(d,i(i({ref:t},c),{},{components:r})):n.createElement(d,i({ref:t},c))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,i=new Array(l);i[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[u]="string"==typeof e?e:a,i[1]=o;for(var p=2;p{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>f,frontMatter:()=>l,metadata:()=>o,toc:()=>p});var n=r(87462),a=(r(67294),r(3905));const l={sidebar_position:2},i=void 0,o={unversionedId:"Installation",id:"Installation",title:"Installation",description:"[sift]//github.com/csqrl/sift",source:"@site/docs/Installation.md",sourceDirName:".",slug:"/Installation",permalink:"/sift/docs/Installation",draft:!1,editUrl:"https://github.com/csqrl/sift/edit/main/docs/Installation.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"defaultSidebar",previous:{title:"Sift",permalink:"/sift/docs/intro"},next:{title:"Examples",permalink:"/sift/docs/Examples"}},s={},p=[{value:"Wally",id:"wally",level:3},{value:"TypeScript",id:"typescript",level:3},{value:"Manual Installation",id:"manual-installation",level:3}],c={toc:p},u="wrapper";function f(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("p",null,"Sift is available from ",(0,a.kt)("a",{parentName:"p",href:"https://wally.run/package/csqrl/sift"},"Wally"),", ",(0,a.kt)("a",{parentName:"p",href:"https://csqrl.itch.io/sift"},"Itch.io"),", the ",(0,a.kt)("a",{parentName:"p",href:"https://www.roblox.com/library/9486684823"},"Roblox Library"),", and ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/csqrl/sift/releases"},"GitHub releases"),"."),(0,a.kt)("p",null,"While Sift is 100% free and open source, if you feel like sponsoring, Sift is also available on ",(0,a.kt)("a",{parentName:"p",href:"https://csqrl.itch.io/sift"},"Itch.io"),"."),(0,a.kt)("h3",{id:"wally"},"Wally"),(0,a.kt)("p",null,"Wally is a CLI package manager (much like NPM, Yarn or Cargo) for Roblox by @UpliftGames. Find out more at ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/upliftgames/wally"},"https://github.com/upliftgames/wally"),"."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-toml"},'# wally.toml\n\n[dependencies]\nSift = "csqrl/sift@=0.0.1"\n')),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"$ wally install\n")),(0,a.kt)("h3",{id:"typescript"},"TypeScript"),(0,a.kt)("p",null,"v0.0.1 of Sift includes TypeScript definitions. This means Sift is now compatible with roblox-ts. Refer to the Luau docs for API details."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-shell"},"$ npm install @rbxts/sift\n")),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://npmjs.com/package/@rbxts/sift"},"View on NPM ","\u2192")),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'// example.ts\nimport Sift from "@rbxts/sift"\n\nSift.Dictionary.merge({ a: 1, c: 2 }, { b: 3, c: Sift.None }) // { a: 1, b: 3 }\n')),(0,a.kt)("p",null,"Alternatively, you can use tree-shaking to access the modules directly."),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-ts"},'// example.ts\nimport { Dictionary, None } from "@rbxts/sift"\n\nDictionary.merge({ a: 1, c: 2 }, { b: 3, c: None }) // { a: 1, b: 3 }\n')),(0,a.kt)("h3",{id:"manual-installation"},"Manual Installation"),(0,a.kt)("p",null,"Grab a copy ",(0,a.kt)("a",{parentName:"p",href:"https://www.roblox.com/library/9486684823"},"from the Roblox Library")," or ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/csqrl/sift/releases"},"GitHub releases"),", and drop it into Studio. The Sift model file can be synced in using Rojo."))}f.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/880d272a.4f04823e.js b/assets/js/880d272a.4f04823e.js new file mode 100644 index 0000000..5200ef3 --- /dev/null +++ b/assets/js/880d272a.4f04823e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[715],{14245:e=>{e.exports=JSON.parse('{"functions":[{"name":"copy","desc":"Creates a copy of a set.\\n\\n```lua\\nlocal set = { hello = true }\\n\\nlocal newSet = Copy(set) -- { hello = true }\\n```","params":[{"name":"set","desc":"The set to copy.","lua_type":"{ [T]: boolean }"}],"returns":[{"desc":"A copy of the set.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":21,"path":"src/Set/copy.lua"}},{"name":"fromArray","desc":"Converts an array to a set, where each item is mapped to true.\\nDuplicate items are discarded.\\n\\nAliases: `fromList`\\n\\n```lua\\nlocal array = { \\"hello\\", \\"world\\", \\"hello\\" }\\n\\nlocal set = FromArray(array) -- { hello = true, world = true }\\n```","params":[{"name":"array","desc":"The array to convert to a set.","lua_type":"{T}"}],"returns":[{"desc":"The set.","lua_type":"{[T]: boolean}"}],"function_type":"static","source":{"line":20,"path":"src/Set/fromArray.lua"}},{"name":"map","desc":"Iterates over a set, calling a mapper function for each item.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\n\\nlocal mappedSet = Map(set, function(value)\\n return value .. \\"!\\"\\nend) -- { [\\"hello!\\"] = true, [\\"world!\\"] = true }\\n```","params":[{"name":"set","desc":"The set to map.","lua_type":"{ [T]: boolean }"},{"name":"mapper","desc":"The mapper function.","lua_type":"(T, {[T]: boolean}) -> U"}],"returns":[{"desc":"The mapped set.","lua_type":"{[U]: boolean}"}],"function_type":"static","source":{"line":20,"path":"src/Set/map.lua"}},{"name":"intersection","desc":"Creates the intersection of multiple sets. The intersection\\nis when both sets have a value in common. Unmatched values\\nare discarded.\\n\\n```lua\\nlocal set1 = { hello = true, world = true }\\nlocal set2 = { world = true, universe = true }\\n\\nlocal intersection = Intersection(set1, set2) -- { world = true }\\n```","params":[{"name":"...","desc":"The sets to intersect.","lua_type":"...{ [any]: boolean }"}],"returns":[{"desc":"The intersection of the sets.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":20,"path":"src/Set/intersection.lua"}},{"name":"difference","desc":"Returns a set of values that are in the first set, but not in the other sets.\\n\\n```lua\\nlocal set1 = { hello = true, world = true }\\nlocal set2 = { cat = true, dog = true, hello = true }\\n\\nlocal difference = Difference(set1, set2) -- { world = true }\\n```","params":[{"name":"set","desc":"The set to compare.","lua_type":"Set"},{"name":"...","desc":"The sets to compare against.","lua_type":"...Set"}],"returns":[{"desc":"The difference between the sets.","lua_type":"Set"}],"function_type":"static","source":{"line":21,"path":"src/Set/difference.lua"}},{"name":"isSuperset","desc":"Checks whether a set is a superset of another set.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\nlocal subset = { hello = true }\\n\\nlocal isSuperset = IsSuperset(set, subset) -- true\\n```","params":[{"name":"superset","desc":"The superset to check.","lua_type":"{ [any]: boolean }"},{"name":"subset","desc":"The subset to check against.","lua_type":"{ [any]: boolean }"}],"returns":[{"desc":"Whether the superset is a superset of the subset.","lua_type":"boolean"}],"function_type":"static","source":{"line":21,"path":"src/Set/isSuperset.lua"}},{"name":"merge","desc":"Combines one or more sets into a single set.\\n\\nAliases: `join`, `union`\\n\\n```lua\\nlocal set1 = { hello = true, world = true }\\nlocal set2 = { cat = true, dog = true, hello = true }\\n\\nlocal merge = Merge(set1, set2) -- { hello = true, world = true, cat = true, dog = true }\\n```","params":[{"name":"...","desc":"The sets to merge.","lua_type":"...any"}],"returns":[{"desc":"The merged set.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":20,"path":"src/Set/merge.lua"}},{"name":"filter","desc":"Filters a set using a predicate. Any items that do not pass the predicate will be removed from the set.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\n\\nlocal newSet = Filter(set, function(value)\\n return value ~= \\"hello\\"\\nend) -- { world = true }\\n```","params":[{"name":"set","desc":"The set to filter.","lua_type":"{ [T]: boolean }"},{"name":"predicate?","desc":"The function to filter the set with.","lua_type":"(item: T, set: { [T]: boolean }) -> any"}],"returns":[{"desc":"The filtered set.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":24,"path":"src/Set/filter.lua"}},{"name":"isSubset","desc":"Checks whether a set is a subset of another set.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\nlocal subset = { hello = true }\\n\\nlocal isSubset = IsSubset(subset, set) -- true\\n```","params":[{"name":"subset","desc":"The subset to check.","lua_type":"{ [any]: boolean }"},{"name":"superset","desc":"The superset to check against.","lua_type":"{ [any]: boolean }"}],"returns":[{"desc":"Whether the subset is a subset of the superset.","lua_type":"boolean"}],"function_type":"static","source":{"line":19,"path":"src/Set/isSubset.lua"}},{"name":"count","desc":"Counts the number of items in a set.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\n\\nlocal count = Count(set) -- 2\\nlocal count = Count(set, function(item)\\n return item == \\"hello\\"\\nend) -- 1\\n```","params":[{"name":"set","desc":"The set to count.","lua_type":"{ [T]: boolean }"},{"name":"predicate?","desc":"The predicate to use to count.","lua_type":"(item: T, set: { [T]: boolean }) -> boolean?"}],"returns":[{"desc":"The number of items in the set.","lua_type":"number"}],"function_type":"static","source":{"line":25,"path":"src/Set/count.lua"}},{"name":"toArray","desc":"Converts a set to an array.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\n\\nlocal array = ToArray(set) -- { \\"hello\\", \\"world\\" }\\n```","params":[{"name":"set","desc":"The set to convert to an array.","lua_type":"{ [T]: boolean }"}],"returns":[{"desc":"The array.","lua_type":"{T}"}],"function_type":"static","source":{"line":17,"path":"src/Set/toArray.lua"}},{"name":"delete","desc":"Deletes values from a set.\\n\\nAliases: `subtract`\\n\\n```lua\\nlocal set = { hello = true, world = true }\\n\\nlocal newSet = Delete(set, \\"hello\\") -- { world = true }\\n```","params":[{"name":"set","desc":"The set to delete from.","lua_type":"{ [T]: boolean }"},{"name":"...","desc":"The values to delete.","lua_type":"...T"}],"returns":[{"desc":"The set with the values deleted.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":20,"path":"src/Set/delete.lua"}},{"name":"has","desc":"Checks whether a value is in a set.\\n\\n```lua\\nlocal set = { hello = true }\\n\\nlocal has = Has(set, \\"hello\\") -- true\\n```","params":[{"name":"set","desc":"The set to check.","lua_type":"{ [T]: boolean }"},{"name":"value","desc":"The value to check for.","lua_type":"any"}],"returns":[{"desc":"Whether the value is in the set.","lua_type":"boolean"}],"function_type":"static","source":{"line":18,"path":"src/Set/has.lua"}},{"name":"add","desc":"Adds values to a set.\\n\\n```lua\\nlocal set = { hello = true }\\n\\nlocal newSet = Add(set, \\"world\\") -- { hello = true, world = true }\\n```","params":[{"name":"set","desc":"The set to add the value to.","lua_type":"{ [T]: boolean }"},{"name":"...","desc":"The values to add.","lua_type":"...T"}],"returns":[{"desc":"The set with the values added.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":18,"path":"src/Set/add.lua"}},{"name":"differenceSymmetric","desc":"Returns a set of values that are in the first set, but not in the other sets, and vice versa.\\n\\n```lua\\nlocal set1 = { hello = true, world = true }\\nlocal set2 = { cat = true, dog = true, hello = true }\\n\\nlocal differenceSymmetric = DifferenceSymmetric(set1, set2) -- { world = true, cat = true, dog = true }\\n```","params":[{"name":"set","desc":"The set to compare.","lua_type":"Set"},{"name":"...","desc":"The sets to compare against.","lua_type":"...Set"}],"returns":[{"desc":"The symmetric difference between the sets.","lua_type":"Set"}],"function_type":"static","source":{"line":21,"path":"src/Set/differenceSymmetric.lua"}}],"properties":[],"types":[],"name":"Set","desc":"Sets are a collection of values. They are used to store unique values.\\nThey are essentially a dictionary, but each value is stored as a boolean.\\nThis means that a value can only be in a set once.\\n\\n```lua\\nlocal set = { hello = true }\\n\\nlocal newSet = Add(set, \\"world\\") -- { hello = true, world = true }\\n```","source":{"line":15,"path":"src/Set/init.lua"}}')}}]); \ No newline at end of file diff --git a/assets/js/880d272a.823b32fd.js b/assets/js/880d272a.823b32fd.js deleted file mode 100644 index fe5f58f..0000000 --- a/assets/js/880d272a.823b32fd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[715],{14245:e=>{e.exports=JSON.parse('{"functions":[{"name":"count","desc":"Counts the number of items in a set.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\n\\nlocal count = Count(set) -- 2\\nlocal count = Count(set, function(item)\\n return item == \\"hello\\"\\nend) -- 1\\n```","params":[{"name":"set","desc":"The set to count.","lua_type":"{ [T]: boolean }"},{"name":"predicate?","desc":"The predicate to use to count.","lua_type":"(item: T, set: { [T]: boolean }) -> boolean?"}],"returns":[{"desc":"The number of items in the set.","lua_type":"number"}],"function_type":"static","source":{"line":25,"path":"src/Set/count.lua"}},{"name":"isSuperset","desc":"Checks whether a set is a superset of another set.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\nlocal subset = { hello = true }\\n\\nlocal isSuperset = IsSuperset(set, subset) -- true\\n```","params":[{"name":"superset","desc":"The superset to check.","lua_type":"{ [any]: boolean }"},{"name":"subset","desc":"The subset to check against.","lua_type":"{ [any]: boolean }"}],"returns":[{"desc":"Whether the superset is a superset of the subset.","lua_type":"boolean"}],"function_type":"static","source":{"line":21,"path":"src/Set/isSuperset.lua"}},{"name":"has","desc":"Checks whether a value is in a set.\\n\\n```lua\\nlocal set = { hello = true }\\n\\nlocal has = Has(set, \\"hello\\") -- true\\n```","params":[{"name":"set","desc":"The set to check.","lua_type":"{ [T]: boolean }"},{"name":"value","desc":"The value to check for.","lua_type":"any"}],"returns":[{"desc":"Whether the value is in the set.","lua_type":"boolean"}],"function_type":"static","source":{"line":18,"path":"src/Set/has.lua"}},{"name":"toArray","desc":"Converts a set to an array.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\n\\nlocal array = ToArray(set) -- { \\"hello\\", \\"world\\" }\\n```","params":[{"name":"set","desc":"The set to convert to an array.","lua_type":"{ [T]: boolean }"}],"returns":[{"desc":"The array.","lua_type":"{T}"}],"function_type":"static","source":{"line":17,"path":"src/Set/toArray.lua"}},{"name":"map","desc":"Iterates over a set, calling a mapper function for each item.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\n\\nlocal mappedSet = Map(set, function(value)\\n return value .. \\"!\\"\\nend) -- { [\\"hello!\\"] = true, [\\"world!\\"] = true }\\n```","params":[{"name":"set","desc":"The set to map.","lua_type":"{ [T]: boolean }"},{"name":"mapper","desc":"The mapper function.","lua_type":"(T, {[T]: boolean}) -> U"}],"returns":[{"desc":"The mapped set.","lua_type":"{[U]: boolean}"}],"function_type":"static","source":{"line":20,"path":"src/Set/map.lua"}},{"name":"merge","desc":"Combines one or more sets into a single set.\\n\\nAliases: `join`, `union`\\n\\n```lua\\nlocal set1 = { hello = true, world = true }\\nlocal set2 = { cat = true, dog = true, hello = true }\\n\\nlocal merge = Merge(set1, set2) -- { hello = true, world = true, cat = true, dog = true }\\n```","params":[{"name":"...","desc":"The sets to merge.","lua_type":"...any"}],"returns":[{"desc":"The merged set.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":20,"path":"src/Set/merge.lua"}},{"name":"intersection","desc":"Creates the intersection of multiple sets. The intersection\\nis when both sets have a value in common. Unmatched values\\nare discarded.\\n\\n```lua\\nlocal set1 = { hello = true, world = true }\\nlocal set2 = { world = true, universe = true }\\n\\nlocal intersection = Intersection(set1, set2) -- { world = true }\\n```","params":[{"name":"...","desc":"The sets to intersect.","lua_type":"...{ [any]: boolean }"}],"returns":[{"desc":"The intersection of the sets.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":20,"path":"src/Set/intersection.lua"}},{"name":"add","desc":"Adds values to a set.\\n\\n```lua\\nlocal set = { hello = true }\\n\\nlocal newSet = Add(set, \\"world\\") -- { hello = true, world = true }\\n```","params":[{"name":"set","desc":"The set to add the value to.","lua_type":"{ [T]: boolean }"},{"name":"...","desc":"The values to add.","lua_type":"...T"}],"returns":[{"desc":"The set with the values added.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":18,"path":"src/Set/add.lua"}},{"name":"filter","desc":"Filters a set using a predicate. Any items that do not pass the predicate will be removed from the set.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\n\\nlocal newSet = Filter(set, function(value)\\n return value ~= \\"hello\\"\\nend) -- { world = true }\\n```","params":[{"name":"set","desc":"The set to filter.","lua_type":"{ [T]: boolean }"},{"name":"predicate?","desc":"The function to filter the set with.","lua_type":"(item: T, set: { [T]: boolean }) -> any"}],"returns":[{"desc":"The filtered set.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":24,"path":"src/Set/filter.lua"}},{"name":"fromArray","desc":"Converts an array to a set, where each item is mapped to true.\\nDuplicate items are discarded.\\n\\nAliases: `fromList`\\n\\n```lua\\nlocal array = { \\"hello\\", \\"world\\", \\"hello\\" }\\n\\nlocal set = FromArray(array) -- { hello = true, world = true }\\n```","params":[{"name":"array","desc":"The array to convert to a set.","lua_type":"{T}"}],"returns":[{"desc":"The set.","lua_type":"{[T]: boolean}"}],"function_type":"static","source":{"line":20,"path":"src/Set/fromArray.lua"}},{"name":"isSubset","desc":"Checks whether a set is a subset of another set.\\n\\n```lua\\nlocal set = { hello = true, world = true }\\nlocal subset = { hello = true }\\n\\nlocal isSubset = IsSubset(subset, set) -- true\\n```","params":[{"name":"subset","desc":"The subset to check.","lua_type":"{ [any]: boolean }"},{"name":"superset","desc":"The superset to check against.","lua_type":"{ [any]: boolean }"}],"returns":[{"desc":"Whether the subset is a subset of the superset.","lua_type":"boolean"}],"function_type":"static","source":{"line":19,"path":"src/Set/isSubset.lua"}},{"name":"delete","desc":"Deletes values from a set.\\n\\nAliases: `subtract`\\n\\n```lua\\nlocal set = { hello = true, world = true }\\n\\nlocal newSet = Delete(set, \\"hello\\") -- { world = true }\\n```","params":[{"name":"set","desc":"The set to delete from.","lua_type":"{ [T]: boolean }"},{"name":"...","desc":"The values to delete.","lua_type":"...T"}],"returns":[{"desc":"The set with the values deleted.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":20,"path":"src/Set/delete.lua"}},{"name":"copy","desc":"Creates a copy of a set.\\n\\n```lua\\nlocal set = { hello = true }\\n\\nlocal newSet = Copy(set) -- { hello = true }\\n```","params":[{"name":"set","desc":"The set to copy.","lua_type":"{ [T]: boolean }"}],"returns":[{"desc":"A copy of the set.","lua_type":"{ [T]: boolean }"}],"function_type":"static","source":{"line":21,"path":"src/Set/copy.lua"}},{"name":"difference","desc":"Returns a set of values that are in the first set, but not in the other sets.\\n\\n```lua\\nlocal set1 = { hello = true, world = true }\\nlocal set2 = { cat = true, dog = true, hello = true }\\n\\nlocal difference = Difference(set1, set2) -- { world = true }\\n```","params":[{"name":"set","desc":"The set to compare.","lua_type":"Set"},{"name":"...","desc":"The sets to compare against.","lua_type":"...Set"}],"returns":[{"desc":"The difference between the sets.","lua_type":"Set"}],"function_type":"static","source":{"line":21,"path":"src/Set/difference.lua"}},{"name":"differenceSymmetric","desc":"Returns a set of values that are in the first set, but not in the other sets, and vice versa.\\n\\n```lua\\nlocal set1 = { hello = true, world = true }\\nlocal set2 = { cat = true, dog = true, hello = true }\\n\\nlocal differenceSymmetric = DifferenceSymmetric(set1, set2) -- { world = true, cat = true, dog = true }\\n```","params":[{"name":"set","desc":"The set to compare.","lua_type":"Set"},{"name":"...","desc":"The sets to compare against.","lua_type":"...Set"}],"returns":[{"desc":"The symmetric difference between the sets.","lua_type":"Set"}],"function_type":"static","source":{"line":21,"path":"src/Set/differenceSymmetric.lua"}}],"properties":[],"types":[],"name":"Set","desc":"Sets are a collection of values. They are used to store unique values.\\nThey are essentially a dictionary, but each value is stored as a boolean.\\nThis means that a value can only be in a set once.\\n\\n```lua\\nlocal set = { hello = true }\\n\\nlocal newSet = Add(set, \\"world\\") -- { hello = true, world = true }\\n```","source":{"line":15,"path":"src/Set/init.lua"}}')}}]); \ No newline at end of file diff --git a/assets/js/af5cd4f0.9374a525.js b/assets/js/af5cd4f0.9374a525.js new file mode 100644 index 0000000..ab20546 --- /dev/null +++ b/assets/js/af5cd4f0.9374a525.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[273],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=a.createContext({}),u=function(e){var t=a.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=u(e.components);return a.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},f=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),p=u(r),f=n,m=p["".concat(c,".").concat(f)]||p[f]||d[f]||l;return r?a.createElement(m,o(o({ref:t},s),{},{components:r})):a.createElement(m,o({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=f;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:n,o[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const l={sidebar_position:3},o=void 0,i={unversionedId:"Examples",id:"Examples",title:"Examples",description:"Sift contains a number of useful functions for working with data structures. These functions are available as static methods on the Sift module (refer to the API documentation for more details).",source:"@site/docs/Examples.md",sourceDirName:".",slug:"/Examples",permalink:"/sift/docs/Examples",draft:!1,editUrl:"https://github.com/cxmeel/sift/edit/main/docs/Examples.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"defaultSidebar",previous:{title:"Installation",permalink:"/sift/docs/Installation"}},c={},u=[{value:"Combining Data",id:"combining-data",level:3},{value:"Filtering Data",id:"filtering-data",level:3},{value:"Removing Duplicates",id:"removing-duplicates",level:3}],s={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Sift contains a number of useful functions for working with data structures. These functions are available as static methods on the Sift module (refer to the ",(0,n.kt)("a",{parentName:"p",href:"/api"},"API documentation")," for more details)."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},"local Sift = require(path.to.Sift)\n")),(0,n.kt)("p",null,"Sift also exports Luau types, which can be accessed from the Sift module itself, or via the dedicated Types module, which is exported as ",(0,n.kt)("inlineCode",{parentName:"p"},"Sift.Types"),"."),(0,n.kt)("h3",{id:"combining-data"},"Combining Data"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},"local dictionary1 = { a = 1, b = 2 }\nlocal dictionary2 = { c = 3, d = 4 }\n\nlocal result = Sift.Dictionary.merge(dictionary1, dictionary2) -- { a = 1, b = 2, c = 3, d = 4 }\n")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},"local array1 = { 1, 2, 3 }\nlocal array2 = { 4, 5, 6 }\n\nlocal result = Sift.Array.concat(array1, array2) -- { 1, 2, 3, 4, 5, 6 }\n")),(0,n.kt)("h3",{id:"filtering-data"},"Filtering Data"),(0,n.kt)("p",null,"The following example filters out all uneven numbers from an array of numbers."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},"local array = { 1, 2, 3, 4, 5, 6 }\n\nlocal result = Sift.Array.filter(array, function(value)\n return value % 2 == 0\nend) -- { 2, 4, 6 }\n")),(0,n.kt)("p",null,"Dictionaries can also be filtered in Sift!"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},"local dictionary = { a = 1, b = 2, c = 3, d = 4 }\n\nlocal result = Sift.Dictionary.filter(dictionary, function(value)\n return value % 2 == 0\nend) -- { b = 2, d = 4 }\n")),(0,n.kt)("h3",{id:"removing-duplicates"},"Removing Duplicates"),(0,n.kt)("p",null,"There's a few different methods for removing duplicates from an array or dictionary."),(0,n.kt)("p",null,"The following example removes all duplicate values from an array using sets."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},'local array = { "hello", "world", "world", "cat", "dog" }\n\nlocal set = Sift.Set.fromArray(array) -- { "hello" = true, "world" = true, "cat" = true, "dog" = true }\n\nlocal result = Sift.Set.toArray(set) -- { "hello", "world", "cat", "dog" }\n')),(0,n.kt)("p",null,"The same could also be accomplished using a reducer."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},'local array = { "hello", "world", "world", "cat", "dog" }\n\nlocal result = Sift.Array.reduce(array, function(accumulator, value)\n if not Sift.Array.includes(accumulator, value) then\n return Sift.Array.push(accumulator, value)\n end\n\n return accumulator\nend, {}) -- { "hello", "world", "cat", "dog" }\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/af5cd4f0.d8efffea.js b/assets/js/af5cd4f0.d8efffea.js deleted file mode 100644 index 9dc7cc3..0000000 --- a/assets/js/af5cd4f0.d8efffea.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[273],{3905:(e,t,r)=>{r.d(t,{Zo:()=>s,kt:()=>m});var a=r(67294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var c=a.createContext({}),u=function(e){var t=a.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},s=function(e){var t=u(e.components);return a.createElement(c.Provider,{value:t},e.children)},p="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},f=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),p=u(r),f=n,m=p["".concat(c,".").concat(f)]||p[f]||d[f]||l;return r?a.createElement(m,o(o({ref:t},s),{},{components:r})):a.createElement(m,o({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,o=new Array(l);o[0]=f;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i[p]="string"==typeof e?e:n,o[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>u});var a=r(87462),n=(r(67294),r(3905));const l={sidebar_position:3},o=void 0,i={unversionedId:"Examples",id:"Examples",title:"Examples",description:"Sift contains a number of useful functions for working with data structures. These functions are available as static methods on the Sift module (refer to the API documentation for more details).",source:"@site/docs/Examples.md",sourceDirName:".",slug:"/Examples",permalink:"/sift/docs/Examples",draft:!1,editUrl:"https://github.com/csqrl/sift/edit/main/docs/Examples.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"defaultSidebar",previous:{title:"Installation",permalink:"/sift/docs/Installation"}},c={},u=[{value:"Combining Data",id:"combining-data",level:3},{value:"Filtering Data",id:"filtering-data",level:3},{value:"Removing Duplicates",id:"removing-duplicates",level:3}],s={toc:u},p="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,a.Z)({},s,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Sift contains a number of useful functions for working with data structures. These functions are available as static methods on the Sift module (refer to the ",(0,n.kt)("a",{parentName:"p",href:"/api"},"API documentation")," for more details)."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},"local Sift = require(path.to.Sift)\n")),(0,n.kt)("p",null,"Sift also exports Luau types, which can be accessed from the Sift module itself, or via the dedicated Types module, which is exported as ",(0,n.kt)("inlineCode",{parentName:"p"},"Sift.Types"),"."),(0,n.kt)("h3",{id:"combining-data"},"Combining Data"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},"local dictionary1 = { a = 1, b = 2 }\nlocal dictionary2 = { c = 3, d = 4 }\n\nlocal result = Sift.Dictionary.merge(dictionary1, dictionary2) -- { a = 1, b = 2, c = 3, d = 4 }\n")),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},"local array1 = { 1, 2, 3 }\nlocal array2 = { 4, 5, 6 }\n\nlocal result = Sift.Array.concat(array1, array2) -- { 1, 2, 3, 4, 5, 6 }\n")),(0,n.kt)("h3",{id:"filtering-data"},"Filtering Data"),(0,n.kt)("p",null,"The following example filters out all uneven numbers from an array of numbers."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},"local array = { 1, 2, 3, 4, 5, 6 }\n\nlocal result = Sift.Array.filter(array, function(value)\n return value % 2 == 0\nend) -- { 2, 4, 6 }\n")),(0,n.kt)("p",null,"Dictionaries can also be filtered in Sift!"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},"local dictionary = { a = 1, b = 2, c = 3, d = 4 }\n\nlocal result = Sift.Dictionary.filter(dictionary, function(value)\n return value % 2 == 0\nend) -- { b = 2, d = 4 }\n")),(0,n.kt)("h3",{id:"removing-duplicates"},"Removing Duplicates"),(0,n.kt)("p",null,"There's a few different methods for removing duplicates from an array or dictionary."),(0,n.kt)("p",null,"The following example removes all duplicate values from an array using sets."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},'local array = { "hello", "world", "world", "cat", "dog" }\n\nlocal set = Sift.Set.fromArray(array) -- { "hello" = true, "world" = true, "cat" = true, "dog" = true }\n\nlocal result = Sift.Set.toArray(set) -- { "hello", "world", "cat", "dog" }\n')),(0,n.kt)("p",null,"The same could also be accomplished using a reducer."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-lua"},'local array = { "hello", "world", "world", "cat", "dog" }\n\nlocal result = Sift.Array.reduce(array, function(accumulator, value)\n if not Sift.Array.includes(accumulator, value) then\n return Sift.Array.push(accumulator, value)\n end\n\n return accumulator\nend, {}) -- { "hello", "world", "cat", "dog" }\n')))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b09b2928.0c2cb53c.js b/assets/js/b09b2928.0c2cb53c.js new file mode 100644 index 0000000..8115538 --- /dev/null +++ b/assets/js/b09b2928.0c2cb53c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[677],{85492:e=>{e.exports=JSON.parse('{"Instance":"https://developer.roblox.com/en-us/api-reference/datatype/Instance","AccessoryDescription":"https://developer.roblox.com/en-us/api-reference/class/AccessoryDescription","AccountService":"https://developer.roblox.com/en-us/api-reference/class/AccountService","Accoutrement":"https://developer.roblox.com/en-us/api-reference/class/Accoutrement","Accessory":"https://developer.roblox.com/en-us/api-reference/class/Accessory","Hat":"https://developer.roblox.com/en-us/api-reference/class/Hat","ActivityHistoryService":"https://developer.roblox.com/en-us/api-reference/class/ActivityHistoryService","AdPortal":"https://developer.roblox.com/en-us/api-reference/class/AdPortal","AdService":"https://developer.roblox.com/en-us/api-reference/class/AdService","AdvancedDragger":"https://developer.roblox.com/en-us/api-reference/class/AdvancedDragger","AnalyticsService":"https://developer.roblox.com/en-us/api-reference/class/AnalyticsService","Animation":"https://developer.roblox.com/en-us/api-reference/class/Animation","AnimationClip":"https://developer.roblox.com/en-us/api-reference/class/AnimationClip","CurveAnimation":"https://developer.roblox.com/en-us/api-reference/class/CurveAnimation","KeyframeSequence":"https://developer.roblox.com/en-us/api-reference/class/KeyframeSequence","AnimationClipProvider":"https://developer.roblox.com/en-us/api-reference/class/AnimationClipProvider","AnimationController":"https://developer.roblox.com/en-us/api-reference/class/AnimationController","AnimationFromVideoCreatorService":"https://developer.roblox.com/en-us/api-reference/class/AnimationFromVideoCreatorService","AnimationFromVideoCreatorStudioService":"https://developer.roblox.com/en-us/api-reference/class/AnimationFromVideoCreatorStudioService","AnimationRigData":"https://developer.roblox.com/en-us/api-reference/class/AnimationRigData","AnimationStreamTrack":"https://developer.roblox.com/en-us/api-reference/class/AnimationStreamTrack","AnimationTrack":"https://developer.roblox.com/en-us/api-reference/class/AnimationTrack","Animator":"https://developer.roblox.com/en-us/api-reference/class/Animator","AppUpdateService":"https://developer.roblox.com/en-us/api-reference/class/AppUpdateService","AssetCounterService":"https://developer.roblox.com/en-us/api-reference/class/AssetCounterService","AssetDeliveryProxy":"https://developer.roblox.com/en-us/api-reference/class/AssetDeliveryProxy","AssetImportService":"https://developer.roblox.com/en-us/api-reference/class/AssetImportService","AssetImportSession":"https://developer.roblox.com/en-us/api-reference/class/AssetImportSession","AssetManagerService":"https://developer.roblox.com/en-us/api-reference/class/AssetManagerService","AssetPatchSettings":"https://developer.roblox.com/en-us/api-reference/class/AssetPatchSettings","AssetService":"https://developer.roblox.com/en-us/api-reference/class/AssetService","Atmosphere":"https://developer.roblox.com/en-us/api-reference/class/Atmosphere","Attachment":"https://developer.roblox.com/en-us/api-reference/class/Attachment","Bone":"https://developer.roblox.com/en-us/api-reference/class/Bone","AudioAnalyzer":"https://developer.roblox.com/en-us/api-reference/class/AudioAnalyzer","AudioChorus":"https://developer.roblox.com/en-us/api-reference/class/AudioChorus","AudioCompressor":"https://developer.roblox.com/en-us/api-reference/class/AudioCompressor","AudioDeviceInput":"https://developer.roblox.com/en-us/api-reference/class/AudioDeviceInput","AudioDeviceOutput":"https://developer.roblox.com/en-us/api-reference/class/AudioDeviceOutput","AudioDistortion":"https://developer.roblox.com/en-us/api-reference/class/AudioDistortion","AudioEcho":"https://developer.roblox.com/en-us/api-reference/class/AudioEcho","AudioEmitter":"https://developer.roblox.com/en-us/api-reference/class/AudioEmitter","AudioEqualizer":"https://developer.roblox.com/en-us/api-reference/class/AudioEqualizer","AudioFader":"https://developer.roblox.com/en-us/api-reference/class/AudioFader","AudioFlanger":"https://developer.roblox.com/en-us/api-reference/class/AudioFlanger","AudioListener":"https://developer.roblox.com/en-us/api-reference/class/AudioListener","AudioPitchShifter":"https://developer.roblox.com/en-us/api-reference/class/AudioPitchShifter","AudioPlayer":"https://developer.roblox.com/en-us/api-reference/class/AudioPlayer","AudioReverb":"https://developer.roblox.com/en-us/api-reference/class/AudioReverb","AudioSearchParams":"https://developer.roblox.com/en-us/api-reference/class/AudioSearchParams","AvatarChatService":"https://developer.roblox.com/en-us/api-reference/class/AvatarChatService","AvatarCreationService":"https://developer.roblox.com/en-us/api-reference/class/AvatarCreationService","AvatarEditorService":"https://developer.roblox.com/en-us/api-reference/class/AvatarEditorService","AvatarGenerationJob":"https://developer.roblox.com/en-us/api-reference/class/AvatarGenerationJob","Avatar2DGenerationJob":"https://developer.roblox.com/en-us/api-reference/class/Avatar2DGenerationJob","Avatar3DGenerationJob":"https://developer.roblox.com/en-us/api-reference/class/Avatar3DGenerationJob","AvatarGenerationSession":"https://developer.roblox.com/en-us/api-reference/class/AvatarGenerationSession","AvatarImportService":"https://developer.roblox.com/en-us/api-reference/class/AvatarImportService","Backpack":"https://developer.roblox.com/en-us/api-reference/class/Backpack","BadgeService":"https://developer.roblox.com/en-us/api-reference/class/BadgeService","BaseImportData":"https://developer.roblox.com/en-us/api-reference/class/BaseImportData","AnimationImportData":"https://developer.roblox.com/en-us/api-reference/class/AnimationImportData","FacsImportData":"https://developer.roblox.com/en-us/api-reference/class/FacsImportData","GroupImportData":"https://developer.roblox.com/en-us/api-reference/class/GroupImportData","JointImportData":"https://developer.roblox.com/en-us/api-reference/class/JointImportData","MaterialImportData":"https://developer.roblox.com/en-us/api-reference/class/MaterialImportData","MeshImportData":"https://developer.roblox.com/en-us/api-reference/class/MeshImportData","RootImportData":"https://developer.roblox.com/en-us/api-reference/class/RootImportData","BasePlayerGui":"https://developer.roblox.com/en-us/api-reference/class/BasePlayerGui","CoreGui":"https://developer.roblox.com/en-us/api-reference/class/CoreGui","PlayerGui":"https://developer.roblox.com/en-us/api-reference/class/PlayerGui","StarterGui":"https://developer.roblox.com/en-us/api-reference/class/StarterGui","BaseRemoteEvent":"https://developer.roblox.com/en-us/api-reference/class/BaseRemoteEvent","RemoteEvent":"https://developer.roblox.com/en-us/api-reference/class/RemoteEvent","UnreliableRemoteEvent":"https://developer.roblox.com/en-us/api-reference/class/UnreliableRemoteEvent","BaseWrap":"https://developer.roblox.com/en-us/api-reference/class/BaseWrap","WrapLayer":"https://developer.roblox.com/en-us/api-reference/class/WrapLayer","WrapTarget":"https://developer.roblox.com/en-us/api-reference/class/WrapTarget","Beam":"https://developer.roblox.com/en-us/api-reference/class/Beam","BindableEvent":"https://developer.roblox.com/en-us/api-reference/class/BindableEvent","BindableFunction":"https://developer.roblox.com/en-us/api-reference/class/BindableFunction","BodyMover":"https://developer.roblox.com/en-us/api-reference/class/BodyMover","BodyAngularVelocity":"https://developer.roblox.com/en-us/api-reference/class/BodyAngularVelocity","BodyForce":"https://developer.roblox.com/en-us/api-reference/class/BodyForce","BodyGyro":"https://developer.roblox.com/en-us/api-reference/class/BodyGyro","BodyPosition":"https://developer.roblox.com/en-us/api-reference/class/BodyPosition","BodyThrust":"https://developer.roblox.com/en-us/api-reference/class/BodyThrust","BodyVelocity":"https://developer.roblox.com/en-us/api-reference/class/BodyVelocity","RocketPropulsion":"https://developer.roblox.com/en-us/api-reference/class/RocketPropulsion","BodyPartDescription":"https://developer.roblox.com/en-us/api-reference/class/BodyPartDescription","Breakpoint":"https://developer.roblox.com/en-us/api-reference/class/Breakpoint","BrowserService":"https://developer.roblox.com/en-us/api-reference/class/BrowserService","BubbleChatMessageProperties":"https://developer.roblox.com/en-us/api-reference/class/BubbleChatMessageProperties","BulkImportService":"https://developer.roblox.com/en-us/api-reference/class/BulkImportService","CacheableContentProvider":"https://developer.roblox.com/en-us/api-reference/class/CacheableContentProvider","HSRDataContentProvider":"https://developer.roblox.com/en-us/api-reference/class/HSRDataContentProvider","MeshContentProvider":"https://developer.roblox.com/en-us/api-reference/class/MeshContentProvider","SolidModelContentProvider":"https://developer.roblox.com/en-us/api-reference/class/SolidModelContentProvider","CalloutService":"https://developer.roblox.com/en-us/api-reference/class/CalloutService","Camera":"https://developer.roblox.com/en-us/api-reference/class/Camera","CaptureService":"https://developer.roblox.com/en-us/api-reference/class/CaptureService","ChangeHistoryService":"https://developer.roblox.com/en-us/api-reference/class/ChangeHistoryService","CharacterAppearance":"https://developer.roblox.com/en-us/api-reference/class/CharacterAppearance","BodyColors":"https://developer.roblox.com/en-us/api-reference/class/BodyColors","CharacterMesh":"https://developer.roblox.com/en-us/api-reference/class/CharacterMesh","Clothing":"https://developer.roblox.com/en-us/api-reference/class/Clothing","Pants":"https://developer.roblox.com/en-us/api-reference/class/Pants","Shirt":"https://developer.roblox.com/en-us/api-reference/class/Shirt","ShirtGraphic":"https://developer.roblox.com/en-us/api-reference/class/ShirtGraphic","Skin":"https://developer.roblox.com/en-us/api-reference/class/Skin","Chat":"https://developer.roblox.com/en-us/api-reference/class/Chat","ChatbotUIService":"https://developer.roblox.com/en-us/api-reference/class/ChatbotUIService","ClickDetector":"https://developer.roblox.com/en-us/api-reference/class/ClickDetector","DragDetector":"https://developer.roblox.com/en-us/api-reference/class/DragDetector","Clouds":"https://developer.roblox.com/en-us/api-reference/class/Clouds","ClusterPacketCache":"https://developer.roblox.com/en-us/api-reference/class/ClusterPacketCache","Collaborator":"https://developer.roblox.com/en-us/api-reference/class/Collaborator","CollaboratorsService":"https://developer.roblox.com/en-us/api-reference/class/CollaboratorsService","CollectionService":"https://developer.roblox.com/en-us/api-reference/class/CollectionService","CommandInstance":"https://developer.roblox.com/en-us/api-reference/class/CommandInstance","CommandService":"https://developer.roblox.com/en-us/api-reference/class/CommandService","CommerceService":"https://developer.roblox.com/en-us/api-reference/class/CommerceService","Configuration":"https://developer.roblox.com/en-us/api-reference/class/Configuration","ConfigureServerService":"https://developer.roblox.com/en-us/api-reference/class/ConfigureServerService","ConnectivityService":"https://developer.roblox.com/en-us/api-reference/class/ConnectivityService","Constraint":"https://developer.roblox.com/en-us/api-reference/class/Constraint","AlignOrientation":"https://developer.roblox.com/en-us/api-reference/class/AlignOrientation","AlignPosition":"https://developer.roblox.com/en-us/api-reference/class/AlignPosition","AngularVelocity":"https://developer.roblox.com/en-us/api-reference/class/AngularVelocity","AnimationConstraint":"https://developer.roblox.com/en-us/api-reference/class/AnimationConstraint","BallSocketConstraint":"https://developer.roblox.com/en-us/api-reference/class/BallSocketConstraint","HingeConstraint":"https://developer.roblox.com/en-us/api-reference/class/HingeConstraint","LineForce":"https://developer.roblox.com/en-us/api-reference/class/LineForce","LinearVelocity":"https://developer.roblox.com/en-us/api-reference/class/LinearVelocity","PlaneConstraint":"https://developer.roblox.com/en-us/api-reference/class/PlaneConstraint","Plane":"https://developer.roblox.com/en-us/api-reference/class/Plane","RigidConstraint":"https://developer.roblox.com/en-us/api-reference/class/RigidConstraint","RodConstraint":"https://developer.roblox.com/en-us/api-reference/class/RodConstraint","RopeConstraint":"https://developer.roblox.com/en-us/api-reference/class/RopeConstraint","SlidingBallConstraint":"https://developer.roblox.com/en-us/api-reference/class/SlidingBallConstraint","CylindricalConstraint":"https://developer.roblox.com/en-us/api-reference/class/CylindricalConstraint","PrismaticConstraint":"https://developer.roblox.com/en-us/api-reference/class/PrismaticConstraint","SpringConstraint":"https://developer.roblox.com/en-us/api-reference/class/SpringConstraint","Torque":"https://developer.roblox.com/en-us/api-reference/class/Torque","TorsionSpringConstraint":"https://developer.roblox.com/en-us/api-reference/class/TorsionSpringConstraint","UniversalConstraint":"https://developer.roblox.com/en-us/api-reference/class/UniversalConstraint","VectorForce":"https://developer.roblox.com/en-us/api-reference/class/VectorForce","ContentProvider":"https://developer.roblox.com/en-us/api-reference/class/ContentProvider","ContextActionService":"https://developer.roblox.com/en-us/api-reference/class/ContextActionService","Controller":"https://developer.roblox.com/en-us/api-reference/class/Controller","HumanoidController":"https://developer.roblox.com/en-us/api-reference/class/HumanoidController","SkateboardController":"https://developer.roblox.com/en-us/api-reference/class/SkateboardController","VehicleController":"https://developer.roblox.com/en-us/api-reference/class/VehicleController","ControllerBase":"https://developer.roblox.com/en-us/api-reference/class/ControllerBase","AirController":"https://developer.roblox.com/en-us/api-reference/class/AirController","ClimbController":"https://developer.roblox.com/en-us/api-reference/class/ClimbController","GroundController":"https://developer.roblox.com/en-us/api-reference/class/GroundController","SwimController":"https://developer.roblox.com/en-us/api-reference/class/SwimController","ControllerManager":"https://developer.roblox.com/en-us/api-reference/class/ControllerManager","ControllerService":"https://developer.roblox.com/en-us/api-reference/class/ControllerService","ConversationalAIAcceptanceService":"https://developer.roblox.com/en-us/api-reference/class/ConversationalAIAcceptanceService","CookiesService":"https://developer.roblox.com/en-us/api-reference/class/CookiesService","CorePackages":"https://developer.roblox.com/en-us/api-reference/class/CorePackages","CoreScriptDebuggingManagerHelper":"https://developer.roblox.com/en-us/api-reference/class/CoreScriptDebuggingManagerHelper","CoreScriptSyncService":"https://developer.roblox.com/en-us/api-reference/class/CoreScriptSyncService","CreationDBService":"https://developer.roblox.com/en-us/api-reference/class/CreationDBService","CrossDMScriptChangeListener":"https://developer.roblox.com/en-us/api-reference/class/CrossDMScriptChangeListener","CustomEvent":"https://developer.roblox.com/en-us/api-reference/class/CustomEvent","CustomEventReceiver":"https://developer.roblox.com/en-us/api-reference/class/CustomEventReceiver","DataModelMesh":"https://developer.roblox.com/en-us/api-reference/class/DataModelMesh","BevelMesh":"https://developer.roblox.com/en-us/api-reference/class/BevelMesh","BlockMesh":"https://developer.roblox.com/en-us/api-reference/class/BlockMesh","CylinderMesh":"https://developer.roblox.com/en-us/api-reference/class/CylinderMesh","EditableMesh":"https://developer.roblox.com/en-us/api-reference/class/EditableMesh","RobloxEditableMesh":"https://developer.roblox.com/en-us/api-reference/class/RobloxEditableMesh","FileMesh":"https://developer.roblox.com/en-us/api-reference/class/FileMesh","SpecialMesh":"https://developer.roblox.com/en-us/api-reference/class/SpecialMesh","DataModelPatchService":"https://developer.roblox.com/en-us/api-reference/class/DataModelPatchService","DataModelSession":"https://developer.roblox.com/en-us/api-reference/class/DataModelSession","DataStoreGetOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreGetOptions","DataStoreIncrementOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreIncrementOptions","DataStoreInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreInfo","DataStoreKey":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKey","DataStoreKeyInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKeyInfo","DataStoreObjectVersionInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreObjectVersionInfo","DataStoreOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreOptions","DataStoreService":"https://developer.roblox.com/en-us/api-reference/class/DataStoreService","DataStoreSetOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreSetOptions","Debris":"https://developer.roblox.com/en-us/api-reference/class/Debris","DebugSettings":"https://developer.roblox.com/en-us/api-reference/class/DebugSettings","DebuggablePluginWatcher":"https://developer.roblox.com/en-us/api-reference/class/DebuggablePluginWatcher","DebuggerBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/DebuggerBreakpoint","DebuggerConnection":"https://developer.roblox.com/en-us/api-reference/class/DebuggerConnection","LocalDebuggerConnection":"https://developer.roblox.com/en-us/api-reference/class/LocalDebuggerConnection","DebuggerConnectionManager":"https://developer.roblox.com/en-us/api-reference/class/DebuggerConnectionManager","DebuggerLuaResponse":"https://developer.roblox.com/en-us/api-reference/class/DebuggerLuaResponse","DebuggerManager":"https://developer.roblox.com/en-us/api-reference/class/DebuggerManager","DebuggerUIService":"https://developer.roblox.com/en-us/api-reference/class/DebuggerUIService","DebuggerVariable":"https://developer.roblox.com/en-us/api-reference/class/DebuggerVariable","DebuggerWatch":"https://developer.roblox.com/en-us/api-reference/class/DebuggerWatch","DeviceIdService":"https://developer.roblox.com/en-us/api-reference/class/DeviceIdService","Dialog":"https://developer.roblox.com/en-us/api-reference/class/Dialog","DialogChoice":"https://developer.roblox.com/en-us/api-reference/class/DialogChoice","DraftsService":"https://developer.roblox.com/en-us/api-reference/class/DraftsService","Dragger":"https://developer.roblox.com/en-us/api-reference/class/Dragger","DraggerService":"https://developer.roblox.com/en-us/api-reference/class/DraggerService","EditableImage":"https://developer.roblox.com/en-us/api-reference/class/EditableImage","RobloxEditableImage":"https://developer.roblox.com/en-us/api-reference/class/RobloxEditableImage","EngineAPICloudProcessingService":"https://developer.roblox.com/en-us/api-reference/class/EngineAPICloudProcessingService","EulerRotationCurve":"https://developer.roblox.com/en-us/api-reference/class/EulerRotationCurve","EventIngestService":"https://developer.roblox.com/en-us/api-reference/class/EventIngestService","ExampleService":"https://developer.roblox.com/en-us/api-reference/class/ExampleService","ExperienceAuthService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceAuthService","ExperienceInviteOptions":"https://developer.roblox.com/en-us/api-reference/class/ExperienceInviteOptions","ExperienceNotificationService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceNotificationService","ExperienceService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceService","ExperienceStateCaptureService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceStateCaptureService","Explosion":"https://developer.roblox.com/en-us/api-reference/class/Explosion","FaceAnimatorService":"https://developer.roblox.com/en-us/api-reference/class/FaceAnimatorService","FaceControls":"https://developer.roblox.com/en-us/api-reference/class/FaceControls","FaceInstance":"https://developer.roblox.com/en-us/api-reference/class/FaceInstance","Decal":"https://developer.roblox.com/en-us/api-reference/class/Decal","Texture":"https://developer.roblox.com/en-us/api-reference/class/Texture","FacialAnimationRecordingService":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationRecordingService","FacialAnimationStreamingServiceStats":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingServiceStats","FacialAnimationStreamingServiceV2":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingServiceV2","FacialAnimationStreamingSubsessionStats":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingSubsessionStats","Feature":"https://developer.roblox.com/en-us/api-reference/class/Feature","Hole":"https://developer.roblox.com/en-us/api-reference/class/Hole","MotorFeature":"https://developer.roblox.com/en-us/api-reference/class/MotorFeature","File":"https://developer.roblox.com/en-us/api-reference/class/File","Fire":"https://developer.roblox.com/en-us/api-reference/class/Fire","FlagStandService":"https://developer.roblox.com/en-us/api-reference/class/FlagStandService","FloatCurve":"https://developer.roblox.com/en-us/api-reference/class/FloatCurve","FlyweightService":"https://developer.roblox.com/en-us/api-reference/class/FlyweightService","CSGDictionaryService":"https://developer.roblox.com/en-us/api-reference/class/CSGDictionaryService","NonReplicatedCSGDictionaryService":"https://developer.roblox.com/en-us/api-reference/class/NonReplicatedCSGDictionaryService","Folder":"https://developer.roblox.com/en-us/api-reference/class/Folder","ForceField":"https://developer.roblox.com/en-us/api-reference/class/ForceField","FriendService":"https://developer.roblox.com/en-us/api-reference/class/FriendService","FunctionalTest":"https://developer.roblox.com/en-us/api-reference/class/FunctionalTest","GamePassService":"https://developer.roblox.com/en-us/api-reference/class/GamePassService","GameSettings":"https://developer.roblox.com/en-us/api-reference/class/GameSettings","GamepadService":"https://developer.roblox.com/en-us/api-reference/class/GamepadService","GenericChallengeService":"https://developer.roblox.com/en-us/api-reference/class/GenericChallengeService","Geometry":"https://developer.roblox.com/en-us/api-reference/class/Geometry","GeometryService":"https://developer.roblox.com/en-us/api-reference/class/GeometryService","GetTextBoundsParams":"https://developer.roblox.com/en-us/api-reference/class/GetTextBoundsParams","GlobalDataStore":"https://developer.roblox.com/en-us/api-reference/class/GlobalDataStore","DataStore":"https://developer.roblox.com/en-us/api-reference/class/DataStore","OrderedDataStore":"https://developer.roblox.com/en-us/api-reference/class/OrderedDataStore","GoogleAnalyticsConfiguration":"https://developer.roblox.com/en-us/api-reference/class/GoogleAnalyticsConfiguration","GroupService":"https://developer.roblox.com/en-us/api-reference/class/GroupService","GuiBase":"https://developer.roblox.com/en-us/api-reference/class/GuiBase","GuiBase2d":"https://developer.roblox.com/en-us/api-reference/class/GuiBase2d","GuiObject":"https://developer.roblox.com/en-us/api-reference/class/GuiObject","CanvasGroup":"https://developer.roblox.com/en-us/api-reference/class/CanvasGroup","Frame":"https://developer.roblox.com/en-us/api-reference/class/Frame","GuiButton":"https://developer.roblox.com/en-us/api-reference/class/GuiButton","ImageButton":"https://developer.roblox.com/en-us/api-reference/class/ImageButton","TextButton":"https://developer.roblox.com/en-us/api-reference/class/TextButton","GuiLabel":"https://developer.roblox.com/en-us/api-reference/class/GuiLabel","ImageLabel":"https://developer.roblox.com/en-us/api-reference/class/ImageLabel","TextLabel":"https://developer.roblox.com/en-us/api-reference/class/TextLabel","ScrollingFrame":"https://developer.roblox.com/en-us/api-reference/class/ScrollingFrame","TextBox":"https://developer.roblox.com/en-us/api-reference/class/TextBox","VideoFrame":"https://developer.roblox.com/en-us/api-reference/class/VideoFrame","ViewportFrame":"https://developer.roblox.com/en-us/api-reference/class/ViewportFrame","LayerCollector":"https://developer.roblox.com/en-us/api-reference/class/LayerCollector","BillboardGui":"https://developer.roblox.com/en-us/api-reference/class/BillboardGui","PluginGui":"https://developer.roblox.com/en-us/api-reference/class/PluginGui","DockWidgetPluginGui":"https://developer.roblox.com/en-us/api-reference/class/DockWidgetPluginGui","QWidgetPluginGui":"https://developer.roblox.com/en-us/api-reference/class/QWidgetPluginGui","ScreenGui":"https://developer.roblox.com/en-us/api-reference/class/ScreenGui","GuiMain":"https://developer.roblox.com/en-us/api-reference/class/GuiMain","SurfaceGuiBase":"https://developer.roblox.com/en-us/api-reference/class/SurfaceGuiBase","AdGui":"https://developer.roblox.com/en-us/api-reference/class/AdGui","SurfaceGui":"https://developer.roblox.com/en-us/api-reference/class/SurfaceGui","GuiBase3d":"https://developer.roblox.com/en-us/api-reference/class/GuiBase3d","FloorWire":"https://developer.roblox.com/en-us/api-reference/class/FloorWire","InstanceAdornment":"https://developer.roblox.com/en-us/api-reference/class/InstanceAdornment","SelectionBox":"https://developer.roblox.com/en-us/api-reference/class/SelectionBox","PVAdornment":"https://developer.roblox.com/en-us/api-reference/class/PVAdornment","HandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/HandleAdornment","BoxHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/BoxHandleAdornment","ConeHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/ConeHandleAdornment","CylinderHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/CylinderHandleAdornment","ImageHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/ImageHandleAdornment","LineHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/LineHandleAdornment","SphereHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/SphereHandleAdornment","WireframeHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/WireframeHandleAdornment","ParabolaAdornment":"https://developer.roblox.com/en-us/api-reference/class/ParabolaAdornment","SelectionSphere":"https://developer.roblox.com/en-us/api-reference/class/SelectionSphere","PartAdornment":"https://developer.roblox.com/en-us/api-reference/class/PartAdornment","HandlesBase":"https://developer.roblox.com/en-us/api-reference/class/HandlesBase","ArcHandles":"https://developer.roblox.com/en-us/api-reference/class/ArcHandles","Handles":"https://developer.roblox.com/en-us/api-reference/class/Handles","SurfaceSelection":"https://developer.roblox.com/en-us/api-reference/class/SurfaceSelection","SelectionLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionLasso","SelectionPartLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionPartLasso","SelectionPointLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionPointLasso","Path2D":"https://developer.roblox.com/en-us/api-reference/class/Path2D","GuiService":"https://developer.roblox.com/en-us/api-reference/class/GuiService","GuidRegistryService":"https://developer.roblox.com/en-us/api-reference/class/GuidRegistryService","HapticService":"https://developer.roblox.com/en-us/api-reference/class/HapticService","HeightmapImporterService":"https://developer.roblox.com/en-us/api-reference/class/HeightmapImporterService","HiddenSurfaceRemovalAsset":"https://developer.roblox.com/en-us/api-reference/class/HiddenSurfaceRemovalAsset","Highlight":"https://developer.roblox.com/en-us/api-reference/class/Highlight","Hopper":"https://developer.roblox.com/en-us/api-reference/class/Hopper","HttpRbxApiService":"https://developer.roblox.com/en-us/api-reference/class/HttpRbxApiService","HttpRequest":"https://developer.roblox.com/en-us/api-reference/class/HttpRequest","HttpService":"https://developer.roblox.com/en-us/api-reference/class/HttpService","Humanoid":"https://developer.roblox.com/en-us/api-reference/class/Humanoid","HumanoidDescription":"https://developer.roblox.com/en-us/api-reference/class/HumanoidDescription","IKControl":"https://developer.roblox.com/en-us/api-reference/class/IKControl","ILegacyStudioBridge":"https://developer.roblox.com/en-us/api-reference/class/ILegacyStudioBridge","LegacyStudioBridge":"https://developer.roblox.com/en-us/api-reference/class/LegacyStudioBridge","IXPService":"https://developer.roblox.com/en-us/api-reference/class/IXPService","IncrementalPatchBuilder":"https://developer.roblox.com/en-us/api-reference/class/IncrementalPatchBuilder","InputObject":"https://developer.roblox.com/en-us/api-reference/class/InputObject","InsertService":"https://developer.roblox.com/en-us/api-reference/class/InsertService","JointInstance":"https://developer.roblox.com/en-us/api-reference/class/JointInstance","DynamicRotate":"https://developer.roblox.com/en-us/api-reference/class/DynamicRotate","RotateP":"https://developer.roblox.com/en-us/api-reference/class/RotateP","RotateV":"https://developer.roblox.com/en-us/api-reference/class/RotateV","Glue":"https://developer.roblox.com/en-us/api-reference/class/Glue","ManualSurfaceJointInstance":"https://developer.roblox.com/en-us/api-reference/class/ManualSurfaceJointInstance","ManualGlue":"https://developer.roblox.com/en-us/api-reference/class/ManualGlue","ManualWeld":"https://developer.roblox.com/en-us/api-reference/class/ManualWeld","Motor":"https://developer.roblox.com/en-us/api-reference/class/Motor","Motor6D":"https://developer.roblox.com/en-us/api-reference/class/Motor6D","Rotate":"https://developer.roblox.com/en-us/api-reference/class/Rotate","Snap":"https://developer.roblox.com/en-us/api-reference/class/Snap","VelocityMotor":"https://developer.roblox.com/en-us/api-reference/class/VelocityMotor","Weld":"https://developer.roblox.com/en-us/api-reference/class/Weld","JointsService":"https://developer.roblox.com/en-us/api-reference/class/JointsService","KeyboardService":"https://developer.roblox.com/en-us/api-reference/class/KeyboardService","Keyframe":"https://developer.roblox.com/en-us/api-reference/class/Keyframe","KeyframeMarker":"https://developer.roblox.com/en-us/api-reference/class/KeyframeMarker","KeyframeSequenceProvider":"https://developer.roblox.com/en-us/api-reference/class/KeyframeSequenceProvider","LSPFileSyncService":"https://developer.roblox.com/en-us/api-reference/class/LSPFileSyncService","LanguageService":"https://developer.roblox.com/en-us/api-reference/class/LanguageService","Light":"https://developer.roblox.com/en-us/api-reference/class/Light","PointLight":"https://developer.roblox.com/en-us/api-reference/class/PointLight","SpotLight":"https://developer.roblox.com/en-us/api-reference/class/SpotLight","SurfaceLight":"https://developer.roblox.com/en-us/api-reference/class/SurfaceLight","Lighting":"https://developer.roblox.com/en-us/api-reference/class/Lighting","LiveScriptingService":"https://developer.roblox.com/en-us/api-reference/class/LiveScriptingService","LocalStorageService":"https://developer.roblox.com/en-us/api-reference/class/LocalStorageService","AppStorageService":"https://developer.roblox.com/en-us/api-reference/class/AppStorageService","UserStorageService":"https://developer.roblox.com/en-us/api-reference/class/UserStorageService","LocalizationService":"https://developer.roblox.com/en-us/api-reference/class/LocalizationService","LocalizationTable":"https://developer.roblox.com/en-us/api-reference/class/LocalizationTable","CloudLocalizationTable":"https://developer.roblox.com/en-us/api-reference/class/CloudLocalizationTable","LodDataEntity":"https://developer.roblox.com/en-us/api-reference/class/LodDataEntity","LodDataService":"https://developer.roblox.com/en-us/api-reference/class/LodDataService","LogReporterService":"https://developer.roblox.com/en-us/api-reference/class/LogReporterService","LogService":"https://developer.roblox.com/en-us/api-reference/class/LogService","LoginService":"https://developer.roblox.com/en-us/api-reference/class/LoginService","LuaSettings":"https://developer.roblox.com/en-us/api-reference/class/LuaSettings","LuaSourceContainer":"https://developer.roblox.com/en-us/api-reference/class/LuaSourceContainer","BaseScript":"https://developer.roblox.com/en-us/api-reference/class/BaseScript","CoreScript":"https://developer.roblox.com/en-us/api-reference/class/CoreScript","Script":"https://developer.roblox.com/en-us/api-reference/class/Script","LocalScript":"https://developer.roblox.com/en-us/api-reference/class/LocalScript","ModuleScript":"https://developer.roblox.com/en-us/api-reference/class/ModuleScript","LuaWebService":"https://developer.roblox.com/en-us/api-reference/class/LuaWebService","LuauScriptAnalyzerService":"https://developer.roblox.com/en-us/api-reference/class/LuauScriptAnalyzerService","MarkerCurve":"https://developer.roblox.com/en-us/api-reference/class/MarkerCurve","MarketplaceService":"https://developer.roblox.com/en-us/api-reference/class/MarketplaceService","MaterialGenerationService":"https://developer.roblox.com/en-us/api-reference/class/MaterialGenerationService","MaterialGenerationSession":"https://developer.roblox.com/en-us/api-reference/class/MaterialGenerationSession","MaterialService":"https://developer.roblox.com/en-us/api-reference/class/MaterialService","MaterialVariant":"https://developer.roblox.com/en-us/api-reference/class/MaterialVariant","MemStorageConnection":"https://developer.roblox.com/en-us/api-reference/class/MemStorageConnection","MemStorageService":"https://developer.roblox.com/en-us/api-reference/class/MemStorageService","MemoryStoreHashMap":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreHashMap","MemoryStoreQueue":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreQueue","MemoryStoreService":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreService","MemoryStoreSortedMap":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreSortedMap","Message":"https://developer.roblox.com/en-us/api-reference/class/Message","Hint":"https://developer.roblox.com/en-us/api-reference/class/Hint","MessageBusConnection":"https://developer.roblox.com/en-us/api-reference/class/MessageBusConnection","MessageBusService":"https://developer.roblox.com/en-us/api-reference/class/MessageBusService","MessagingService":"https://developer.roblox.com/en-us/api-reference/class/MessagingService","MetaBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpoint","MetaBreakpointContext":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpointContext","MetaBreakpointManager":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpointManager","Mouse":"https://developer.roblox.com/en-us/api-reference/class/Mouse","PlayerMouse":"https://developer.roblox.com/en-us/api-reference/class/PlayerMouse","PluginMouse":"https://developer.roblox.com/en-us/api-reference/class/PluginMouse","MouseService":"https://developer.roblox.com/en-us/api-reference/class/MouseService","MultipleDocumentInterfaceInstance":"https://developer.roblox.com/en-us/api-reference/class/MultipleDocumentInterfaceInstance","NetworkMarker":"https://developer.roblox.com/en-us/api-reference/class/NetworkMarker","NetworkPeer":"https://developer.roblox.com/en-us/api-reference/class/NetworkPeer","NetworkClient":"https://developer.roblox.com/en-us/api-reference/class/NetworkClient","NetworkServer":"https://developer.roblox.com/en-us/api-reference/class/NetworkServer","NetworkReplicator":"https://developer.roblox.com/en-us/api-reference/class/NetworkReplicator","ClientReplicator":"https://developer.roblox.com/en-us/api-reference/class/ClientReplicator","ServerReplicator":"https://developer.roblox.com/en-us/api-reference/class/ServerReplicator","NetworkSettings":"https://developer.roblox.com/en-us/api-reference/class/NetworkSettings","NoCollisionConstraint":"https://developer.roblox.com/en-us/api-reference/class/NoCollisionConstraint","Noise":"https://developer.roblox.com/en-us/api-reference/class/Noise","NotificationService":"https://developer.roblox.com/en-us/api-reference/class/NotificationService","OmniRecommendationsService":"https://developer.roblox.com/en-us/api-reference/class/OmniRecommendationsService","OpenCloudApiV1":"https://developer.roblox.com/en-us/api-reference/class/OpenCloudApiV1","OpenCloudService":"https://developer.roblox.com/en-us/api-reference/class/OpenCloudService","OperationGraph":"https://developer.roblox.com/en-us/api-reference/class/OperationGraph","PVInstance":"https://developer.roblox.com/en-us/api-reference/class/PVInstance","BasePart":"https://developer.roblox.com/en-us/api-reference/class/BasePart","CornerWedgePart":"https://developer.roblox.com/en-us/api-reference/class/CornerWedgePart","FormFactorPart":"https://developer.roblox.com/en-us/api-reference/class/FormFactorPart","Part":"https://developer.roblox.com/en-us/api-reference/class/Part","FlagStand":"https://developer.roblox.com/en-us/api-reference/class/FlagStand","Platform":"https://developer.roblox.com/en-us/api-reference/enum/Platform","Seat":"https://developer.roblox.com/en-us/api-reference/class/Seat","SkateboardPlatform":"https://developer.roblox.com/en-us/api-reference/class/SkateboardPlatform","SpawnLocation":"https://developer.roblox.com/en-us/api-reference/class/SpawnLocation","WedgePart":"https://developer.roblox.com/en-us/api-reference/class/WedgePart","Terrain":"https://developer.roblox.com/en-us/api-reference/class/Terrain","TriangleMeshPart":"https://developer.roblox.com/en-us/api-reference/class/TriangleMeshPart","MeshPart":"https://developer.roblox.com/en-us/api-reference/class/MeshPart","PartOperation":"https://developer.roblox.com/en-us/api-reference/class/PartOperation","IntersectOperation":"https://developer.roblox.com/en-us/api-reference/class/IntersectOperation","NegateOperation":"https://developer.roblox.com/en-us/api-reference/class/NegateOperation","UnionOperation":"https://developer.roblox.com/en-us/api-reference/class/UnionOperation","TrussPart":"https://developer.roblox.com/en-us/api-reference/class/TrussPart","VehicleSeat":"https://developer.roblox.com/en-us/api-reference/class/VehicleSeat","Model":"https://developer.roblox.com/en-us/api-reference/class/Model","Actor":"https://developer.roblox.com/en-us/api-reference/class/Actor","BackpackItem":"https://developer.roblox.com/en-us/api-reference/class/BackpackItem","HopperBin":"https://developer.roblox.com/en-us/api-reference/class/HopperBin","Tool":"https://developer.roblox.com/en-us/api-reference/class/Tool","Flag":"https://developer.roblox.com/en-us/api-reference/class/Flag","Status":"https://developer.roblox.com/en-us/api-reference/enum/Status","WorldRoot":"https://developer.roblox.com/en-us/api-reference/class/WorldRoot","Workspace":"https://developer.roblox.com/en-us/api-reference/class/Workspace","WorldModel":"https://developer.roblox.com/en-us/api-reference/class/WorldModel","PackageLink":"https://developer.roblox.com/en-us/api-reference/class/PackageLink","PackageService":"https://developer.roblox.com/en-us/api-reference/class/PackageService","PackageUIService":"https://developer.roblox.com/en-us/api-reference/class/PackageUIService","Pages":"https://developer.roblox.com/en-us/api-reference/class/Pages","AudioPages":"https://developer.roblox.com/en-us/api-reference/class/AudioPages","CatalogPages":"https://developer.roblox.com/en-us/api-reference/class/CatalogPages","DataStoreKeyPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKeyPages","DataStoreListingPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreListingPages","DataStorePages":"https://developer.roblox.com/en-us/api-reference/class/DataStorePages","DataStoreVersionPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreVersionPages","FriendPages":"https://developer.roblox.com/en-us/api-reference/class/FriendPages","InventoryPages":"https://developer.roblox.com/en-us/api-reference/class/InventoryPages","EmotesPages":"https://developer.roblox.com/en-us/api-reference/class/EmotesPages","MemoryStoreHashMapPages":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreHashMapPages","OutfitPages":"https://developer.roblox.com/en-us/api-reference/class/OutfitPages","StandardPages":"https://developer.roblox.com/en-us/api-reference/class/StandardPages","PartOperationAsset":"https://developer.roblox.com/en-us/api-reference/class/PartOperationAsset","ParticleEmitter":"https://developer.roblox.com/en-us/api-reference/class/ParticleEmitter","PatchBundlerFileWatch":"https://developer.roblox.com/en-us/api-reference/class/PatchBundlerFileWatch","PatchMapping":"https://developer.roblox.com/en-us/api-reference/class/PatchMapping","Path":"https://developer.roblox.com/en-us/api-reference/class/Path","PathfindingLink":"https://developer.roblox.com/en-us/api-reference/class/PathfindingLink","PathfindingModifier":"https://developer.roblox.com/en-us/api-reference/class/PathfindingModifier","PathfindingService":"https://developer.roblox.com/en-us/api-reference/class/PathfindingService","PausedState":"https://developer.roblox.com/en-us/api-reference/class/PausedState","PausedStateBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/PausedStateBreakpoint","PausedStateException":"https://developer.roblox.com/en-us/api-reference/class/PausedStateException","PermissionsService":"https://developer.roblox.com/en-us/api-reference/class/PermissionsService","PhysicsService":"https://developer.roblox.com/en-us/api-reference/class/PhysicsService","PhysicsSettings":"https://developer.roblox.com/en-us/api-reference/class/PhysicsSettings","PlaceStatsService":"https://developer.roblox.com/en-us/api-reference/class/PlaceStatsService","PlacesService":"https://developer.roblox.com/en-us/api-reference/class/PlacesService","PlatformCloudStorageService":"https://developer.roblox.com/en-us/api-reference/class/PlatformCloudStorageService","PlatformFriendsService":"https://developer.roblox.com/en-us/api-reference/class/PlatformFriendsService","Player":"https://developer.roblox.com/en-us/api-reference/class/Player","PlayerEmulatorService":"https://developer.roblox.com/en-us/api-reference/class/PlayerEmulatorService","PlayerScripts":"https://developer.roblox.com/en-us/api-reference/class/PlayerScripts","PlayerViewService":"https://developer.roblox.com/en-us/api-reference/class/PlayerViewService","Players":"https://developer.roblox.com/en-us/api-reference/class/Players","Plugin":"https://developer.roblox.com/en-us/api-reference/class/Plugin","PluginAction":"https://developer.roblox.com/en-us/api-reference/class/PluginAction","PluginCapabilities":"https://developer.roblox.com/en-us/api-reference/class/PluginCapabilities","PluginDebugService":"https://developer.roblox.com/en-us/api-reference/class/PluginDebugService","PluginDragEvent":"https://developer.roblox.com/en-us/api-reference/class/PluginDragEvent","PluginGuiService":"https://developer.roblox.com/en-us/api-reference/class/PluginGuiService","PluginManagementService":"https://developer.roblox.com/en-us/api-reference/class/PluginManagementService","PluginManager":"https://developer.roblox.com/en-us/api-reference/class/PluginManager","PluginManagerInterface":"https://developer.roblox.com/en-us/api-reference/class/PluginManagerInterface","PluginMenu":"https://developer.roblox.com/en-us/api-reference/class/PluginMenu","PluginPolicyService":"https://developer.roblox.com/en-us/api-reference/class/PluginPolicyService","PluginToolbar":"https://developer.roblox.com/en-us/api-reference/class/PluginToolbar","PluginToolbarButton":"https://developer.roblox.com/en-us/api-reference/class/PluginToolbarButton","PointsService":"https://developer.roblox.com/en-us/api-reference/class/PointsService","PolicyService":"https://developer.roblox.com/en-us/api-reference/class/PolicyService","PoseBase":"https://developer.roblox.com/en-us/api-reference/class/PoseBase","NumberPose":"https://developer.roblox.com/en-us/api-reference/class/NumberPose","Pose":"https://developer.roblox.com/en-us/api-reference/class/Pose","PostEffect":"https://developer.roblox.com/en-us/api-reference/class/PostEffect","BloomEffect":"https://developer.roblox.com/en-us/api-reference/class/BloomEffect","BlurEffect":"https://developer.roblox.com/en-us/api-reference/class/BlurEffect","ColorCorrectionEffect":"https://developer.roblox.com/en-us/api-reference/class/ColorCorrectionEffect","DepthOfFieldEffect":"https://developer.roblox.com/en-us/api-reference/class/DepthOfFieldEffect","SunRaysEffect":"https://developer.roblox.com/en-us/api-reference/class/SunRaysEffect","ProcessInstancePhysicsService":"https://developer.roblox.com/en-us/api-reference/class/ProcessInstancePhysicsService","ProjectFolderService":"https://developer.roblox.com/en-us/api-reference/class/ProjectFolderService","ProximityPrompt":"https://developer.roblox.com/en-us/api-reference/class/ProximityPrompt","ProximityPromptService":"https://developer.roblox.com/en-us/api-reference/class/ProximityPromptService","PublishService":"https://developer.roblox.com/en-us/api-reference/class/PublishService","RbxAnalyticsService":"https://developer.roblox.com/en-us/api-reference/class/RbxAnalyticsService","ReflectionMetadata":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadata","ReflectionMetadataCallbacks":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataCallbacks","ReflectionMetadataClasses":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataClasses","ReflectionMetadataEnums":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnums","ReflectionMetadataEvents":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEvents","ReflectionMetadataFunctions":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataFunctions","ReflectionMetadataItem":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataItem","ReflectionMetadataClass":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataClass","ReflectionMetadataEnum":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnum","ReflectionMetadataEnumItem":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnumItem","ReflectionMetadataMember":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataMember","ReflectionMetadataProperties":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataProperties","ReflectionMetadataYieldFunctions":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataYieldFunctions","ReflectionService":"https://developer.roblox.com/en-us/api-reference/class/ReflectionService","RemoteCursorService":"https://developer.roblox.com/en-us/api-reference/class/RemoteCursorService","RemoteDebuggerServer":"https://developer.roblox.com/en-us/api-reference/class/RemoteDebuggerServer","RemoteFunction":"https://developer.roblox.com/en-us/api-reference/class/RemoteFunction","RenderSettings":"https://developer.roblox.com/en-us/api-reference/class/RenderSettings","RenderingTest":"https://developer.roblox.com/en-us/api-reference/class/RenderingTest","ReplicatedFirst":"https://developer.roblox.com/en-us/api-reference/class/ReplicatedFirst","ReplicatedStorage":"https://developer.roblox.com/en-us/api-reference/class/ReplicatedStorage","RibbonNotificationService":"https://developer.roblox.com/en-us/api-reference/class/RibbonNotificationService","RobloxPluginGuiService":"https://developer.roblox.com/en-us/api-reference/class/RobloxPluginGuiService","RobloxReplicatedStorage":"https://developer.roblox.com/en-us/api-reference/class/RobloxReplicatedStorage","RobloxServerStorage":"https://developer.roblox.com/en-us/api-reference/class/RobloxServerStorage","RomarkService":"https://developer.roblox.com/en-us/api-reference/class/RomarkService","RotationCurve":"https://developer.roblox.com/en-us/api-reference/class/RotationCurve","RtMessagingService":"https://developer.roblox.com/en-us/api-reference/class/RtMessagingService","RunService":"https://developer.roblox.com/en-us/api-reference/class/RunService","RuntimeScriptService":"https://developer.roblox.com/en-us/api-reference/class/RuntimeScriptService","SafetyService":"https://developer.roblox.com/en-us/api-reference/class/SafetyService","ScreenshotHud":"https://developer.roblox.com/en-us/api-reference/class/ScreenshotHud","ScriptBuilder":"https://developer.roblox.com/en-us/api-reference/class/ScriptBuilder","SyncScriptBuilder":"https://developer.roblox.com/en-us/api-reference/class/SyncScriptBuilder","ScriptChangeService":"https://developer.roblox.com/en-us/api-reference/class/ScriptChangeService","ScriptCloneWatcher":"https://developer.roblox.com/en-us/api-reference/class/ScriptCloneWatcher","ScriptCloneWatcherHelper":"https://developer.roblox.com/en-us/api-reference/class/ScriptCloneWatcherHelper","ScriptCommitService":"https://developer.roblox.com/en-us/api-reference/class/ScriptCommitService","ScriptContext":"https://developer.roblox.com/en-us/api-reference/class/ScriptContext","ScriptDebugger":"https://developer.roblox.com/en-us/api-reference/class/ScriptDebugger","ScriptDocument":"https://developer.roblox.com/en-us/api-reference/class/ScriptDocument","ScriptEditorService":"https://developer.roblox.com/en-us/api-reference/class/ScriptEditorService","ScriptProfilerService":"https://developer.roblox.com/en-us/api-reference/class/ScriptProfilerService","ScriptRegistrationService":"https://developer.roblox.com/en-us/api-reference/class/ScriptRegistrationService","ScriptRuntime":"https://developer.roblox.com/en-us/api-reference/class/ScriptRuntime","ScriptService":"https://developer.roblox.com/en-us/api-reference/class/ScriptService","Selection":"https://developer.roblox.com/en-us/api-reference/class/Selection","SelectionHighlightManager":"https://developer.roblox.com/en-us/api-reference/class/SelectionHighlightManager","SensorBase":"https://developer.roblox.com/en-us/api-reference/class/SensorBase","BuoyancySensor":"https://developer.roblox.com/en-us/api-reference/class/BuoyancySensor","ControllerSensor":"https://developer.roblox.com/en-us/api-reference/class/ControllerSensor","ControllerPartSensor":"https://developer.roblox.com/en-us/api-reference/class/ControllerPartSensor","ServerScriptService":"https://developer.roblox.com/en-us/api-reference/class/ServerScriptService","ServerStorage":"https://developer.roblox.com/en-us/api-reference/class/ServerStorage","ServiceProvider":"https://developer.roblox.com/en-us/api-reference/class/ServiceProvider","DataModel":"https://developer.roblox.com/en-us/api-reference/class/DataModel","GenericSettings":"https://developer.roblox.com/en-us/api-reference/class/GenericSettings","AnalysticsSettings":"https://developer.roblox.com/en-us/api-reference/class/AnalysticsSettings","GlobalSettings":"https://developer.roblox.com/en-us/api-reference/class/GlobalSettings","UserSettings":"https://developer.roblox.com/en-us/api-reference/class/UserSettings","ServiceVisibilityService":"https://developer.roblox.com/en-us/api-reference/class/ServiceVisibilityService","SessionService":"https://developer.roblox.com/en-us/api-reference/class/SessionService","SharedTableRegistry":"https://developer.roblox.com/en-us/api-reference/class/SharedTableRegistry","ShorelineUpgraderService":"https://developer.roblox.com/en-us/api-reference/class/ShorelineUpgraderService","Sky":"https://developer.roblox.com/en-us/api-reference/class/Sky","Smoke":"https://developer.roblox.com/en-us/api-reference/class/Smoke","SmoothVoxelsUpgraderService":"https://developer.roblox.com/en-us/api-reference/class/SmoothVoxelsUpgraderService","SnippetService":"https://developer.roblox.com/en-us/api-reference/class/SnippetService","SocialService":"https://developer.roblox.com/en-us/api-reference/class/SocialService","Sound":"https://developer.roblox.com/en-us/api-reference/class/Sound","SoundEffect":"https://developer.roblox.com/en-us/api-reference/class/SoundEffect","ChorusSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ChorusSoundEffect","CompressorSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/CompressorSoundEffect","CustomSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/CustomSoundEffect","AssetSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/AssetSoundEffect","ChannelSelectorSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ChannelSelectorSoundEffect","DistortionSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/DistortionSoundEffect","EchoSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/EchoSoundEffect","EqualizerSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/EqualizerSoundEffect","FlangeSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/FlangeSoundEffect","PitchShiftSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/PitchShiftSoundEffect","ReverbSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ReverbSoundEffect","TremoloSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/TremoloSoundEffect","SoundGroup":"https://developer.roblox.com/en-us/api-reference/class/SoundGroup","SoundService":"https://developer.roblox.com/en-us/api-reference/class/SoundService","Sparkles":"https://developer.roblox.com/en-us/api-reference/class/Sparkles","SpawnerService":"https://developer.roblox.com/en-us/api-reference/class/SpawnerService","StackFrame":"https://developer.roblox.com/en-us/api-reference/class/StackFrame","StandalonePluginScripts":"https://developer.roblox.com/en-us/api-reference/class/StandalonePluginScripts","StarterGear":"https://developer.roblox.com/en-us/api-reference/class/StarterGear","StarterPack":"https://developer.roblox.com/en-us/api-reference/class/StarterPack","StarterPlayer":"https://developer.roblox.com/en-us/api-reference/class/StarterPlayer","StarterPlayerScripts":"https://developer.roblox.com/en-us/api-reference/class/StarterPlayerScripts","StarterCharacterScripts":"https://developer.roblox.com/en-us/api-reference/class/StarterCharacterScripts","StartupMessageService":"https://developer.roblox.com/en-us/api-reference/class/StartupMessageService","Stats":"https://developer.roblox.com/en-us/api-reference/class/Stats","StatsItem":"https://developer.roblox.com/en-us/api-reference/class/StatsItem","RunningAverageItemDouble":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageItemDouble","RunningAverageItemInt":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageItemInt","RunningAverageTimeIntervalItem":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageTimeIntervalItem","TotalCountTimeIntervalItem":"https://developer.roblox.com/en-us/api-reference/class/TotalCountTimeIntervalItem","StopWatchReporter":"https://developer.roblox.com/en-us/api-reference/class/StopWatchReporter","StreamingService":"https://developer.roblox.com/en-us/api-reference/class/StreamingService","Studio":"https://developer.roblox.com/en-us/api-reference/class/Studio","StudioAssetService":"https://developer.roblox.com/en-us/api-reference/class/StudioAssetService","StudioAttachment":"https://developer.roblox.com/en-us/api-reference/class/StudioAttachment","StudioCallout":"https://developer.roblox.com/en-us/api-reference/class/StudioCallout","StudioData":"https://developer.roblox.com/en-us/api-reference/class/StudioData","StudioDeviceEmulatorService":"https://developer.roblox.com/en-us/api-reference/class/StudioDeviceEmulatorService","StudioObjectBase":"https://developer.roblox.com/en-us/api-reference/class/StudioObjectBase","StudioWidget":"https://developer.roblox.com/en-us/api-reference/class/StudioWidget","StudioPublishService":"https://developer.roblox.com/en-us/api-reference/class/StudioPublishService","StudioScriptDebugEventListener":"https://developer.roblox.com/en-us/api-reference/class/StudioScriptDebugEventListener","StudioSdkService":"https://developer.roblox.com/en-us/api-reference/class/StudioSdkService","StudioService":"https://developer.roblox.com/en-us/api-reference/class/StudioService","StudioTheme":"https://developer.roblox.com/en-us/api-reference/class/StudioTheme","StudioWidgetsService":"https://developer.roblox.com/en-us/api-reference/class/StudioWidgetsService","StyleBase":"https://developer.roblox.com/en-us/api-reference/class/StyleBase","StyleRule":"https://developer.roblox.com/en-us/api-reference/class/StyleRule","StyleSheet":"https://developer.roblox.com/en-us/api-reference/class/StyleSheet","StyleDerive":"https://developer.roblox.com/en-us/api-reference/class/StyleDerive","StyleLink":"https://developer.roblox.com/en-us/api-reference/class/StyleLink","StylingService":"https://developer.roblox.com/en-us/api-reference/class/StylingService","SurfaceAppearance":"https://developer.roblox.com/en-us/api-reference/class/SurfaceAppearance","TaskScheduler":"https://developer.roblox.com/en-us/api-reference/class/TaskScheduler","Team":"https://developer.roblox.com/en-us/api-reference/class/Team","TeamCreateData":"https://developer.roblox.com/en-us/api-reference/class/TeamCreateData","TeamCreatePublishService":"https://developer.roblox.com/en-us/api-reference/class/TeamCreatePublishService","TeamCreateService":"https://developer.roblox.com/en-us/api-reference/class/TeamCreateService","Teams":"https://developer.roblox.com/en-us/api-reference/class/Teams","TeleportAsyncResult":"https://developer.roblox.com/en-us/api-reference/class/TeleportAsyncResult","TeleportOptions":"https://developer.roblox.com/en-us/api-reference/class/TeleportOptions","TeleportService":"https://developer.roblox.com/en-us/api-reference/class/TeleportService","TemporaryCageMeshProvider":"https://developer.roblox.com/en-us/api-reference/class/TemporaryCageMeshProvider","TemporaryScriptService":"https://developer.roblox.com/en-us/api-reference/class/TemporaryScriptService","TerrainDetail":"https://developer.roblox.com/en-us/api-reference/class/TerrainDetail","TerrainRegion":"https://developer.roblox.com/en-us/api-reference/class/TerrainRegion","TestService":"https://developer.roblox.com/en-us/api-reference/class/TestService","TextBoxService":"https://developer.roblox.com/en-us/api-reference/class/TextBoxService","TextChannel":"https://developer.roblox.com/en-us/api-reference/class/TextChannel","TextChatCommand":"https://developer.roblox.com/en-us/api-reference/class/TextChatCommand","TextChatConfigurations":"https://developer.roblox.com/en-us/api-reference/class/TextChatConfigurations","BubbleChatConfiguration":"https://developer.roblox.com/en-us/api-reference/class/BubbleChatConfiguration","ChatInputBarConfiguration":"https://developer.roblox.com/en-us/api-reference/class/ChatInputBarConfiguration","ChatWindowConfiguration":"https://developer.roblox.com/en-us/api-reference/class/ChatWindowConfiguration","TextChatMessage":"https://developer.roblox.com/en-us/api-reference/class/TextChatMessage","TextChatMessageProperties":"https://developer.roblox.com/en-us/api-reference/class/TextChatMessageProperties","TextChatService":"https://developer.roblox.com/en-us/api-reference/class/TextChatService","TextFilterResult":"https://developer.roblox.com/en-us/api-reference/class/TextFilterResult","TextFilterTranslatedResult":"https://developer.roblox.com/en-us/api-reference/class/TextFilterTranslatedResult","TextService":"https://developer.roblox.com/en-us/api-reference/class/TextService","TextSource":"https://developer.roblox.com/en-us/api-reference/class/TextSource","TextureGenerationPartGroup":"https://developer.roblox.com/en-us/api-reference/class/TextureGenerationPartGroup","TextureGenerationService":"https://developer.roblox.com/en-us/api-reference/class/TextureGenerationService","TextureGenerationUnwrappingRequest":"https://developer.roblox.com/en-us/api-reference/class/TextureGenerationUnwrappingRequest","ThirdPartyUserService":"https://developer.roblox.com/en-us/api-reference/class/ThirdPartyUserService","ThreadState":"https://developer.roblox.com/en-us/api-reference/class/ThreadState","TimerService":"https://developer.roblox.com/en-us/api-reference/class/TimerService","ToastNotificationService":"https://developer.roblox.com/en-us/api-reference/class/ToastNotificationService","TouchInputService":"https://developer.roblox.com/en-us/api-reference/class/TouchInputService","TouchTransmitter":"https://developer.roblox.com/en-us/api-reference/class/TouchTransmitter","TracerService":"https://developer.roblox.com/en-us/api-reference/class/TracerService","TrackerLodController":"https://developer.roblox.com/en-us/api-reference/class/TrackerLodController","TrackerStreamAnimation":"https://developer.roblox.com/en-us/api-reference/class/TrackerStreamAnimation","Trail":"https://developer.roblox.com/en-us/api-reference/class/Trail","Translator":"https://developer.roblox.com/en-us/api-reference/class/Translator","TutorialService":"https://developer.roblox.com/en-us/api-reference/class/TutorialService","TweenBase":"https://developer.roblox.com/en-us/api-reference/class/TweenBase","Tween":"https://developer.roblox.com/en-us/api-reference/class/Tween","TweenService":"https://developer.roblox.com/en-us/api-reference/class/TweenService","UGCAvatarService":"https://developer.roblox.com/en-us/api-reference/class/UGCAvatarService","UGCValidationService":"https://developer.roblox.com/en-us/api-reference/class/UGCValidationService","UIBase":"https://developer.roblox.com/en-us/api-reference/class/UIBase","UIComponent":"https://developer.roblox.com/en-us/api-reference/class/UIComponent","UIConstraint":"https://developer.roblox.com/en-us/api-reference/class/UIConstraint","UIAspectRatioConstraint":"https://developer.roblox.com/en-us/api-reference/class/UIAspectRatioConstraint","UISizeConstraint":"https://developer.roblox.com/en-us/api-reference/class/UISizeConstraint","UITextSizeConstraint":"https://developer.roblox.com/en-us/api-reference/class/UITextSizeConstraint","UICorner":"https://developer.roblox.com/en-us/api-reference/class/UICorner","UIFlexItem":"https://developer.roblox.com/en-us/api-reference/class/UIFlexItem","UIGradient":"https://developer.roblox.com/en-us/api-reference/class/UIGradient","UILayout":"https://developer.roblox.com/en-us/api-reference/class/UILayout","UIGridStyleLayout":"https://developer.roblox.com/en-us/api-reference/class/UIGridStyleLayout","UIGridLayout":"https://developer.roblox.com/en-us/api-reference/class/UIGridLayout","UIListLayout":"https://developer.roblox.com/en-us/api-reference/class/UIListLayout","UIPageLayout":"https://developer.roblox.com/en-us/api-reference/class/UIPageLayout","UITableLayout":"https://developer.roblox.com/en-us/api-reference/class/UITableLayout","UIPadding":"https://developer.roblox.com/en-us/api-reference/class/UIPadding","UIScale":"https://developer.roblox.com/en-us/api-reference/class/UIScale","UIStroke":"https://developer.roblox.com/en-us/api-reference/class/UIStroke","UnvalidatedAssetService":"https://developer.roblox.com/en-us/api-reference/class/UnvalidatedAssetService","UserGameSettings":"https://developer.roblox.com/en-us/api-reference/class/UserGameSettings","UserInputService":"https://developer.roblox.com/en-us/api-reference/class/UserInputService","UserService":"https://developer.roblox.com/en-us/api-reference/class/UserService","VRService":"https://developer.roblox.com/en-us/api-reference/class/VRService","VRStatusService":"https://developer.roblox.com/en-us/api-reference/class/VRStatusService","ValueBase":"https://developer.roblox.com/en-us/api-reference/class/ValueBase","BinaryStringValue":"https://developer.roblox.com/en-us/api-reference/class/BinaryStringValue","BoolValue":"https://developer.roblox.com/en-us/api-reference/class/BoolValue","BrickColorValue":"https://developer.roblox.com/en-us/api-reference/class/BrickColorValue","CFrameValue":"https://developer.roblox.com/en-us/api-reference/class/CFrameValue","Color3Value":"https://developer.roblox.com/en-us/api-reference/class/Color3Value","DoubleConstrainedValue":"https://developer.roblox.com/en-us/api-reference/class/DoubleConstrainedValue","IntConstrainedValue":"https://developer.roblox.com/en-us/api-reference/class/IntConstrainedValue","IntValue":"https://developer.roblox.com/en-us/api-reference/class/IntValue","NumberValue":"https://developer.roblox.com/en-us/api-reference/class/NumberValue","ObjectValue":"https://developer.roblox.com/en-us/api-reference/class/ObjectValue","RayValue":"https://developer.roblox.com/en-us/api-reference/class/RayValue","StringValue":"https://developer.roblox.com/en-us/api-reference/class/StringValue","Vector3Value":"https://developer.roblox.com/en-us/api-reference/class/Vector3Value","Vector3Curve":"https://developer.roblox.com/en-us/api-reference/class/Vector3Curve","VersionControlService":"https://developer.roblox.com/en-us/api-reference/class/VersionControlService","VideoCaptureService":"https://developer.roblox.com/en-us/api-reference/class/VideoCaptureService","VideoDeviceInput":"https://developer.roblox.com/en-us/api-reference/class/VideoDeviceInput","VideoService":"https://developer.roblox.com/en-us/api-reference/class/VideoService","VirtualInputManager":"https://developer.roblox.com/en-us/api-reference/class/VirtualInputManager","VirtualUser":"https://developer.roblox.com/en-us/api-reference/class/VirtualUser","VisibilityCheckDispatcher":"https://developer.roblox.com/en-us/api-reference/class/VisibilityCheckDispatcher","Visit":"https://developer.roblox.com/en-us/api-reference/class/Visit","VisualizationMode":"https://developer.roblox.com/en-us/api-reference/class/VisualizationMode","VisualizationModeCategory":"https://developer.roblox.com/en-us/api-reference/class/VisualizationModeCategory","VisualizationModeService":"https://developer.roblox.com/en-us/api-reference/class/VisualizationModeService","VoiceChatInternal":"https://developer.roblox.com/en-us/api-reference/class/VoiceChatInternal","VoiceChatService":"https://developer.roblox.com/en-us/api-reference/class/VoiceChatService","WeldConstraint":"https://developer.roblox.com/en-us/api-reference/class/WeldConstraint","Wire":"https://developer.roblox.com/en-us/api-reference/class/Wire","AccessModifierType":"https://developer.roblox.com/en-us/api-reference/enum/AccessModifierType","AccessoryType":"https://developer.roblox.com/en-us/api-reference/enum/AccessoryType","ActionType":"https://developer.roblox.com/en-us/api-reference/enum/ActionType","ActuatorRelativeTo":"https://developer.roblox.com/en-us/api-reference/enum/ActuatorRelativeTo","ActuatorType":"https://developer.roblox.com/en-us/api-reference/enum/ActuatorType","AdEventType":"https://developer.roblox.com/en-us/api-reference/enum/AdEventType","AdShape":"https://developer.roblox.com/en-us/api-reference/enum/AdShape","AdTeleportMethod":"https://developer.roblox.com/en-us/api-reference/enum/AdTeleportMethod","AdUnitStatus":"https://developer.roblox.com/en-us/api-reference/enum/AdUnitStatus","AdornCullingMode":"https://developer.roblox.com/en-us/api-reference/enum/AdornCullingMode","AlignType":"https://developer.roblox.com/en-us/api-reference/enum/AlignType","AlphaMode":"https://developer.roblox.com/en-us/api-reference/enum/AlphaMode","AnalyticsCustomFieldKeys":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsCustomFieldKeys","AnalyticsEconomyAction":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsEconomyAction","AnalyticsEconomyFlowType":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsEconomyFlowType","AnalyticsEconomyTransactionType":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsEconomyTransactionType","AnalyticsLogLevel":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsLogLevel","AnalyticsProgressionStatus":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsProgressionStatus","AnalyticsProgressionType":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsProgressionType","AnimationClipFromVideoStatus":"https://developer.roblox.com/en-us/api-reference/enum/AnimationClipFromVideoStatus","AnimationPriority":"https://developer.roblox.com/en-us/api-reference/enum/AnimationPriority","AnimatorRetargetingMode":"https://developer.roblox.com/en-us/api-reference/enum/AnimatorRetargetingMode","AppShellActionType":"https://developer.roblox.com/en-us/api-reference/enum/AppShellActionType","AppShellFeature":"https://developer.roblox.com/en-us/api-reference/enum/AppShellFeature","AppUpdateStatus":"https://developer.roblox.com/en-us/api-reference/enum/AppUpdateStatus","ApplyStrokeMode":"https://developer.roblox.com/en-us/api-reference/enum/ApplyStrokeMode","AspectType":"https://developer.roblox.com/en-us/api-reference/enum/AspectType","AssetCreatorType":"https://developer.roblox.com/en-us/api-reference/enum/AssetCreatorType","AssetFetchStatus":"https://developer.roblox.com/en-us/api-reference/enum/AssetFetchStatus","AssetType":"https://developer.roblox.com/en-us/api-reference/enum/AssetType","AssetTypeVerification":"https://developer.roblox.com/en-us/api-reference/enum/AssetTypeVerification","AudioApiRollout":"https://developer.roblox.com/en-us/api-reference/enum/AudioApiRollout","AudioSubType":"https://developer.roblox.com/en-us/api-reference/enum/AudioSubType","AudioWindowSize":"https://developer.roblox.com/en-us/api-reference/enum/AudioWindowSize","AutoIndentRule":"https://developer.roblox.com/en-us/api-reference/enum/AutoIndentRule","AutomaticSize":"https://developer.roblox.com/en-us/api-reference/enum/AutomaticSize","AvatarAssetType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarAssetType","AvatarChatServiceFeature":"https://developer.roblox.com/en-us/api-reference/enum/AvatarChatServiceFeature","AvatarContextMenuOption":"https://developer.roblox.com/en-us/api-reference/enum/AvatarContextMenuOption","AvatarGenerationError":"https://developer.roblox.com/en-us/api-reference/enum/AvatarGenerationError","AvatarGenerationJobStatus":"https://developer.roblox.com/en-us/api-reference/enum/AvatarGenerationJobStatus","AvatarItemType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarItemType","AvatarJointUpgrade":"https://developer.roblox.com/en-us/api-reference/enum/AvatarJointUpgrade","AvatarPromptResult":"https://developer.roblox.com/en-us/api-reference/enum/AvatarPromptResult","AvatarThumbnailCustomizationType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarThumbnailCustomizationType","AvatarUnificationMode":"https://developer.roblox.com/en-us/api-reference/enum/AvatarUnificationMode","Axis":"https://developer.roblox.com/en-us/api-reference/enum/Axis","BinType":"https://developer.roblox.com/en-us/api-reference/enum/BinType","BodyPart":"https://developer.roblox.com/en-us/api-reference/enum/BodyPart","BodyPartR15":"https://developer.roblox.com/en-us/api-reference/enum/BodyPartR15","BorderMode":"https://developer.roblox.com/en-us/api-reference/enum/BorderMode","BreakReason":"https://developer.roblox.com/en-us/api-reference/enum/BreakReason","BreakpointRemoveReason":"https://developer.roblox.com/en-us/api-reference/enum/BreakpointRemoveReason","BulkMoveMode":"https://developer.roblox.com/en-us/api-reference/enum/BulkMoveMode","BundleType":"https://developer.roblox.com/en-us/api-reference/enum/BundleType","Button":"https://developer.roblox.com/en-us/api-reference/enum/Button","ButtonStyle":"https://developer.roblox.com/en-us/api-reference/enum/ButtonStyle","CSGAsyncDynamicCollision":"https://developer.roblox.com/en-us/api-reference/enum/CSGAsyncDynamicCollision","CageType":"https://developer.roblox.com/en-us/api-reference/enum/CageType","CameraMode":"https://developer.roblox.com/en-us/api-reference/enum/CameraMode","CameraPanMode":"https://developer.roblox.com/en-us/api-reference/enum/CameraPanMode","CameraSpeedAdjustBinding":"https://developer.roblox.com/en-us/api-reference/enum/CameraSpeedAdjustBinding","CameraType":"https://developer.roblox.com/en-us/api-reference/enum/CameraType","CatalogCategoryFilter":"https://developer.roblox.com/en-us/api-reference/enum/CatalogCategoryFilter","CatalogSortAggregation":"https://developer.roblox.com/en-us/api-reference/enum/CatalogSortAggregation","CatalogSortType":"https://developer.roblox.com/en-us/api-reference/enum/CatalogSortType","CellBlock":"https://developer.roblox.com/en-us/api-reference/enum/CellBlock","CellMaterial":"https://developer.roblox.com/en-us/api-reference/enum/CellMaterial","CellOrientation":"https://developer.roblox.com/en-us/api-reference/enum/CellOrientation","CenterDialogType":"https://developer.roblox.com/en-us/api-reference/enum/CenterDialogType","CharacterControlMode":"https://developer.roblox.com/en-us/api-reference/enum/CharacterControlMode","ChatCallbackType":"https://developer.roblox.com/en-us/api-reference/enum/ChatCallbackType","ChatColor":"https://developer.roblox.com/en-us/api-reference/enum/ChatColor","ChatMode":"https://developer.roblox.com/en-us/api-reference/enum/ChatMode","ChatPrivacyMode":"https://developer.roblox.com/en-us/api-reference/enum/ChatPrivacyMode","ChatStyle":"https://developer.roblox.com/en-us/api-reference/enum/ChatStyle","ChatVersion":"https://developer.roblox.com/en-us/api-reference/enum/ChatVersion","ClientAnimatorThrottlingMode":"https://developer.roblox.com/en-us/api-reference/enum/ClientAnimatorThrottlingMode","CollaboratorStatus":"https://developer.roblox.com/en-us/api-reference/enum/CollaboratorStatus","CollisionFidelity":"https://developer.roblox.com/en-us/api-reference/enum/CollisionFidelity","CommandPermission":"https://developer.roblox.com/en-us/api-reference/enum/CommandPermission","CompileTarget":"https://developer.roblox.com/en-us/api-reference/enum/CompileTarget","CompletionItemKind":"https://developer.roblox.com/en-us/api-reference/enum/CompletionItemKind","CompletionItemTag":"https://developer.roblox.com/en-us/api-reference/enum/CompletionItemTag","CompletionTriggerKind":"https://developer.roblox.com/en-us/api-reference/enum/CompletionTriggerKind","ComputerCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/ComputerCameraMovementMode","ComputerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/ComputerMovementMode","ConnectionError":"https://developer.roblox.com/en-us/api-reference/enum/ConnectionError","ConnectionState":"https://developer.roblox.com/en-us/api-reference/enum/ConnectionState","ContextActionPriority":"https://developer.roblox.com/en-us/api-reference/enum/ContextActionPriority","ContextActionResult":"https://developer.roblox.com/en-us/api-reference/enum/ContextActionResult","ControlMode":"https://developer.roblox.com/en-us/api-reference/enum/ControlMode","CoreGuiType":"https://developer.roblox.com/en-us/api-reference/enum/CoreGuiType","CreateOutfitFailure":"https://developer.roblox.com/en-us/api-reference/enum/CreateOutfitFailure","CreatorType":"https://developer.roblox.com/en-us/api-reference/enum/CreatorType","CreatorTypeFilter":"https://developer.roblox.com/en-us/api-reference/enum/CreatorTypeFilter","CurrencyType":"https://developer.roblox.com/en-us/api-reference/enum/CurrencyType","CustomCameraMode":"https://developer.roblox.com/en-us/api-reference/enum/CustomCameraMode","DataStoreRequestType":"https://developer.roblox.com/en-us/api-reference/enum/DataStoreRequestType","DebuggerEndReason":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerEndReason","DebuggerExceptionBreakMode":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerExceptionBreakMode","DebuggerFrameType":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerFrameType","DebuggerPauseReason":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerPauseReason","DebuggerStatus":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerStatus","DecreaseMinimumPartDensityMode":"https://developer.roblox.com/en-us/api-reference/enum/DecreaseMinimumPartDensityMode","DevCameraOcclusionMode":"https://developer.roblox.com/en-us/api-reference/enum/DevCameraOcclusionMode","DevComputerCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevComputerCameraMovementMode","DevComputerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevComputerMovementMode","DevTouchCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevTouchCameraMovementMode","DevTouchMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevTouchMovementMode","DeveloperMemoryTag":"https://developer.roblox.com/en-us/api-reference/enum/DeveloperMemoryTag","DeviceFeatureType":"https://developer.roblox.com/en-us/api-reference/enum/DeviceFeatureType","DeviceType":"https://developer.roblox.com/en-us/api-reference/enum/DeviceType","DialogBehaviorType":"https://developer.roblox.com/en-us/api-reference/enum/DialogBehaviorType","DialogPurpose":"https://developer.roblox.com/en-us/api-reference/enum/DialogPurpose","DialogTone":"https://developer.roblox.com/en-us/api-reference/enum/DialogTone","DominantAxis":"https://developer.roblox.com/en-us/api-reference/enum/DominantAxis","DraftStatusCode":"https://developer.roblox.com/en-us/api-reference/enum/DraftStatusCode","DragDetectorDragStyle":"https://developer.roblox.com/en-us/api-reference/enum/DragDetectorDragStyle","DragDetectorPermissionPolicy":"https://developer.roblox.com/en-us/api-reference/enum/DragDetectorPermissionPolicy","DragDetectorResponseStyle":"https://developer.roblox.com/en-us/api-reference/enum/DragDetectorResponseStyle","DraggerCoordinateSpace":"https://developer.roblox.com/en-us/api-reference/enum/DraggerCoordinateSpace","DraggerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DraggerMovementMode","EasingDirection":"https://developer.roblox.com/en-us/api-reference/enum/EasingDirection","EasingStyle":"https://developer.roblox.com/en-us/api-reference/enum/EasingStyle","EditorLiveScripting":"https://developer.roblox.com/en-us/api-reference/enum/EditorLiveScripting","ElasticBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ElasticBehavior","EnviromentalPhysicsThrottle":"https://developer.roblox.com/en-us/api-reference/enum/EnviromentalPhysicsThrottle","ExperienceAuthScope":"https://developer.roblox.com/en-us/api-reference/enum/ExperienceAuthScope","ExplosionType":"https://developer.roblox.com/en-us/api-reference/enum/ExplosionType","FACSDataLod":"https://developer.roblox.com/en-us/api-reference/enum/FACSDataLod","FacialAnimationStreamingState":"https://developer.roblox.com/en-us/api-reference/enum/FacialAnimationStreamingState","FieldOfViewMode":"https://developer.roblox.com/en-us/api-reference/enum/FieldOfViewMode","FillDirection":"https://developer.roblox.com/en-us/api-reference/enum/FillDirection","FilterResult":"https://developer.roblox.com/en-us/api-reference/enum/FilterResult","FinishRecordingOperation":"https://developer.roblox.com/en-us/api-reference/enum/FinishRecordingOperation","FluidFidelity":"https://developer.roblox.com/en-us/api-reference/enum/FluidFidelity","FluidForces":"https://developer.roblox.com/en-us/api-reference/enum/FluidForces","Font":"https://developer.roblox.com/en-us/api-reference/enum/Font","FontSize":"https://developer.roblox.com/en-us/api-reference/enum/FontSize","FontStyle":"https://developer.roblox.com/en-us/api-reference/enum/FontStyle","FontWeight":"https://developer.roblox.com/en-us/api-reference/enum/FontWeight","ForceLimitMode":"https://developer.roblox.com/en-us/api-reference/enum/ForceLimitMode","FormFactor":"https://developer.roblox.com/en-us/api-reference/enum/FormFactor","FrameStyle":"https://developer.roblox.com/en-us/api-reference/enum/FrameStyle","FramerateManagerMode":"https://developer.roblox.com/en-us/api-reference/enum/FramerateManagerMode","FriendRequestEvent":"https://developer.roblox.com/en-us/api-reference/enum/FriendRequestEvent","FriendStatus":"https://developer.roblox.com/en-us/api-reference/enum/FriendStatus","FunctionalTestResult":"https://developer.roblox.com/en-us/api-reference/enum/FunctionalTestResult","GameAvatarType":"https://developer.roblox.com/en-us/api-reference/enum/GameAvatarType","GamepadType":"https://developer.roblox.com/en-us/api-reference/enum/GamepadType","GearGenreSetting":"https://developer.roblox.com/en-us/api-reference/enum/GearGenreSetting","GearType":"https://developer.roblox.com/en-us/api-reference/enum/GearType","Genre":"https://developer.roblox.com/en-us/api-reference/enum/Genre","GraphicsMode":"https://developer.roblox.com/en-us/api-reference/enum/GraphicsMode","GuiState":"https://developer.roblox.com/en-us/api-reference/enum/GuiState","GuiType":"https://developer.roblox.com/en-us/api-reference/enum/GuiType","HandlesStyle":"https://developer.roblox.com/en-us/api-reference/enum/HandlesStyle","HighlightDepthMode":"https://developer.roblox.com/en-us/api-reference/enum/HighlightDepthMode","HorizontalAlignment":"https://developer.roblox.com/en-us/api-reference/enum/HorizontalAlignment","HoverAnimateSpeed":"https://developer.roblox.com/en-us/api-reference/enum/HoverAnimateSpeed","HttpCachePolicy":"https://developer.roblox.com/en-us/api-reference/enum/HttpCachePolicy","HttpCompression":"https://developer.roblox.com/en-us/api-reference/enum/HttpCompression","HttpContentType":"https://developer.roblox.com/en-us/api-reference/enum/HttpContentType","HttpError":"https://developer.roblox.com/en-us/api-reference/enum/HttpError","HttpRequestType":"https://developer.roblox.com/en-us/api-reference/enum/HttpRequestType","HumanoidCollisionType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidCollisionType","HumanoidDisplayDistanceType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidDisplayDistanceType","HumanoidHealthDisplayType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidHealthDisplayType","HumanoidRigType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidRigType","HumanoidStateType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidStateType","IKCollisionsMode":"https://developer.roblox.com/en-us/api-reference/enum/IKCollisionsMode","IKControlConstraintSupport":"https://developer.roblox.com/en-us/api-reference/enum/IKControlConstraintSupport","IKControlType":"https://developer.roblox.com/en-us/api-reference/enum/IKControlType","IXPLoadingStatus":"https://developer.roblox.com/en-us/api-reference/enum/IXPLoadingStatus","ImageAlphaType":"https://developer.roblox.com/en-us/api-reference/enum/ImageAlphaType","ImageCombineType":"https://developer.roblox.com/en-us/api-reference/enum/ImageCombineType","InOut":"https://developer.roblox.com/en-us/api-reference/enum/InOut","InfoType":"https://developer.roblox.com/en-us/api-reference/enum/InfoType","InitialDockState":"https://developer.roblox.com/en-us/api-reference/enum/InitialDockState","InputType":"https://developer.roblox.com/en-us/api-reference/enum/InputType","InterpolationThrottlingMode":"https://developer.roblox.com/en-us/api-reference/enum/InterpolationThrottlingMode","InviteState":"https://developer.roblox.com/en-us/api-reference/enum/InviteState","ItemLineAlignment":"https://developer.roblox.com/en-us/api-reference/enum/ItemLineAlignment","JointCreationMode":"https://developer.roblox.com/en-us/api-reference/enum/JointCreationMode","KeyCode":"https://developer.roblox.com/en-us/api-reference/enum/KeyCode","KeyInterpolationMode":"https://developer.roblox.com/en-us/api-reference/enum/KeyInterpolationMode","KeywordFilterType":"https://developer.roblox.com/en-us/api-reference/enum/KeywordFilterType","Language":"https://developer.roblox.com/en-us/api-reference/enum/Language","LeftRight":"https://developer.roblox.com/en-us/api-reference/enum/LeftRight","Limb":"https://developer.roblox.com/en-us/api-reference/enum/Limb","LineJoinMode":"https://developer.roblox.com/en-us/api-reference/enum/LineJoinMode","ListDisplayMode":"https://developer.roblox.com/en-us/api-reference/enum/ListDisplayMode","ListenerType":"https://developer.roblox.com/en-us/api-reference/enum/ListenerType","LiveEditingAtomicUpdateResponse":"https://developer.roblox.com/en-us/api-reference/enum/LiveEditingAtomicUpdateResponse","LiveEditingBroadcastMessageType":"https://developer.roblox.com/en-us/api-reference/enum/LiveEditingBroadcastMessageType","LoadCharacterLayeredClothing":"https://developer.roblox.com/en-us/api-reference/enum/LoadCharacterLayeredClothing","LoadDynamicHeads":"https://developer.roblox.com/en-us/api-reference/enum/LoadDynamicHeads","MarkupKind":"https://developer.roblox.com/en-us/api-reference/enum/MarkupKind","Material":"https://developer.roblox.com/en-us/api-reference/enum/Material","MaterialPattern":"https://developer.roblox.com/en-us/api-reference/enum/MaterialPattern","MembershipType":"https://developer.roblox.com/en-us/api-reference/enum/MembershipType","MeshPartDetailLevel":"https://developer.roblox.com/en-us/api-reference/enum/MeshPartDetailLevel","MeshPartHeadsAndAccessories":"https://developer.roblox.com/en-us/api-reference/enum/MeshPartHeadsAndAccessories","MeshScaleUnit":"https://developer.roblox.com/en-us/api-reference/enum/MeshScaleUnit","MeshType":"https://developer.roblox.com/en-us/api-reference/enum/MeshType","MessageType":"https://developer.roblox.com/en-us/api-reference/enum/MessageType","ModelLevelOfDetail":"https://developer.roblox.com/en-us/api-reference/enum/ModelLevelOfDetail","ModelStreamingBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ModelStreamingBehavior","ModelStreamingMode":"https://developer.roblox.com/en-us/api-reference/enum/ModelStreamingMode","ModerationStatus":"https://developer.roblox.com/en-us/api-reference/enum/ModerationStatus","ModifierKey":"https://developer.roblox.com/en-us/api-reference/enum/ModifierKey","MouseBehavior":"https://developer.roblox.com/en-us/api-reference/enum/MouseBehavior","MoveState":"https://developer.roblox.com/en-us/api-reference/enum/MoveState","MuteState":"https://developer.roblox.com/en-us/api-reference/enum/MuteState","NameOcclusion":"https://developer.roblox.com/en-us/api-reference/enum/NameOcclusion","NetworkOwnership":"https://developer.roblox.com/en-us/api-reference/enum/NetworkOwnership","NetworkStatus":"https://developer.roblox.com/en-us/api-reference/enum/NetworkStatus","NoiseType":"https://developer.roblox.com/en-us/api-reference/enum/NoiseType","NormalId":"https://developer.roblox.com/en-us/api-reference/enum/NormalId","OperationType":"https://developer.roblox.com/en-us/api-reference/enum/OperationType","OrientationAlignmentMode":"https://developer.roblox.com/en-us/api-reference/enum/OrientationAlignmentMode","OutfitSource":"https://developer.roblox.com/en-us/api-reference/enum/OutfitSource","OutfitType":"https://developer.roblox.com/en-us/api-reference/enum/OutfitType","OutputLayoutMode":"https://developer.roblox.com/en-us/api-reference/enum/OutputLayoutMode","OverrideMouseIconBehavior":"https://developer.roblox.com/en-us/api-reference/enum/OverrideMouseIconBehavior","PackagePermission":"https://developer.roblox.com/en-us/api-reference/enum/PackagePermission","PartType":"https://developer.roblox.com/en-us/api-reference/enum/PartType","ParticleEmitterShape":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShape","ParticleEmitterShapeInOut":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShapeInOut","ParticleEmitterShapeStyle":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShapeStyle","ParticleFlipbookLayout":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookLayout","ParticleFlipbookMode":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookMode","ParticleFlipbookTextureCompatible":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookTextureCompatible","ParticleOrientation":"https://developer.roblox.com/en-us/api-reference/enum/ParticleOrientation","PathStatus":"https://developer.roblox.com/en-us/api-reference/enum/PathStatus","PathWaypointAction":"https://developer.roblox.com/en-us/api-reference/enum/PathWaypointAction","PermissionLevelShown":"https://developer.roblox.com/en-us/api-reference/enum/PermissionLevelShown","PhysicsSimulationRate":"https://developer.roblox.com/en-us/api-reference/enum/PhysicsSimulationRate","PhysicsSteppingMethod":"https://developer.roblox.com/en-us/api-reference/enum/PhysicsSteppingMethod","PlaybackState":"https://developer.roblox.com/en-us/api-reference/enum/PlaybackState","PlayerActions":"https://developer.roblox.com/en-us/api-reference/enum/PlayerActions","PlayerCharacterDestroyBehavior":"https://developer.roblox.com/en-us/api-reference/enum/PlayerCharacterDestroyBehavior","PlayerChatType":"https://developer.roblox.com/en-us/api-reference/enum/PlayerChatType","PoseEasingDirection":"https://developer.roblox.com/en-us/api-reference/enum/PoseEasingDirection","PoseEasingStyle":"https://developer.roblox.com/en-us/api-reference/enum/PoseEasingStyle","PositionAlignmentMode":"https://developer.roblox.com/en-us/api-reference/enum/PositionAlignmentMode","PrimalPhysicsSolver":"https://developer.roblox.com/en-us/api-reference/enum/PrimalPhysicsSolver","PrimitiveType":"https://developer.roblox.com/en-us/api-reference/enum/PrimitiveType","PrivilegeType":"https://developer.roblox.com/en-us/api-reference/enum/PrivilegeType","ProductLocationRestriction":"https://developer.roblox.com/en-us/api-reference/enum/ProductLocationRestriction","ProductPurchaseDecision":"https://developer.roblox.com/en-us/api-reference/enum/ProductPurchaseDecision","PromptCreateAssetResult":"https://developer.roblox.com/en-us/api-reference/enum/PromptCreateAssetResult","PromptCreateAvatarResult":"https://developer.roblox.com/en-us/api-reference/enum/PromptCreateAvatarResult","PromptPublishAssetResult":"https://developer.roblox.com/en-us/api-reference/enum/PromptPublishAssetResult","PropertyStatus":"https://developer.roblox.com/en-us/api-reference/enum/PropertyStatus","ProximityPromptExclusivity":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptExclusivity","ProximityPromptInputType":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptInputType","ProximityPromptStyle":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptStyle","QualityLevel":"https://developer.roblox.com/en-us/api-reference/enum/QualityLevel","R15CollisionType":"https://developer.roblox.com/en-us/api-reference/enum/R15CollisionType","RaycastFilterType":"https://developer.roblox.com/en-us/api-reference/enum/RaycastFilterType","RejectCharacterDeletions":"https://developer.roblox.com/en-us/api-reference/enum/RejectCharacterDeletions","RenderFidelity":"https://developer.roblox.com/en-us/api-reference/enum/RenderFidelity","RenderPriority":"https://developer.roblox.com/en-us/api-reference/enum/RenderPriority","RenderingCacheOptimizationMode":"https://developer.roblox.com/en-us/api-reference/enum/RenderingCacheOptimizationMode","RenderingTestComparisonMethod":"https://developer.roblox.com/en-us/api-reference/enum/RenderingTestComparisonMethod","ReplicateInstanceDestroySetting":"https://developer.roblox.com/en-us/api-reference/enum/ReplicateInstanceDestroySetting","ResamplerMode":"https://developer.roblox.com/en-us/api-reference/enum/ResamplerMode","ReservedHighlightId":"https://developer.roblox.com/en-us/api-reference/enum/ReservedHighlightId","RestPose":"https://developer.roblox.com/en-us/api-reference/enum/RestPose","ReturnKeyType":"https://developer.roblox.com/en-us/api-reference/enum/ReturnKeyType","ReverbType":"https://developer.roblox.com/en-us/api-reference/enum/ReverbType","RibbonTool":"https://developer.roblox.com/en-us/api-reference/enum/RibbonTool","RigScale":"https://developer.roblox.com/en-us/api-reference/enum/RigScale","RigType":"https://developer.roblox.com/en-us/api-reference/enum/RigType","RollOffMode":"https://developer.roblox.com/en-us/api-reference/enum/RollOffMode","RotationOrder":"https://developer.roblox.com/en-us/api-reference/enum/RotationOrder","RotationType":"https://developer.roblox.com/en-us/api-reference/enum/RotationType","RtlTextSupport":"https://developer.roblox.com/en-us/api-reference/enum/RtlTextSupport","RunContext":"https://developer.roblox.com/en-us/api-reference/enum/RunContext","RunState":"https://developer.roblox.com/en-us/api-reference/enum/RunState","RuntimeUndoBehavior":"https://developer.roblox.com/en-us/api-reference/enum/RuntimeUndoBehavior","SafeAreaCompatibility":"https://developer.roblox.com/en-us/api-reference/enum/SafeAreaCompatibility","SalesTypeFilter":"https://developer.roblox.com/en-us/api-reference/enum/SalesTypeFilter","SaveAvatarThumbnailCustomizationFailure":"https://developer.roblox.com/en-us/api-reference/enum/SaveAvatarThumbnailCustomizationFailure","SaveFilter":"https://developer.roblox.com/en-us/api-reference/enum/SaveFilter","SavedQualitySetting":"https://developer.roblox.com/en-us/api-reference/enum/SavedQualitySetting","ScaleType":"https://developer.roblox.com/en-us/api-reference/enum/ScaleType","ScopeCheckResult":"https://developer.roblox.com/en-us/api-reference/enum/ScopeCheckResult","ScreenInsets":"https://developer.roblox.com/en-us/api-reference/enum/ScreenInsets","ScreenOrientation":"https://developer.roblox.com/en-us/api-reference/enum/ScreenOrientation","ScrollBarInset":"https://developer.roblox.com/en-us/api-reference/enum/ScrollBarInset","ScrollingDirection":"https://developer.roblox.com/en-us/api-reference/enum/ScrollingDirection","SelectionBehavior":"https://developer.roblox.com/en-us/api-reference/enum/SelectionBehavior","SelectionRenderMode":"https://developer.roblox.com/en-us/api-reference/enum/SelectionRenderMode","SelfViewPosition":"https://developer.roblox.com/en-us/api-reference/enum/SelfViewPosition","SensorMode":"https://developer.roblox.com/en-us/api-reference/enum/SensorMode","SensorUpdateType":"https://developer.roblox.com/en-us/api-reference/enum/SensorUpdateType","ServerAudioBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ServerAudioBehavior","ServerLiveEditingMode":"https://developer.roblox.com/en-us/api-reference/enum/ServerLiveEditingMode","ServiceVisibility":"https://developer.roblox.com/en-us/api-reference/enum/ServiceVisibility","Severity":"https://developer.roblox.com/en-us/api-reference/enum/Severity","SignalBehavior":"https://developer.roblox.com/en-us/api-reference/enum/SignalBehavior","SizeConstraint":"https://developer.roblox.com/en-us/api-reference/enum/SizeConstraint","SolverConvergenceMetricType":"https://developer.roblox.com/en-us/api-reference/enum/SolverConvergenceMetricType","SolverConvergenceVisualizationMode":"https://developer.roblox.com/en-us/api-reference/enum/SolverConvergenceVisualizationMode","SortDirection":"https://developer.roblox.com/en-us/api-reference/enum/SortDirection","SortOrder":"https://developer.roblox.com/en-us/api-reference/enum/SortOrder","SpecialKey":"https://developer.roblox.com/en-us/api-reference/enum/SpecialKey","StartCorner":"https://developer.roblox.com/en-us/api-reference/enum/StartCorner","StreamOutBehavior":"https://developer.roblox.com/en-us/api-reference/enum/StreamOutBehavior","StreamingIntegrityMode":"https://developer.roblox.com/en-us/api-reference/enum/StreamingIntegrityMode","StreamingPauseMode":"https://developer.roblox.com/en-us/api-reference/enum/StreamingPauseMode","StudioCloseMode":"https://developer.roblox.com/en-us/api-reference/enum/StudioCloseMode","StudioDataModelType":"https://developer.roblox.com/en-us/api-reference/enum/StudioDataModelType","StudioPlaceUpdateFailureReason":"https://developer.roblox.com/en-us/api-reference/enum/StudioPlaceUpdateFailureReason","StudioScriptEditorColorCategories":"https://developer.roblox.com/en-us/api-reference/enum/StudioScriptEditorColorCategories","StudioScriptEditorColorPresets":"https://developer.roblox.com/en-us/api-reference/enum/StudioScriptEditorColorPresets","StudioStyleGuideColor":"https://developer.roblox.com/en-us/api-reference/enum/StudioStyleGuideColor","StudioStyleGuideModifier":"https://developer.roblox.com/en-us/api-reference/enum/StudioStyleGuideModifier","Style":"https://developer.roblox.com/en-us/api-reference/enum/Style","SubscriptionExpirationReason":"https://developer.roblox.com/en-us/api-reference/enum/SubscriptionExpirationReason","SubscriptionPaymentStatus":"https://developer.roblox.com/en-us/api-reference/enum/SubscriptionPaymentStatus","SubscriptionPeriod":"https://developer.roblox.com/en-us/api-reference/enum/SubscriptionPeriod","SubscriptionState":"https://developer.roblox.com/en-us/api-reference/enum/SubscriptionState","SurfaceConstraint":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceConstraint","SurfaceGuiShape":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceGuiShape","SurfaceGuiSizingMode":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceGuiSizingMode","SurfaceType":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceType","SwipeDirection":"https://developer.roblox.com/en-us/api-reference/enum/SwipeDirection","TableMajorAxis":"https://developer.roblox.com/en-us/api-reference/enum/TableMajorAxis","Technology":"https://developer.roblox.com/en-us/api-reference/enum/Technology","TeleportMethod":"https://developer.roblox.com/en-us/api-reference/enum/TeleportMethod","TeleportResult":"https://developer.roblox.com/en-us/api-reference/enum/TeleportResult","TeleportState":"https://developer.roblox.com/en-us/api-reference/enum/TeleportState","TeleportType":"https://developer.roblox.com/en-us/api-reference/enum/TeleportType","TerrainAcquisitionMethod":"https://developer.roblox.com/en-us/api-reference/enum/TerrainAcquisitionMethod","TerrainFace":"https://developer.roblox.com/en-us/api-reference/enum/TerrainFace","TextChatMessageStatus":"https://developer.roblox.com/en-us/api-reference/enum/TextChatMessageStatus","TextDirection":"https://developer.roblox.com/en-us/api-reference/enum/TextDirection","TextFilterContext":"https://developer.roblox.com/en-us/api-reference/enum/TextFilterContext","TextInputType":"https://developer.roblox.com/en-us/api-reference/enum/TextInputType","TextTruncate":"https://developer.roblox.com/en-us/api-reference/enum/TextTruncate","TextXAlignment":"https://developer.roblox.com/en-us/api-reference/enum/TextXAlignment","TextYAlignment":"https://developer.roblox.com/en-us/api-reference/enum/TextYAlignment","TextureMode":"https://developer.roblox.com/en-us/api-reference/enum/TextureMode","TextureQueryType":"https://developer.roblox.com/en-us/api-reference/enum/TextureQueryType","ThreadPoolConfig":"https://developer.roblox.com/en-us/api-reference/enum/ThreadPoolConfig","ThrottlingPriority":"https://developer.roblox.com/en-us/api-reference/enum/ThrottlingPriority","ThumbnailSize":"https://developer.roblox.com/en-us/api-reference/enum/ThumbnailSize","ThumbnailType":"https://developer.roblox.com/en-us/api-reference/enum/ThumbnailType","TickCountSampleMethod":"https://developer.roblox.com/en-us/api-reference/enum/TickCountSampleMethod","TopBottom":"https://developer.roblox.com/en-us/api-reference/enum/TopBottom","TouchCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/TouchCameraMovementMode","TouchMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/TouchMovementMode","TrackerError":"https://developer.roblox.com/en-us/api-reference/enum/TrackerError","TrackerExtrapolationFlagMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerExtrapolationFlagMode","TrackerFaceTrackingStatus":"https://developer.roblox.com/en-us/api-reference/enum/TrackerFaceTrackingStatus","TrackerLodFlagMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerLodFlagMode","TrackerLodValueMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerLodValueMode","TrackerMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerMode","TrackerPromptEvent":"https://developer.roblox.com/en-us/api-reference/enum/TrackerPromptEvent","TriStateBoolean":"https://developer.roblox.com/en-us/api-reference/enum/TriStateBoolean","TweenStatus":"https://developer.roblox.com/en-us/api-reference/enum/TweenStatus","UIFlexAlignment":"https://developer.roblox.com/en-us/api-reference/enum/UIFlexAlignment","UIFlexMode":"https://developer.roblox.com/en-us/api-reference/enum/UIFlexMode","UITheme":"https://developer.roblox.com/en-us/api-reference/enum/UITheme","UiMessageType":"https://developer.roblox.com/en-us/api-reference/enum/UiMessageType","UsageContext":"https://developer.roblox.com/en-us/api-reference/enum/UsageContext","UserCFrame":"https://developer.roblox.com/en-us/api-reference/enum/UserCFrame","UserInputState":"https://developer.roblox.com/en-us/api-reference/enum/UserInputState","UserInputType":"https://developer.roblox.com/en-us/api-reference/enum/UserInputType","VRComfortSetting":"https://developer.roblox.com/en-us/api-reference/enum/VRComfortSetting","VRSafetyBubbleMode":"https://developer.roblox.com/en-us/api-reference/enum/VRSafetyBubbleMode","VRScaling":"https://developer.roblox.com/en-us/api-reference/enum/VRScaling","VRSessionState":"https://developer.roblox.com/en-us/api-reference/enum/VRSessionState","VRTouchpad":"https://developer.roblox.com/en-us/api-reference/enum/VRTouchpad","VRTouchpadMode":"https://developer.roblox.com/en-us/api-reference/enum/VRTouchpadMode","VelocityConstraintMode":"https://developer.roblox.com/en-us/api-reference/enum/VelocityConstraintMode","VerticalAlignment":"https://developer.roblox.com/en-us/api-reference/enum/VerticalAlignment","VerticalScrollBarPosition":"https://developer.roblox.com/en-us/api-reference/enum/VerticalScrollBarPosition","VibrationMotor":"https://developer.roblox.com/en-us/api-reference/enum/VibrationMotor","VideoDeviceCaptureQuality":"https://developer.roblox.com/en-us/api-reference/enum/VideoDeviceCaptureQuality","VideoError":"https://developer.roblox.com/en-us/api-reference/enum/VideoError","ViewMode":"https://developer.roblox.com/en-us/api-reference/enum/ViewMode","VirtualCursorMode":"https://developer.roblox.com/en-us/api-reference/enum/VirtualCursorMode","VirtualInputMode":"https://developer.roblox.com/en-us/api-reference/enum/VirtualInputMode","VoiceChatState":"https://developer.roblox.com/en-us/api-reference/enum/VoiceChatState","VoiceControlPath":"https://developer.roblox.com/en-us/api-reference/enum/VoiceControlPath","VolumetricAudio":"https://developer.roblox.com/en-us/api-reference/enum/VolumetricAudio","WaterDirection":"https://developer.roblox.com/en-us/api-reference/enum/WaterDirection","WaterForce":"https://developer.roblox.com/en-us/api-reference/enum/WaterForce","WeldConstraintPreserve":"https://developer.roblox.com/en-us/api-reference/enum/WeldConstraintPreserve","WrapLayerAutoSkin":"https://developer.roblox.com/en-us/api-reference/enum/WrapLayerAutoSkin","WrapLayerDebugMode":"https://developer.roblox.com/en-us/api-reference/enum/WrapLayerDebugMode","WrapTargetDebugMode":"https://developer.roblox.com/en-us/api-reference/enum/WrapTargetDebugMode","ZIndexBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ZIndexBehavior","Axes":"https://developer.roblox.com/en-us/api-reference/datatype/Axes","BrickColor":"https://developer.roblox.com/en-us/api-reference/datatype/BrickColor","CFrame":"https://developer.roblox.com/en-us/api-reference/datatype/CFrame","Color3":"https://developer.roblox.com/en-us/api-reference/datatype/Color3","ColorSequence":"https://developer.roblox.com/en-us/api-reference/datatype/ColorSequence","ColorSequenceKeypoint":"https://developer.roblox.com/en-us/api-reference/datatype/ColorSequenceKeypoint","DockWidgetPluginGuiInfo":"https://developer.roblox.com/en-us/api-reference/datatype/DockWidgetPluginGuiInfo","Enum":"https://developer.roblox.com/en-us/api-reference/datatype/Enum","EnumItem":"https://developer.roblox.com/en-us/api-reference/datatype/EnumItem","Enums":"https://developer.roblox.com/en-us/api-reference/datatype/Enums","Faces":"https://developer.roblox.com/en-us/api-reference/datatype/Faces","NumberRange":"https://developer.roblox.com/en-us/api-reference/datatype/NumberRange","NumberSequence":"https://developer.roblox.com/en-us/api-reference/datatype/NumberSequence","NumberSequenceKeypoint":"https://developer.roblox.com/en-us/api-reference/datatype/NumberSequenceKeypoint","PathWaypoint":"https://developer.roblox.com/en-us/api-reference/datatype/PathWaypoint","PhysicalProperties":"https://developer.roblox.com/en-us/api-reference/datatype/PhysicalProperties","Random":"https://developer.roblox.com/en-us/api-reference/datatype/Random","Ray":"https://developer.roblox.com/en-us/api-reference/datatype/Ray","RBXScriptConnection":"https://developer.roblox.com/en-us/api-reference/datatype/RBXScriptConnection","RBXScriptSignal":"https://developer.roblox.com/en-us/api-reference/datatype/RBXScriptSignal","Rect":"https://developer.roblox.com/en-us/api-reference/datatype/Rect","Region3":"https://developer.roblox.com/en-us/api-reference/datatype/Region3","Region3int16":"https://developer.roblox.com/en-us/api-reference/datatype/Region3int16","TweenInfo":"https://developer.roblox.com/en-us/api-reference/datatype/TweenInfo","UDim":"https://developer.roblox.com/en-us/api-reference/datatype/UDim","UDim2":"https://developer.roblox.com/en-us/api-reference/datatype/UDim2","Vector2":"https://developer.roblox.com/en-us/api-reference/datatype/Vector2","Vector2int16":"https://developer.roblox.com/en-us/api-reference/datatype/Vector2int16","Vector3":"https://developer.roblox.com/en-us/api-reference/datatype/Vector3","Vector3int16":"https://developer.roblox.com/en-us/api-reference/datatype/Vector3int16","Array":"/sift/api/Array","Dictionary":"/sift/api/Dictionary","Set":"/sift/api/Set","Sift":"/sift/api/Sift","None":"/sift/api/Sift#None"}')}}]); \ No newline at end of file diff --git a/assets/js/b09b2928.89353fcc.js b/assets/js/b09b2928.89353fcc.js deleted file mode 100644 index e40f40f..0000000 --- a/assets/js/b09b2928.89353fcc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[677],{85492:e=>{e.exports=JSON.parse('{"Instance":"https://developer.roblox.com/en-us/api-reference/datatype/Instance","Accoutrement":"https://developer.roblox.com/en-us/api-reference/class/Accoutrement","Accessory":"https://developer.roblox.com/en-us/api-reference/class/Accessory","Hat":"https://developer.roblox.com/en-us/api-reference/class/Hat","AdPortal":"https://developer.roblox.com/en-us/api-reference/class/AdPortal","AdService":"https://developer.roblox.com/en-us/api-reference/class/AdService","AdvancedDragger":"https://developer.roblox.com/en-us/api-reference/class/AdvancedDragger","AnalyticsService":"https://developer.roblox.com/en-us/api-reference/class/AnalyticsService","Animation":"https://developer.roblox.com/en-us/api-reference/class/Animation","AnimationClip":"https://developer.roblox.com/en-us/api-reference/class/AnimationClip","CurveAnimation":"https://developer.roblox.com/en-us/api-reference/class/CurveAnimation","KeyframeSequence":"https://developer.roblox.com/en-us/api-reference/class/KeyframeSequence","AnimationClipProvider":"https://developer.roblox.com/en-us/api-reference/class/AnimationClipProvider","AnimationController":"https://developer.roblox.com/en-us/api-reference/class/AnimationController","AnimationFromVideoCreatorService":"https://developer.roblox.com/en-us/api-reference/class/AnimationFromVideoCreatorService","AnimationFromVideoCreatorStudioService":"https://developer.roblox.com/en-us/api-reference/class/AnimationFromVideoCreatorStudioService","AnimationRigData":"https://developer.roblox.com/en-us/api-reference/class/AnimationRigData","AnimationStreamTrack":"https://developer.roblox.com/en-us/api-reference/class/AnimationStreamTrack","AnimationTrack":"https://developer.roblox.com/en-us/api-reference/class/AnimationTrack","Animator":"https://developer.roblox.com/en-us/api-reference/class/Animator","AppUpdateService":"https://developer.roblox.com/en-us/api-reference/class/AppUpdateService","AssetCounterService":"https://developer.roblox.com/en-us/api-reference/class/AssetCounterService","AssetDeliveryProxy":"https://developer.roblox.com/en-us/api-reference/class/AssetDeliveryProxy","AssetImportService":"https://developer.roblox.com/en-us/api-reference/class/AssetImportService","AssetImportSession":"https://developer.roblox.com/en-us/api-reference/class/AssetImportSession","AssetManagerService":"https://developer.roblox.com/en-us/api-reference/class/AssetManagerService","AssetPatchSettings":"https://developer.roblox.com/en-us/api-reference/class/AssetPatchSettings","AssetService":"https://developer.roblox.com/en-us/api-reference/class/AssetService","Atmosphere":"https://developer.roblox.com/en-us/api-reference/class/Atmosphere","Attachment":"https://developer.roblox.com/en-us/api-reference/class/Attachment","Bone":"https://developer.roblox.com/en-us/api-reference/class/Bone","AudioAnalyzer":"https://developer.roblox.com/en-us/api-reference/class/AudioAnalyzer","AudioChorus":"https://developer.roblox.com/en-us/api-reference/class/AudioChorus","AudioCompressor":"https://developer.roblox.com/en-us/api-reference/class/AudioCompressor","AudioDeviceInput":"https://developer.roblox.com/en-us/api-reference/class/AudioDeviceInput","AudioDeviceOutput":"https://developer.roblox.com/en-us/api-reference/class/AudioDeviceOutput","AudioDistortion":"https://developer.roblox.com/en-us/api-reference/class/AudioDistortion","AudioEcho":"https://developer.roblox.com/en-us/api-reference/class/AudioEcho","AudioEmitter":"https://developer.roblox.com/en-us/api-reference/class/AudioEmitter","AudioEqualizer":"https://developer.roblox.com/en-us/api-reference/class/AudioEqualizer","AudioFader":"https://developer.roblox.com/en-us/api-reference/class/AudioFader","AudioFlanger":"https://developer.roblox.com/en-us/api-reference/class/AudioFlanger","AudioListener":"https://developer.roblox.com/en-us/api-reference/class/AudioListener","AudioPitchShifter":"https://developer.roblox.com/en-us/api-reference/class/AudioPitchShifter","AudioPlayer":"https://developer.roblox.com/en-us/api-reference/class/AudioPlayer","AudioReverb":"https://developer.roblox.com/en-us/api-reference/class/AudioReverb","AudioSearchParams":"https://developer.roblox.com/en-us/api-reference/class/AudioSearchParams","AvatarChatService":"https://developer.roblox.com/en-us/api-reference/class/AvatarChatService","AvatarEditorService":"https://developer.roblox.com/en-us/api-reference/class/AvatarEditorService","AvatarImportService":"https://developer.roblox.com/en-us/api-reference/class/AvatarImportService","Backpack":"https://developer.roblox.com/en-us/api-reference/class/Backpack","BadgeService":"https://developer.roblox.com/en-us/api-reference/class/BadgeService","BaseImportData":"https://developer.roblox.com/en-us/api-reference/class/BaseImportData","AnimationImportData":"https://developer.roblox.com/en-us/api-reference/class/AnimationImportData","FacsImportData":"https://developer.roblox.com/en-us/api-reference/class/FacsImportData","GroupImportData":"https://developer.roblox.com/en-us/api-reference/class/GroupImportData","JointImportData":"https://developer.roblox.com/en-us/api-reference/class/JointImportData","MaterialImportData":"https://developer.roblox.com/en-us/api-reference/class/MaterialImportData","MeshImportData":"https://developer.roblox.com/en-us/api-reference/class/MeshImportData","RootImportData":"https://developer.roblox.com/en-us/api-reference/class/RootImportData","BasePlayerGui":"https://developer.roblox.com/en-us/api-reference/class/BasePlayerGui","CoreGui":"https://developer.roblox.com/en-us/api-reference/class/CoreGui","PlayerGui":"https://developer.roblox.com/en-us/api-reference/class/PlayerGui","StarterGui":"https://developer.roblox.com/en-us/api-reference/class/StarterGui","BaseWrap":"https://developer.roblox.com/en-us/api-reference/class/BaseWrap","WrapLayer":"https://developer.roblox.com/en-us/api-reference/class/WrapLayer","WrapTarget":"https://developer.roblox.com/en-us/api-reference/class/WrapTarget","Beam":"https://developer.roblox.com/en-us/api-reference/class/Beam","BindableEvent":"https://developer.roblox.com/en-us/api-reference/class/BindableEvent","BindableFunction":"https://developer.roblox.com/en-us/api-reference/class/BindableFunction","BodyMover":"https://developer.roblox.com/en-us/api-reference/class/BodyMover","BodyAngularVelocity":"https://developer.roblox.com/en-us/api-reference/class/BodyAngularVelocity","BodyForce":"https://developer.roblox.com/en-us/api-reference/class/BodyForce","BodyGyro":"https://developer.roblox.com/en-us/api-reference/class/BodyGyro","BodyPosition":"https://developer.roblox.com/en-us/api-reference/class/BodyPosition","BodyThrust":"https://developer.roblox.com/en-us/api-reference/class/BodyThrust","BodyVelocity":"https://developer.roblox.com/en-us/api-reference/class/BodyVelocity","RocketPropulsion":"https://developer.roblox.com/en-us/api-reference/class/RocketPropulsion","Breakpoint":"https://developer.roblox.com/en-us/api-reference/class/Breakpoint","BrowserService":"https://developer.roblox.com/en-us/api-reference/class/BrowserService","BubbleChatMessageProperties":"https://developer.roblox.com/en-us/api-reference/class/BubbleChatMessageProperties","BulkImportService":"https://developer.roblox.com/en-us/api-reference/class/BulkImportService","CacheableContentProvider":"https://developer.roblox.com/en-us/api-reference/class/CacheableContentProvider","HSRDataContentProvider":"https://developer.roblox.com/en-us/api-reference/class/HSRDataContentProvider","MeshContentProvider":"https://developer.roblox.com/en-us/api-reference/class/MeshContentProvider","SolidModelContentProvider":"https://developer.roblox.com/en-us/api-reference/class/SolidModelContentProvider","CalloutService":"https://developer.roblox.com/en-us/api-reference/class/CalloutService","Camera":"https://developer.roblox.com/en-us/api-reference/class/Camera","CaptureService":"https://developer.roblox.com/en-us/api-reference/class/CaptureService","ChangeHistoryService":"https://developer.roblox.com/en-us/api-reference/class/ChangeHistoryService","CharacterAppearance":"https://developer.roblox.com/en-us/api-reference/class/CharacterAppearance","BodyColors":"https://developer.roblox.com/en-us/api-reference/class/BodyColors","CharacterMesh":"https://developer.roblox.com/en-us/api-reference/class/CharacterMesh","Clothing":"https://developer.roblox.com/en-us/api-reference/class/Clothing","Pants":"https://developer.roblox.com/en-us/api-reference/class/Pants","Shirt":"https://developer.roblox.com/en-us/api-reference/class/Shirt","ShirtGraphic":"https://developer.roblox.com/en-us/api-reference/class/ShirtGraphic","Skin":"https://developer.roblox.com/en-us/api-reference/class/Skin","Chat":"https://developer.roblox.com/en-us/api-reference/class/Chat","ChatbotUIService":"https://developer.roblox.com/en-us/api-reference/class/ChatbotUIService","ClickDetector":"https://developer.roblox.com/en-us/api-reference/class/ClickDetector","DragDetector":"https://developer.roblox.com/en-us/api-reference/class/DragDetector","Clouds":"https://developer.roblox.com/en-us/api-reference/class/Clouds","ClusterPacketCache":"https://developer.roblox.com/en-us/api-reference/class/ClusterPacketCache","Collaborator":"https://developer.roblox.com/en-us/api-reference/class/Collaborator","CollaboratorsService":"https://developer.roblox.com/en-us/api-reference/class/CollaboratorsService","CollectionService":"https://developer.roblox.com/en-us/api-reference/class/CollectionService","CommandInstance":"https://developer.roblox.com/en-us/api-reference/class/CommandInstance","CommandService":"https://developer.roblox.com/en-us/api-reference/class/CommandService","Configuration":"https://developer.roblox.com/en-us/api-reference/class/Configuration","ConfigureServerService":"https://developer.roblox.com/en-us/api-reference/class/ConfigureServerService","Constraint":"https://developer.roblox.com/en-us/api-reference/class/Constraint","AlignOrientation":"https://developer.roblox.com/en-us/api-reference/class/AlignOrientation","AlignPosition":"https://developer.roblox.com/en-us/api-reference/class/AlignPosition","AngularVelocity":"https://developer.roblox.com/en-us/api-reference/class/AngularVelocity","AnimationConstraint":"https://developer.roblox.com/en-us/api-reference/class/AnimationConstraint","BallSocketConstraint":"https://developer.roblox.com/en-us/api-reference/class/BallSocketConstraint","HingeConstraint":"https://developer.roblox.com/en-us/api-reference/class/HingeConstraint","LineForce":"https://developer.roblox.com/en-us/api-reference/class/LineForce","LinearVelocity":"https://developer.roblox.com/en-us/api-reference/class/LinearVelocity","PlaneConstraint":"https://developer.roblox.com/en-us/api-reference/class/PlaneConstraint","Plane":"https://developer.roblox.com/en-us/api-reference/class/Plane","RigidConstraint":"https://developer.roblox.com/en-us/api-reference/class/RigidConstraint","RodConstraint":"https://developer.roblox.com/en-us/api-reference/class/RodConstraint","RopeConstraint":"https://developer.roblox.com/en-us/api-reference/class/RopeConstraint","SlidingBallConstraint":"https://developer.roblox.com/en-us/api-reference/class/SlidingBallConstraint","CylindricalConstraint":"https://developer.roblox.com/en-us/api-reference/class/CylindricalConstraint","PrismaticConstraint":"https://developer.roblox.com/en-us/api-reference/class/PrismaticConstraint","SpringConstraint":"https://developer.roblox.com/en-us/api-reference/class/SpringConstraint","Torque":"https://developer.roblox.com/en-us/api-reference/class/Torque","TorsionSpringConstraint":"https://developer.roblox.com/en-us/api-reference/class/TorsionSpringConstraint","UniversalConstraint":"https://developer.roblox.com/en-us/api-reference/class/UniversalConstraint","VectorForce":"https://developer.roblox.com/en-us/api-reference/class/VectorForce","ContentProvider":"https://developer.roblox.com/en-us/api-reference/class/ContentProvider","ContextActionService":"https://developer.roblox.com/en-us/api-reference/class/ContextActionService","Controller":"https://developer.roblox.com/en-us/api-reference/class/Controller","HumanoidController":"https://developer.roblox.com/en-us/api-reference/class/HumanoidController","SkateboardController":"https://developer.roblox.com/en-us/api-reference/class/SkateboardController","VehicleController":"https://developer.roblox.com/en-us/api-reference/class/VehicleController","ControllerBase":"https://developer.roblox.com/en-us/api-reference/class/ControllerBase","AirController":"https://developer.roblox.com/en-us/api-reference/class/AirController","ClimbController":"https://developer.roblox.com/en-us/api-reference/class/ClimbController","GroundController":"https://developer.roblox.com/en-us/api-reference/class/GroundController","SwimController":"https://developer.roblox.com/en-us/api-reference/class/SwimController","ControllerManager":"https://developer.roblox.com/en-us/api-reference/class/ControllerManager","ControllerService":"https://developer.roblox.com/en-us/api-reference/class/ControllerService","CookiesService":"https://developer.roblox.com/en-us/api-reference/class/CookiesService","CorePackages":"https://developer.roblox.com/en-us/api-reference/class/CorePackages","CoreScriptDebuggingManagerHelper":"https://developer.roblox.com/en-us/api-reference/class/CoreScriptDebuggingManagerHelper","CoreScriptSyncService":"https://developer.roblox.com/en-us/api-reference/class/CoreScriptSyncService","CrossDMScriptChangeListener":"https://developer.roblox.com/en-us/api-reference/class/CrossDMScriptChangeListener","CustomEvent":"https://developer.roblox.com/en-us/api-reference/class/CustomEvent","CustomEventReceiver":"https://developer.roblox.com/en-us/api-reference/class/CustomEventReceiver","DataModelMesh":"https://developer.roblox.com/en-us/api-reference/class/DataModelMesh","BevelMesh":"https://developer.roblox.com/en-us/api-reference/class/BevelMesh","BlockMesh":"https://developer.roblox.com/en-us/api-reference/class/BlockMesh","CylinderMesh":"https://developer.roblox.com/en-us/api-reference/class/CylinderMesh","DynamicMesh":"https://developer.roblox.com/en-us/api-reference/class/DynamicMesh","FileMesh":"https://developer.roblox.com/en-us/api-reference/class/FileMesh","SpecialMesh":"https://developer.roblox.com/en-us/api-reference/class/SpecialMesh","DataModelPatchService":"https://developer.roblox.com/en-us/api-reference/class/DataModelPatchService","DataModelSession":"https://developer.roblox.com/en-us/api-reference/class/DataModelSession","DataStoreGetOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreGetOptions","DataStoreIncrementOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreIncrementOptions","DataStoreInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreInfo","DataStoreKey":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKey","DataStoreKeyInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKeyInfo","DataStoreObjectVersionInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreObjectVersionInfo","DataStoreOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreOptions","DataStoreService":"https://developer.roblox.com/en-us/api-reference/class/DataStoreService","DataStoreSetOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreSetOptions","Debris":"https://developer.roblox.com/en-us/api-reference/class/Debris","DebugSettings":"https://developer.roblox.com/en-us/api-reference/class/DebugSettings","DebuggablePluginWatcher":"https://developer.roblox.com/en-us/api-reference/class/DebuggablePluginWatcher","DebuggerBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/DebuggerBreakpoint","DebuggerConnection":"https://developer.roblox.com/en-us/api-reference/class/DebuggerConnection","LocalDebuggerConnection":"https://developer.roblox.com/en-us/api-reference/class/LocalDebuggerConnection","DebuggerConnectionManager":"https://developer.roblox.com/en-us/api-reference/class/DebuggerConnectionManager","DebuggerLuaResponse":"https://developer.roblox.com/en-us/api-reference/class/DebuggerLuaResponse","DebuggerManager":"https://developer.roblox.com/en-us/api-reference/class/DebuggerManager","DebuggerUIService":"https://developer.roblox.com/en-us/api-reference/class/DebuggerUIService","DebuggerVariable":"https://developer.roblox.com/en-us/api-reference/class/DebuggerVariable","DebuggerWatch":"https://developer.roblox.com/en-us/api-reference/class/DebuggerWatch","DeviceIdService":"https://developer.roblox.com/en-us/api-reference/class/DeviceIdService","Dialog":"https://developer.roblox.com/en-us/api-reference/class/Dialog","DialogChoice":"https://developer.roblox.com/en-us/api-reference/class/DialogChoice","DraftsService":"https://developer.roblox.com/en-us/api-reference/class/DraftsService","Dragger":"https://developer.roblox.com/en-us/api-reference/class/Dragger","DraggerService":"https://developer.roblox.com/en-us/api-reference/class/DraggerService","DynamicImage":"https://developer.roblox.com/en-us/api-reference/class/DynamicImage","EulerRotationCurve":"https://developer.roblox.com/en-us/api-reference/class/EulerRotationCurve","EventIngestService":"https://developer.roblox.com/en-us/api-reference/class/EventIngestService","ExperienceAuthService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceAuthService","ExperienceInviteOptions":"https://developer.roblox.com/en-us/api-reference/class/ExperienceInviteOptions","ExperienceNotificationService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceNotificationService","Explosion":"https://developer.roblox.com/en-us/api-reference/class/Explosion","FaceAnimatorService":"https://developer.roblox.com/en-us/api-reference/class/FaceAnimatorService","FaceControls":"https://developer.roblox.com/en-us/api-reference/class/FaceControls","FaceInstance":"https://developer.roblox.com/en-us/api-reference/class/FaceInstance","Decal":"https://developer.roblox.com/en-us/api-reference/class/Decal","Texture":"https://developer.roblox.com/en-us/api-reference/class/Texture","FacialAnimationRecordingService":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationRecordingService","FacialAnimationStreamingServiceStats":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingServiceStats","FacialAnimationStreamingServiceV2":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingServiceV2","FacialAnimationStreamingSubsessionStats":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingSubsessionStats","Feature":"https://developer.roblox.com/en-us/api-reference/class/Feature","Hole":"https://developer.roblox.com/en-us/api-reference/class/Hole","MotorFeature":"https://developer.roblox.com/en-us/api-reference/class/MotorFeature","File":"https://developer.roblox.com/en-us/api-reference/class/File","Fire":"https://developer.roblox.com/en-us/api-reference/class/Fire","FlagStandService":"https://developer.roblox.com/en-us/api-reference/class/FlagStandService","FloatCurve":"https://developer.roblox.com/en-us/api-reference/class/FloatCurve","FlyweightService":"https://developer.roblox.com/en-us/api-reference/class/FlyweightService","CSGDictionaryService":"https://developer.roblox.com/en-us/api-reference/class/CSGDictionaryService","NonReplicatedCSGDictionaryService":"https://developer.roblox.com/en-us/api-reference/class/NonReplicatedCSGDictionaryService","Folder":"https://developer.roblox.com/en-us/api-reference/class/Folder","ForceField":"https://developer.roblox.com/en-us/api-reference/class/ForceField","FriendService":"https://developer.roblox.com/en-us/api-reference/class/FriendService","FunctionalTest":"https://developer.roblox.com/en-us/api-reference/class/FunctionalTest","GamePassService":"https://developer.roblox.com/en-us/api-reference/class/GamePassService","GameSettings":"https://developer.roblox.com/en-us/api-reference/class/GameSettings","GamepadService":"https://developer.roblox.com/en-us/api-reference/class/GamepadService","Geometry":"https://developer.roblox.com/en-us/api-reference/class/Geometry","GeometryService":"https://developer.roblox.com/en-us/api-reference/class/GeometryService","GetTextBoundsParams":"https://developer.roblox.com/en-us/api-reference/class/GetTextBoundsParams","GlobalDataStore":"https://developer.roblox.com/en-us/api-reference/class/GlobalDataStore","DataStore":"https://developer.roblox.com/en-us/api-reference/class/DataStore","OrderedDataStore":"https://developer.roblox.com/en-us/api-reference/class/OrderedDataStore","GoogleAnalyticsConfiguration":"https://developer.roblox.com/en-us/api-reference/class/GoogleAnalyticsConfiguration","GroupService":"https://developer.roblox.com/en-us/api-reference/class/GroupService","GuiBase":"https://developer.roblox.com/en-us/api-reference/class/GuiBase","GuiBase2d":"https://developer.roblox.com/en-us/api-reference/class/GuiBase2d","GuiObject":"https://developer.roblox.com/en-us/api-reference/class/GuiObject","CanvasGroup":"https://developer.roblox.com/en-us/api-reference/class/CanvasGroup","Frame":"https://developer.roblox.com/en-us/api-reference/class/Frame","GuiButton":"https://developer.roblox.com/en-us/api-reference/class/GuiButton","ImageButton":"https://developer.roblox.com/en-us/api-reference/class/ImageButton","TextButton":"https://developer.roblox.com/en-us/api-reference/class/TextButton","GuiLabel":"https://developer.roblox.com/en-us/api-reference/class/GuiLabel","ImageLabel":"https://developer.roblox.com/en-us/api-reference/class/ImageLabel","TextLabel":"https://developer.roblox.com/en-us/api-reference/class/TextLabel","ScrollingFrame":"https://developer.roblox.com/en-us/api-reference/class/ScrollingFrame","TextBox":"https://developer.roblox.com/en-us/api-reference/class/TextBox","VideoFrame":"https://developer.roblox.com/en-us/api-reference/class/VideoFrame","ViewportFrame":"https://developer.roblox.com/en-us/api-reference/class/ViewportFrame","LayerCollector":"https://developer.roblox.com/en-us/api-reference/class/LayerCollector","BillboardGui":"https://developer.roblox.com/en-us/api-reference/class/BillboardGui","PluginGui":"https://developer.roblox.com/en-us/api-reference/class/PluginGui","DockWidgetPluginGui":"https://developer.roblox.com/en-us/api-reference/class/DockWidgetPluginGui","QWidgetPluginGui":"https://developer.roblox.com/en-us/api-reference/class/QWidgetPluginGui","ScreenGui":"https://developer.roblox.com/en-us/api-reference/class/ScreenGui","GuiMain":"https://developer.roblox.com/en-us/api-reference/class/GuiMain","SurfaceGuiBase":"https://developer.roblox.com/en-us/api-reference/class/SurfaceGuiBase","AdGui":"https://developer.roblox.com/en-us/api-reference/class/AdGui","SurfaceGui":"https://developer.roblox.com/en-us/api-reference/class/SurfaceGui","GuiBase3d":"https://developer.roblox.com/en-us/api-reference/class/GuiBase3d","FloorWire":"https://developer.roblox.com/en-us/api-reference/class/FloorWire","InstanceAdornment":"https://developer.roblox.com/en-us/api-reference/class/InstanceAdornment","SelectionBox":"https://developer.roblox.com/en-us/api-reference/class/SelectionBox","PVAdornment":"https://developer.roblox.com/en-us/api-reference/class/PVAdornment","HandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/HandleAdornment","BoxHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/BoxHandleAdornment","ConeHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/ConeHandleAdornment","CylinderHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/CylinderHandleAdornment","ImageHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/ImageHandleAdornment","LineHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/LineHandleAdornment","SphereHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/SphereHandleAdornment","WireframeHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/WireframeHandleAdornment","ParabolaAdornment":"https://developer.roblox.com/en-us/api-reference/class/ParabolaAdornment","SelectionSphere":"https://developer.roblox.com/en-us/api-reference/class/SelectionSphere","PartAdornment":"https://developer.roblox.com/en-us/api-reference/class/PartAdornment","HandlesBase":"https://developer.roblox.com/en-us/api-reference/class/HandlesBase","ArcHandles":"https://developer.roblox.com/en-us/api-reference/class/ArcHandles","Handles":"https://developer.roblox.com/en-us/api-reference/class/Handles","SurfaceSelection":"https://developer.roblox.com/en-us/api-reference/class/SurfaceSelection","SelectionLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionLasso","SelectionPartLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionPartLasso","SelectionPointLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionPointLasso","GuiService":"https://developer.roblox.com/en-us/api-reference/class/GuiService","GuidRegistryService":"https://developer.roblox.com/en-us/api-reference/class/GuidRegistryService","HapticService":"https://developer.roblox.com/en-us/api-reference/class/HapticService","HeightmapImporterService":"https://developer.roblox.com/en-us/api-reference/class/HeightmapImporterService","HiddenSurfaceRemovalAsset":"https://developer.roblox.com/en-us/api-reference/class/HiddenSurfaceRemovalAsset","Highlight":"https://developer.roblox.com/en-us/api-reference/class/Highlight","Hopper":"https://developer.roblox.com/en-us/api-reference/class/Hopper","HttpRbxApiService":"https://developer.roblox.com/en-us/api-reference/class/HttpRbxApiService","HttpRequest":"https://developer.roblox.com/en-us/api-reference/class/HttpRequest","HttpService":"https://developer.roblox.com/en-us/api-reference/class/HttpService","Humanoid":"https://developer.roblox.com/en-us/api-reference/class/Humanoid","HumanoidDescription":"https://developer.roblox.com/en-us/api-reference/class/HumanoidDescription","IKControl":"https://developer.roblox.com/en-us/api-reference/class/IKControl","ILegacyStudioBridge":"https://developer.roblox.com/en-us/api-reference/class/ILegacyStudioBridge","LegacyStudioBridge":"https://developer.roblox.com/en-us/api-reference/class/LegacyStudioBridge","IXPService":"https://developer.roblox.com/en-us/api-reference/class/IXPService","IncrementalPatchBuilder":"https://developer.roblox.com/en-us/api-reference/class/IncrementalPatchBuilder","InputObject":"https://developer.roblox.com/en-us/api-reference/class/InputObject","InsertService":"https://developer.roblox.com/en-us/api-reference/class/InsertService","JointInstance":"https://developer.roblox.com/en-us/api-reference/class/JointInstance","DynamicRotate":"https://developer.roblox.com/en-us/api-reference/class/DynamicRotate","RotateP":"https://developer.roblox.com/en-us/api-reference/class/RotateP","RotateV":"https://developer.roblox.com/en-us/api-reference/class/RotateV","Glue":"https://developer.roblox.com/en-us/api-reference/class/Glue","ManualSurfaceJointInstance":"https://developer.roblox.com/en-us/api-reference/class/ManualSurfaceJointInstance","ManualGlue":"https://developer.roblox.com/en-us/api-reference/class/ManualGlue","ManualWeld":"https://developer.roblox.com/en-us/api-reference/class/ManualWeld","Motor":"https://developer.roblox.com/en-us/api-reference/class/Motor","Motor6D":"https://developer.roblox.com/en-us/api-reference/class/Motor6D","Rotate":"https://developer.roblox.com/en-us/api-reference/class/Rotate","Snap":"https://developer.roblox.com/en-us/api-reference/class/Snap","VelocityMotor":"https://developer.roblox.com/en-us/api-reference/class/VelocityMotor","Weld":"https://developer.roblox.com/en-us/api-reference/class/Weld","JointsService":"https://developer.roblox.com/en-us/api-reference/class/JointsService","KeyboardService":"https://developer.roblox.com/en-us/api-reference/class/KeyboardService","Keyframe":"https://developer.roblox.com/en-us/api-reference/class/Keyframe","KeyframeMarker":"https://developer.roblox.com/en-us/api-reference/class/KeyframeMarker","KeyframeSequenceProvider":"https://developer.roblox.com/en-us/api-reference/class/KeyframeSequenceProvider","LSPFileSyncService":"https://developer.roblox.com/en-us/api-reference/class/LSPFileSyncService","LanguageService":"https://developer.roblox.com/en-us/api-reference/class/LanguageService","Light":"https://developer.roblox.com/en-us/api-reference/class/Light","PointLight":"https://developer.roblox.com/en-us/api-reference/class/PointLight","SpotLight":"https://developer.roblox.com/en-us/api-reference/class/SpotLight","SurfaceLight":"https://developer.roblox.com/en-us/api-reference/class/SurfaceLight","Lighting":"https://developer.roblox.com/en-us/api-reference/class/Lighting","LiveScriptingService":"https://developer.roblox.com/en-us/api-reference/class/LiveScriptingService","LocalStorageService":"https://developer.roblox.com/en-us/api-reference/class/LocalStorageService","AppStorageService":"https://developer.roblox.com/en-us/api-reference/class/AppStorageService","UserStorageService":"https://developer.roblox.com/en-us/api-reference/class/UserStorageService","LocalizationService":"https://developer.roblox.com/en-us/api-reference/class/LocalizationService","LocalizationTable":"https://developer.roblox.com/en-us/api-reference/class/LocalizationTable","CloudLocalizationTable":"https://developer.roblox.com/en-us/api-reference/class/CloudLocalizationTable","LodDataEntity":"https://developer.roblox.com/en-us/api-reference/class/LodDataEntity","LodDataService":"https://developer.roblox.com/en-us/api-reference/class/LodDataService","LogService":"https://developer.roblox.com/en-us/api-reference/class/LogService","LoginService":"https://developer.roblox.com/en-us/api-reference/class/LoginService","LuaSettings":"https://developer.roblox.com/en-us/api-reference/class/LuaSettings","LuaSourceContainer":"https://developer.roblox.com/en-us/api-reference/class/LuaSourceContainer","BaseScript":"https://developer.roblox.com/en-us/api-reference/class/BaseScript","CoreScript":"https://developer.roblox.com/en-us/api-reference/class/CoreScript","Script":"https://developer.roblox.com/en-us/api-reference/class/Script","LocalScript":"https://developer.roblox.com/en-us/api-reference/class/LocalScript","ModuleScript":"https://developer.roblox.com/en-us/api-reference/class/ModuleScript","LuaWebService":"https://developer.roblox.com/en-us/api-reference/class/LuaWebService","LuauScriptAnalyzerService":"https://developer.roblox.com/en-us/api-reference/class/LuauScriptAnalyzerService","MarkerCurve":"https://developer.roblox.com/en-us/api-reference/class/MarkerCurve","MarketplaceService":"https://developer.roblox.com/en-us/api-reference/class/MarketplaceService","MaterialGenerationService":"https://developer.roblox.com/en-us/api-reference/class/MaterialGenerationService","MaterialGenerationSession":"https://developer.roblox.com/en-us/api-reference/class/MaterialGenerationSession","MaterialService":"https://developer.roblox.com/en-us/api-reference/class/MaterialService","MaterialVariant":"https://developer.roblox.com/en-us/api-reference/class/MaterialVariant","MemStorageConnection":"https://developer.roblox.com/en-us/api-reference/class/MemStorageConnection","MemStorageService":"https://developer.roblox.com/en-us/api-reference/class/MemStorageService","MemoryStoreHashMap":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreHashMap","MemoryStoreQueue":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreQueue","MemoryStoreService":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreService","MemoryStoreSortedMap":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreSortedMap","Message":"https://developer.roblox.com/en-us/api-reference/class/Message","Hint":"https://developer.roblox.com/en-us/api-reference/class/Hint","MessageBusConnection":"https://developer.roblox.com/en-us/api-reference/class/MessageBusConnection","MessageBusService":"https://developer.roblox.com/en-us/api-reference/class/MessageBusService","MessagingService":"https://developer.roblox.com/en-us/api-reference/class/MessagingService","MetaBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpoint","MetaBreakpointContext":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpointContext","MetaBreakpointManager":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpointManager","Mouse":"https://developer.roblox.com/en-us/api-reference/class/Mouse","PlayerMouse":"https://developer.roblox.com/en-us/api-reference/class/PlayerMouse","PluginMouse":"https://developer.roblox.com/en-us/api-reference/class/PluginMouse","MouseService":"https://developer.roblox.com/en-us/api-reference/class/MouseService","MultipleDocumentInterfaceInstance":"https://developer.roblox.com/en-us/api-reference/class/MultipleDocumentInterfaceInstance","NetworkMarker":"https://developer.roblox.com/en-us/api-reference/class/NetworkMarker","NetworkPeer":"https://developer.roblox.com/en-us/api-reference/class/NetworkPeer","NetworkClient":"https://developer.roblox.com/en-us/api-reference/class/NetworkClient","NetworkServer":"https://developer.roblox.com/en-us/api-reference/class/NetworkServer","NetworkReplicator":"https://developer.roblox.com/en-us/api-reference/class/NetworkReplicator","ClientReplicator":"https://developer.roblox.com/en-us/api-reference/class/ClientReplicator","ServerReplicator":"https://developer.roblox.com/en-us/api-reference/class/ServerReplicator","NetworkSettings":"https://developer.roblox.com/en-us/api-reference/class/NetworkSettings","NoCollisionConstraint":"https://developer.roblox.com/en-us/api-reference/class/NoCollisionConstraint","NotificationService":"https://developer.roblox.com/en-us/api-reference/class/NotificationService","OmniRecommendationsService":"https://developer.roblox.com/en-us/api-reference/class/OmniRecommendationsService","OpenCloudApiV1":"https://developer.roblox.com/en-us/api-reference/class/OpenCloudApiV1","OpenCloudService":"https://developer.roblox.com/en-us/api-reference/class/OpenCloudService","PVInstance":"https://developer.roblox.com/en-us/api-reference/class/PVInstance","BasePart":"https://developer.roblox.com/en-us/api-reference/class/BasePart","CornerWedgePart":"https://developer.roblox.com/en-us/api-reference/class/CornerWedgePart","FormFactorPart":"https://developer.roblox.com/en-us/api-reference/class/FormFactorPart","Part":"https://developer.roblox.com/en-us/api-reference/class/Part","FlagStand":"https://developer.roblox.com/en-us/api-reference/class/FlagStand","Platform":"https://developer.roblox.com/en-us/api-reference/enum/Platform","Seat":"https://developer.roblox.com/en-us/api-reference/class/Seat","SkateboardPlatform":"https://developer.roblox.com/en-us/api-reference/class/SkateboardPlatform","SpawnLocation":"https://developer.roblox.com/en-us/api-reference/class/SpawnLocation","WedgePart":"https://developer.roblox.com/en-us/api-reference/class/WedgePart","Terrain":"https://developer.roblox.com/en-us/api-reference/class/Terrain","TriangleMeshPart":"https://developer.roblox.com/en-us/api-reference/class/TriangleMeshPart","MeshPart":"https://developer.roblox.com/en-us/api-reference/class/MeshPart","PartOperation":"https://developer.roblox.com/en-us/api-reference/class/PartOperation","IntersectOperation":"https://developer.roblox.com/en-us/api-reference/class/IntersectOperation","NegateOperation":"https://developer.roblox.com/en-us/api-reference/class/NegateOperation","UnionOperation":"https://developer.roblox.com/en-us/api-reference/class/UnionOperation","TrussPart":"https://developer.roblox.com/en-us/api-reference/class/TrussPart","VehicleSeat":"https://developer.roblox.com/en-us/api-reference/class/VehicleSeat","Model":"https://developer.roblox.com/en-us/api-reference/class/Model","Actor":"https://developer.roblox.com/en-us/api-reference/class/Actor","BackpackItem":"https://developer.roblox.com/en-us/api-reference/class/BackpackItem","HopperBin":"https://developer.roblox.com/en-us/api-reference/class/HopperBin","Tool":"https://developer.roblox.com/en-us/api-reference/class/Tool","Flag":"https://developer.roblox.com/en-us/api-reference/class/Flag","Status":"https://developer.roblox.com/en-us/api-reference/enum/Status","WorldRoot":"https://developer.roblox.com/en-us/api-reference/class/WorldRoot","Workspace":"https://developer.roblox.com/en-us/api-reference/class/Workspace","WorldModel":"https://developer.roblox.com/en-us/api-reference/class/WorldModel","PackageLink":"https://developer.roblox.com/en-us/api-reference/class/PackageLink","PackageService":"https://developer.roblox.com/en-us/api-reference/class/PackageService","PackageUIService":"https://developer.roblox.com/en-us/api-reference/class/PackageUIService","Pages":"https://developer.roblox.com/en-us/api-reference/class/Pages","AudioPages":"https://developer.roblox.com/en-us/api-reference/class/AudioPages","CatalogPages":"https://developer.roblox.com/en-us/api-reference/class/CatalogPages","DataStoreKeyPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKeyPages","DataStoreListingPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreListingPages","DataStorePages":"https://developer.roblox.com/en-us/api-reference/class/DataStorePages","DataStoreVersionPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreVersionPages","FriendPages":"https://developer.roblox.com/en-us/api-reference/class/FriendPages","InventoryPages":"https://developer.roblox.com/en-us/api-reference/class/InventoryPages","EmotesPages":"https://developer.roblox.com/en-us/api-reference/class/EmotesPages","OutfitPages":"https://developer.roblox.com/en-us/api-reference/class/OutfitPages","StandardPages":"https://developer.roblox.com/en-us/api-reference/class/StandardPages","PartOperationAsset":"https://developer.roblox.com/en-us/api-reference/class/PartOperationAsset","ParticleEmitter":"https://developer.roblox.com/en-us/api-reference/class/ParticleEmitter","PatchBundlerFileWatch":"https://developer.roblox.com/en-us/api-reference/class/PatchBundlerFileWatch","PatchMapping":"https://developer.roblox.com/en-us/api-reference/class/PatchMapping","Path":"https://developer.roblox.com/en-us/api-reference/class/Path","PathfindingLink":"https://developer.roblox.com/en-us/api-reference/class/PathfindingLink","PathfindingModifier":"https://developer.roblox.com/en-us/api-reference/class/PathfindingModifier","PathfindingService":"https://developer.roblox.com/en-us/api-reference/class/PathfindingService","PausedState":"https://developer.roblox.com/en-us/api-reference/class/PausedState","PausedStateBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/PausedStateBreakpoint","PausedStateException":"https://developer.roblox.com/en-us/api-reference/class/PausedStateException","PermissionsService":"https://developer.roblox.com/en-us/api-reference/class/PermissionsService","PhysicsService":"https://developer.roblox.com/en-us/api-reference/class/PhysicsService","PhysicsSettings":"https://developer.roblox.com/en-us/api-reference/class/PhysicsSettings","PlaceStatsService":"https://developer.roblox.com/en-us/api-reference/class/PlaceStatsService","PlacesService":"https://developer.roblox.com/en-us/api-reference/class/PlacesService","PlatformFriendsService":"https://developer.roblox.com/en-us/api-reference/class/PlatformFriendsService","Player":"https://developer.roblox.com/en-us/api-reference/class/Player","PlayerEmulatorService":"https://developer.roblox.com/en-us/api-reference/class/PlayerEmulatorService","PlayerScripts":"https://developer.roblox.com/en-us/api-reference/class/PlayerScripts","Players":"https://developer.roblox.com/en-us/api-reference/class/Players","Plugin":"https://developer.roblox.com/en-us/api-reference/class/Plugin","PluginAction":"https://developer.roblox.com/en-us/api-reference/class/PluginAction","PluginCapabilities":"https://developer.roblox.com/en-us/api-reference/class/PluginCapabilities","PluginDebugService":"https://developer.roblox.com/en-us/api-reference/class/PluginDebugService","PluginDragEvent":"https://developer.roblox.com/en-us/api-reference/class/PluginDragEvent","PluginGuiService":"https://developer.roblox.com/en-us/api-reference/class/PluginGuiService","PluginManagementService":"https://developer.roblox.com/en-us/api-reference/class/PluginManagementService","PluginManager":"https://developer.roblox.com/en-us/api-reference/class/PluginManager","PluginManagerInterface":"https://developer.roblox.com/en-us/api-reference/class/PluginManagerInterface","PluginMenu":"https://developer.roblox.com/en-us/api-reference/class/PluginMenu","PluginPolicyService":"https://developer.roblox.com/en-us/api-reference/class/PluginPolicyService","PluginToolbar":"https://developer.roblox.com/en-us/api-reference/class/PluginToolbar","PluginToolbarButton":"https://developer.roblox.com/en-us/api-reference/class/PluginToolbarButton","PointsService":"https://developer.roblox.com/en-us/api-reference/class/PointsService","PolicyService":"https://developer.roblox.com/en-us/api-reference/class/PolicyService","PoseBase":"https://developer.roblox.com/en-us/api-reference/class/PoseBase","NumberPose":"https://developer.roblox.com/en-us/api-reference/class/NumberPose","Pose":"https://developer.roblox.com/en-us/api-reference/class/Pose","PostEffect":"https://developer.roblox.com/en-us/api-reference/class/PostEffect","BloomEffect":"https://developer.roblox.com/en-us/api-reference/class/BloomEffect","BlurEffect":"https://developer.roblox.com/en-us/api-reference/class/BlurEffect","ColorCorrectionEffect":"https://developer.roblox.com/en-us/api-reference/class/ColorCorrectionEffect","DepthOfFieldEffect":"https://developer.roblox.com/en-us/api-reference/class/DepthOfFieldEffect","SunRaysEffect":"https://developer.roblox.com/en-us/api-reference/class/SunRaysEffect","ProcessInstancePhysicsService":"https://developer.roblox.com/en-us/api-reference/class/ProcessInstancePhysicsService","ProximityPrompt":"https://developer.roblox.com/en-us/api-reference/class/ProximityPrompt","ProximityPromptService":"https://developer.roblox.com/en-us/api-reference/class/ProximityPromptService","PublishService":"https://developer.roblox.com/en-us/api-reference/class/PublishService","RbxAnalyticsService":"https://developer.roblox.com/en-us/api-reference/class/RbxAnalyticsService","ReflectionMetadata":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadata","ReflectionMetadataCallbacks":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataCallbacks","ReflectionMetadataClasses":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataClasses","ReflectionMetadataEnums":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnums","ReflectionMetadataEvents":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEvents","ReflectionMetadataFunctions":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataFunctions","ReflectionMetadataItem":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataItem","ReflectionMetadataClass":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataClass","ReflectionMetadataEnum":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnum","ReflectionMetadataEnumItem":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnumItem","ReflectionMetadataMember":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataMember","ReflectionMetadataProperties":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataProperties","ReflectionMetadataYieldFunctions":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataYieldFunctions","RemoteCursorService":"https://developer.roblox.com/en-us/api-reference/class/RemoteCursorService","RemoteDebuggerServer":"https://developer.roblox.com/en-us/api-reference/class/RemoteDebuggerServer","RemoteEvent":"https://developer.roblox.com/en-us/api-reference/class/RemoteEvent","RemoteFunction":"https://developer.roblox.com/en-us/api-reference/class/RemoteFunction","RenderSettings":"https://developer.roblox.com/en-us/api-reference/class/RenderSettings","RenderingTest":"https://developer.roblox.com/en-us/api-reference/class/RenderingTest","ReplicatedFirst":"https://developer.roblox.com/en-us/api-reference/class/ReplicatedFirst","ReplicatedStorage":"https://developer.roblox.com/en-us/api-reference/class/ReplicatedStorage","RobloxPluginGuiService":"https://developer.roblox.com/en-us/api-reference/class/RobloxPluginGuiService","RobloxReplicatedStorage":"https://developer.roblox.com/en-us/api-reference/class/RobloxReplicatedStorage","RobloxServerStorage":"https://developer.roblox.com/en-us/api-reference/class/RobloxServerStorage","RomarkService":"https://developer.roblox.com/en-us/api-reference/class/RomarkService","RotationCurve":"https://developer.roblox.com/en-us/api-reference/class/RotationCurve","RtMessagingService":"https://developer.roblox.com/en-us/api-reference/class/RtMessagingService","RunService":"https://developer.roblox.com/en-us/api-reference/class/RunService","RuntimeScriptService":"https://developer.roblox.com/en-us/api-reference/class/RuntimeScriptService","SafetyService":"https://developer.roblox.com/en-us/api-reference/class/SafetyService","ScreenshotHud":"https://developer.roblox.com/en-us/api-reference/class/ScreenshotHud","ScriptBuilder":"https://developer.roblox.com/en-us/api-reference/class/ScriptBuilder","SyncScriptBuilder":"https://developer.roblox.com/en-us/api-reference/class/SyncScriptBuilder","ScriptChangeService":"https://developer.roblox.com/en-us/api-reference/class/ScriptChangeService","ScriptCloneWatcher":"https://developer.roblox.com/en-us/api-reference/class/ScriptCloneWatcher","ScriptCloneWatcherHelper":"https://developer.roblox.com/en-us/api-reference/class/ScriptCloneWatcherHelper","ScriptCommitService":"https://developer.roblox.com/en-us/api-reference/class/ScriptCommitService","ScriptContext":"https://developer.roblox.com/en-us/api-reference/class/ScriptContext","ScriptDebugger":"https://developer.roblox.com/en-us/api-reference/class/ScriptDebugger","ScriptDocument":"https://developer.roblox.com/en-us/api-reference/class/ScriptDocument","ScriptEditorService":"https://developer.roblox.com/en-us/api-reference/class/ScriptEditorService","ScriptRegistrationService":"https://developer.roblox.com/en-us/api-reference/class/ScriptRegistrationService","ScriptRuntime":"https://developer.roblox.com/en-us/api-reference/class/ScriptRuntime","ScriptService":"https://developer.roblox.com/en-us/api-reference/class/ScriptService","Selection":"https://developer.roblox.com/en-us/api-reference/class/Selection","SelectionHighlightManager":"https://developer.roblox.com/en-us/api-reference/class/SelectionHighlightManager","SensorBase":"https://developer.roblox.com/en-us/api-reference/class/SensorBase","BuoyancySensor":"https://developer.roblox.com/en-us/api-reference/class/BuoyancySensor","ControllerSensor":"https://developer.roblox.com/en-us/api-reference/class/ControllerSensor","ControllerPartSensor":"https://developer.roblox.com/en-us/api-reference/class/ControllerPartSensor","ServerScriptService":"https://developer.roblox.com/en-us/api-reference/class/ServerScriptService","ServerStorage":"https://developer.roblox.com/en-us/api-reference/class/ServerStorage","ServiceProvider":"https://developer.roblox.com/en-us/api-reference/class/ServiceProvider","DataModel":"https://developer.roblox.com/en-us/api-reference/class/DataModel","GenericSettings":"https://developer.roblox.com/en-us/api-reference/class/GenericSettings","AnalysticsSettings":"https://developer.roblox.com/en-us/api-reference/class/AnalysticsSettings","GlobalSettings":"https://developer.roblox.com/en-us/api-reference/class/GlobalSettings","UserSettings":"https://developer.roblox.com/en-us/api-reference/class/UserSettings","ServiceVisibilityService":"https://developer.roblox.com/en-us/api-reference/class/ServiceVisibilityService","SessionService":"https://developer.roblox.com/en-us/api-reference/class/SessionService","SharedTableRegistry":"https://developer.roblox.com/en-us/api-reference/class/SharedTableRegistry","ShorelineUpgraderService":"https://developer.roblox.com/en-us/api-reference/class/ShorelineUpgraderService","Sky":"https://developer.roblox.com/en-us/api-reference/class/Sky","Smoke":"https://developer.roblox.com/en-us/api-reference/class/Smoke","SmoothVoxelsUpgraderService":"https://developer.roblox.com/en-us/api-reference/class/SmoothVoxelsUpgraderService","SnippetService":"https://developer.roblox.com/en-us/api-reference/class/SnippetService","SocialService":"https://developer.roblox.com/en-us/api-reference/class/SocialService","Sound":"https://developer.roblox.com/en-us/api-reference/class/Sound","SoundEffect":"https://developer.roblox.com/en-us/api-reference/class/SoundEffect","ChorusSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ChorusSoundEffect","CompressorSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/CompressorSoundEffect","CustomSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/CustomSoundEffect","AssetSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/AssetSoundEffect","ChannelSelectorSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ChannelSelectorSoundEffect","DistortionSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/DistortionSoundEffect","EchoSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/EchoSoundEffect","EqualizerSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/EqualizerSoundEffect","FlangeSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/FlangeSoundEffect","PitchShiftSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/PitchShiftSoundEffect","ReverbSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ReverbSoundEffect","TremoloSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/TremoloSoundEffect","SoundGroup":"https://developer.roblox.com/en-us/api-reference/class/SoundGroup","SoundService":"https://developer.roblox.com/en-us/api-reference/class/SoundService","Sparkles":"https://developer.roblox.com/en-us/api-reference/class/Sparkles","SpawnerService":"https://developer.roblox.com/en-us/api-reference/class/SpawnerService","StackFrame":"https://developer.roblox.com/en-us/api-reference/class/StackFrame","StandalonePluginScripts":"https://developer.roblox.com/en-us/api-reference/class/StandalonePluginScripts","StarterGear":"https://developer.roblox.com/en-us/api-reference/class/StarterGear","StarterPack":"https://developer.roblox.com/en-us/api-reference/class/StarterPack","StarterPlayer":"https://developer.roblox.com/en-us/api-reference/class/StarterPlayer","StarterPlayerScripts":"https://developer.roblox.com/en-us/api-reference/class/StarterPlayerScripts","StarterCharacterScripts":"https://developer.roblox.com/en-us/api-reference/class/StarterCharacterScripts","Stats":"https://developer.roblox.com/en-us/api-reference/class/Stats","StatsItem":"https://developer.roblox.com/en-us/api-reference/class/StatsItem","RunningAverageItemDouble":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageItemDouble","RunningAverageItemInt":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageItemInt","RunningAverageTimeIntervalItem":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageTimeIntervalItem","TotalCountTimeIntervalItem":"https://developer.roblox.com/en-us/api-reference/class/TotalCountTimeIntervalItem","StopWatchReporter":"https://developer.roblox.com/en-us/api-reference/class/StopWatchReporter","StreamingService":"https://developer.roblox.com/en-us/api-reference/class/StreamingService","Studio":"https://developer.roblox.com/en-us/api-reference/class/Studio","StudioAssetService":"https://developer.roblox.com/en-us/api-reference/class/StudioAssetService","StudioCallout":"https://developer.roblox.com/en-us/api-reference/class/StudioCallout","StudioData":"https://developer.roblox.com/en-us/api-reference/class/StudioData","StudioDeviceEmulatorService":"https://developer.roblox.com/en-us/api-reference/class/StudioDeviceEmulatorService","StudioObjectBase":"https://developer.roblox.com/en-us/api-reference/class/StudioObjectBase","StudioWidget":"https://developer.roblox.com/en-us/api-reference/class/StudioWidget","StudioPublishService":"https://developer.roblox.com/en-us/api-reference/class/StudioPublishService","StudioScriptDebugEventListener":"https://developer.roblox.com/en-us/api-reference/class/StudioScriptDebugEventListener","StudioSdkService":"https://developer.roblox.com/en-us/api-reference/class/StudioSdkService","StudioService":"https://developer.roblox.com/en-us/api-reference/class/StudioService","StudioTheme":"https://developer.roblox.com/en-us/api-reference/class/StudioTheme","StyleBase":"https://developer.roblox.com/en-us/api-reference/class/StyleBase","StyleRule":"https://developer.roblox.com/en-us/api-reference/class/StyleRule","StyleSheet":"https://developer.roblox.com/en-us/api-reference/class/StyleSheet","StyleDerive":"https://developer.roblox.com/en-us/api-reference/class/StyleDerive","StyleLink":"https://developer.roblox.com/en-us/api-reference/class/StyleLink","StylingService":"https://developer.roblox.com/en-us/api-reference/class/StylingService","SurfaceAppearance":"https://developer.roblox.com/en-us/api-reference/class/SurfaceAppearance","TaskScheduler":"https://developer.roblox.com/en-us/api-reference/class/TaskScheduler","Team":"https://developer.roblox.com/en-us/api-reference/class/Team","TeamCreateData":"https://developer.roblox.com/en-us/api-reference/class/TeamCreateData","TeamCreatePublishService":"https://developer.roblox.com/en-us/api-reference/class/TeamCreatePublishService","TeamCreateService":"https://developer.roblox.com/en-us/api-reference/class/TeamCreateService","Teams":"https://developer.roblox.com/en-us/api-reference/class/Teams","TeleportAsyncResult":"https://developer.roblox.com/en-us/api-reference/class/TeleportAsyncResult","TeleportOptions":"https://developer.roblox.com/en-us/api-reference/class/TeleportOptions","TeleportService":"https://developer.roblox.com/en-us/api-reference/class/TeleportService","TemporaryCageMeshProvider":"https://developer.roblox.com/en-us/api-reference/class/TemporaryCageMeshProvider","TemporaryScriptService":"https://developer.roblox.com/en-us/api-reference/class/TemporaryScriptService","TerrainDetail":"https://developer.roblox.com/en-us/api-reference/class/TerrainDetail","TerrainRegion":"https://developer.roblox.com/en-us/api-reference/class/TerrainRegion","TestService":"https://developer.roblox.com/en-us/api-reference/class/TestService","TextBoxService":"https://developer.roblox.com/en-us/api-reference/class/TextBoxService","TextChannel":"https://developer.roblox.com/en-us/api-reference/class/TextChannel","TextChatCommand":"https://developer.roblox.com/en-us/api-reference/class/TextChatCommand","TextChatConfigurations":"https://developer.roblox.com/en-us/api-reference/class/TextChatConfigurations","BubbleChatConfiguration":"https://developer.roblox.com/en-us/api-reference/class/BubbleChatConfiguration","ChatInputBarConfiguration":"https://developer.roblox.com/en-us/api-reference/class/ChatInputBarConfiguration","ChatWindowConfiguration":"https://developer.roblox.com/en-us/api-reference/class/ChatWindowConfiguration","TextChatMessage":"https://developer.roblox.com/en-us/api-reference/class/TextChatMessage","TextChatMessageProperties":"https://developer.roblox.com/en-us/api-reference/class/TextChatMessageProperties","TextChatService":"https://developer.roblox.com/en-us/api-reference/class/TextChatService","TextFilterResult":"https://developer.roblox.com/en-us/api-reference/class/TextFilterResult","TextFilterTranslatedResult":"https://developer.roblox.com/en-us/api-reference/class/TextFilterTranslatedResult","TextService":"https://developer.roblox.com/en-us/api-reference/class/TextService","TextSource":"https://developer.roblox.com/en-us/api-reference/class/TextSource","ThirdPartyUserService":"https://developer.roblox.com/en-us/api-reference/class/ThirdPartyUserService","ThreadState":"https://developer.roblox.com/en-us/api-reference/class/ThreadState","TimerService":"https://developer.roblox.com/en-us/api-reference/class/TimerService","ToastNotificationService":"https://developer.roblox.com/en-us/api-reference/class/ToastNotificationService","TouchInputService":"https://developer.roblox.com/en-us/api-reference/class/TouchInputService","TouchTransmitter":"https://developer.roblox.com/en-us/api-reference/class/TouchTransmitter","TracerService":"https://developer.roblox.com/en-us/api-reference/class/TracerService","TrackerLodController":"https://developer.roblox.com/en-us/api-reference/class/TrackerLodController","TrackerStreamAnimation":"https://developer.roblox.com/en-us/api-reference/class/TrackerStreamAnimation","Trail":"https://developer.roblox.com/en-us/api-reference/class/Trail","Translator":"https://developer.roblox.com/en-us/api-reference/class/Translator","TutorialService":"https://developer.roblox.com/en-us/api-reference/class/TutorialService","TweenBase":"https://developer.roblox.com/en-us/api-reference/class/TweenBase","Tween":"https://developer.roblox.com/en-us/api-reference/class/Tween","TweenService":"https://developer.roblox.com/en-us/api-reference/class/TweenService","UGCAvatarService":"https://developer.roblox.com/en-us/api-reference/class/UGCAvatarService","UGCValidationService":"https://developer.roblox.com/en-us/api-reference/class/UGCValidationService","UIBase":"https://developer.roblox.com/en-us/api-reference/class/UIBase","UIComponent":"https://developer.roblox.com/en-us/api-reference/class/UIComponent","UIConstraint":"https://developer.roblox.com/en-us/api-reference/class/UIConstraint","UIAspectRatioConstraint":"https://developer.roblox.com/en-us/api-reference/class/UIAspectRatioConstraint","UISizeConstraint":"https://developer.roblox.com/en-us/api-reference/class/UISizeConstraint","UITextSizeConstraint":"https://developer.roblox.com/en-us/api-reference/class/UITextSizeConstraint","UICorner":"https://developer.roblox.com/en-us/api-reference/class/UICorner","UIGradient":"https://developer.roblox.com/en-us/api-reference/class/UIGradient","UILayout":"https://developer.roblox.com/en-us/api-reference/class/UILayout","UIGridStyleLayout":"https://developer.roblox.com/en-us/api-reference/class/UIGridStyleLayout","UIGridLayout":"https://developer.roblox.com/en-us/api-reference/class/UIGridLayout","UIListLayout":"https://developer.roblox.com/en-us/api-reference/class/UIListLayout","UIPageLayout":"https://developer.roblox.com/en-us/api-reference/class/UIPageLayout","UITableLayout":"https://developer.roblox.com/en-us/api-reference/class/UITableLayout","UIPadding":"https://developer.roblox.com/en-us/api-reference/class/UIPadding","UIScale":"https://developer.roblox.com/en-us/api-reference/class/UIScale","UIStroke":"https://developer.roblox.com/en-us/api-reference/class/UIStroke","UnvalidatedAssetService":"https://developer.roblox.com/en-us/api-reference/class/UnvalidatedAssetService","UserGameSettings":"https://developer.roblox.com/en-us/api-reference/class/UserGameSettings","UserInputService":"https://developer.roblox.com/en-us/api-reference/class/UserInputService","UserNotification":"https://developer.roblox.com/en-us/api-reference/class/UserNotification","UserNotificationPayload":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayload","UserNotificationPayloadAnalyticsData":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayloadAnalyticsData","UserNotificationPayloadJoinExperience":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayloadJoinExperience","UserNotificationPayloadParameterValue":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayloadParameterValue","UserService":"https://developer.roblox.com/en-us/api-reference/class/UserService","VRService":"https://developer.roblox.com/en-us/api-reference/class/VRService","VRStatusService":"https://developer.roblox.com/en-us/api-reference/class/VRStatusService","ValueBase":"https://developer.roblox.com/en-us/api-reference/class/ValueBase","BinaryStringValue":"https://developer.roblox.com/en-us/api-reference/class/BinaryStringValue","BoolValue":"https://developer.roblox.com/en-us/api-reference/class/BoolValue","BrickColorValue":"https://developer.roblox.com/en-us/api-reference/class/BrickColorValue","CFrameValue":"https://developer.roblox.com/en-us/api-reference/class/CFrameValue","Color3Value":"https://developer.roblox.com/en-us/api-reference/class/Color3Value","DoubleConstrainedValue":"https://developer.roblox.com/en-us/api-reference/class/DoubleConstrainedValue","IntConstrainedValue":"https://developer.roblox.com/en-us/api-reference/class/IntConstrainedValue","IntValue":"https://developer.roblox.com/en-us/api-reference/class/IntValue","NumberValue":"https://developer.roblox.com/en-us/api-reference/class/NumberValue","ObjectValue":"https://developer.roblox.com/en-us/api-reference/class/ObjectValue","RayValue":"https://developer.roblox.com/en-us/api-reference/class/RayValue","StringValue":"https://developer.roblox.com/en-us/api-reference/class/StringValue","Vector3Value":"https://developer.roblox.com/en-us/api-reference/class/Vector3Value","Vector3Curve":"https://developer.roblox.com/en-us/api-reference/class/Vector3Curve","VersionControlService":"https://developer.roblox.com/en-us/api-reference/class/VersionControlService","VideoCaptureService":"https://developer.roblox.com/en-us/api-reference/class/VideoCaptureService","VideoService":"https://developer.roblox.com/en-us/api-reference/class/VideoService","VirtualInputManager":"https://developer.roblox.com/en-us/api-reference/class/VirtualInputManager","VirtualUser":"https://developer.roblox.com/en-us/api-reference/class/VirtualUser","VisibilityCheckDispatcher":"https://developer.roblox.com/en-us/api-reference/class/VisibilityCheckDispatcher","VisibilityService":"https://developer.roblox.com/en-us/api-reference/class/VisibilityService","Visit":"https://developer.roblox.com/en-us/api-reference/class/Visit","VoiceChatInternal":"https://developer.roblox.com/en-us/api-reference/class/VoiceChatInternal","VoiceChatService":"https://developer.roblox.com/en-us/api-reference/class/VoiceChatService","WeldConstraint":"https://developer.roblox.com/en-us/api-reference/class/WeldConstraint","Wire":"https://developer.roblox.com/en-us/api-reference/class/Wire","AccessModifierType":"https://developer.roblox.com/en-us/api-reference/enum/AccessModifierType","AccessoryType":"https://developer.roblox.com/en-us/api-reference/enum/AccessoryType","ActionType":"https://developer.roblox.com/en-us/api-reference/enum/ActionType","ActuatorRelativeTo":"https://developer.roblox.com/en-us/api-reference/enum/ActuatorRelativeTo","ActuatorType":"https://developer.roblox.com/en-us/api-reference/enum/ActuatorType","AdShape":"https://developer.roblox.com/en-us/api-reference/enum/AdShape","AdTeleportMethod":"https://developer.roblox.com/en-us/api-reference/enum/AdTeleportMethod","AdUnitStatus":"https://developer.roblox.com/en-us/api-reference/enum/AdUnitStatus","AdornCullingMode":"https://developer.roblox.com/en-us/api-reference/enum/AdornCullingMode","AlignType":"https://developer.roblox.com/en-us/api-reference/enum/AlignType","AlphaMode":"https://developer.roblox.com/en-us/api-reference/enum/AlphaMode","AnalyticsEconomyAction":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsEconomyAction","AnalyticsLogLevel":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsLogLevel","AnalyticsProgressionStatus":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsProgressionStatus","AnimationPriority":"https://developer.roblox.com/en-us/api-reference/enum/AnimationPriority","AnimatorRetargetingMode":"https://developer.roblox.com/en-us/api-reference/enum/AnimatorRetargetingMode","AppShellActionType":"https://developer.roblox.com/en-us/api-reference/enum/AppShellActionType","AppShellFeature":"https://developer.roblox.com/en-us/api-reference/enum/AppShellFeature","AppUpdateStatus":"https://developer.roblox.com/en-us/api-reference/enum/AppUpdateStatus","ApplyStrokeMode":"https://developer.roblox.com/en-us/api-reference/enum/ApplyStrokeMode","AspectType":"https://developer.roblox.com/en-us/api-reference/enum/AspectType","AssetCreatorType":"https://developer.roblox.com/en-us/api-reference/enum/AssetCreatorType","AssetFetchStatus":"https://developer.roblox.com/en-us/api-reference/enum/AssetFetchStatus","AssetType":"https://developer.roblox.com/en-us/api-reference/enum/AssetType","AssetTypeVerification":"https://developer.roblox.com/en-us/api-reference/enum/AssetTypeVerification","AudioSubType":"https://developer.roblox.com/en-us/api-reference/enum/AudioSubType","AudioWindowSize":"https://developer.roblox.com/en-us/api-reference/enum/AudioWindowSize","AutoIndentRule":"https://developer.roblox.com/en-us/api-reference/enum/AutoIndentRule","AutomaticSize":"https://developer.roblox.com/en-us/api-reference/enum/AutomaticSize","AvatarAssetType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarAssetType","AvatarChatServiceFeature":"https://developer.roblox.com/en-us/api-reference/enum/AvatarChatServiceFeature","AvatarContextMenuOption":"https://developer.roblox.com/en-us/api-reference/enum/AvatarContextMenuOption","AvatarItemType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarItemType","AvatarJointUpgrade":"https://developer.roblox.com/en-us/api-reference/enum/AvatarJointUpgrade","AvatarPromptResult":"https://developer.roblox.com/en-us/api-reference/enum/AvatarPromptResult","AvatarThumbnailCustomizationType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarThumbnailCustomizationType","AvatarUnificationMode":"https://developer.roblox.com/en-us/api-reference/enum/AvatarUnificationMode","Axis":"https://developer.roblox.com/en-us/api-reference/enum/Axis","BinType":"https://developer.roblox.com/en-us/api-reference/enum/BinType","BodyPart":"https://developer.roblox.com/en-us/api-reference/enum/BodyPart","BodyPartR15":"https://developer.roblox.com/en-us/api-reference/enum/BodyPartR15","BorderMode":"https://developer.roblox.com/en-us/api-reference/enum/BorderMode","BreakReason":"https://developer.roblox.com/en-us/api-reference/enum/BreakReason","BreakpointRemoveReason":"https://developer.roblox.com/en-us/api-reference/enum/BreakpointRemoveReason","BulkMoveMode":"https://developer.roblox.com/en-us/api-reference/enum/BulkMoveMode","BundleType":"https://developer.roblox.com/en-us/api-reference/enum/BundleType","Button":"https://developer.roblox.com/en-us/api-reference/enum/Button","ButtonStyle":"https://developer.roblox.com/en-us/api-reference/enum/ButtonStyle","CageType":"https://developer.roblox.com/en-us/api-reference/enum/CageType","CameraMode":"https://developer.roblox.com/en-us/api-reference/enum/CameraMode","CameraPanMode":"https://developer.roblox.com/en-us/api-reference/enum/CameraPanMode","CameraType":"https://developer.roblox.com/en-us/api-reference/enum/CameraType","CatalogCategoryFilter":"https://developer.roblox.com/en-us/api-reference/enum/CatalogCategoryFilter","CatalogSortAggregation":"https://developer.roblox.com/en-us/api-reference/enum/CatalogSortAggregation","CatalogSortType":"https://developer.roblox.com/en-us/api-reference/enum/CatalogSortType","CellBlock":"https://developer.roblox.com/en-us/api-reference/enum/CellBlock","CellMaterial":"https://developer.roblox.com/en-us/api-reference/enum/CellMaterial","CellOrientation":"https://developer.roblox.com/en-us/api-reference/enum/CellOrientation","CenterDialogType":"https://developer.roblox.com/en-us/api-reference/enum/CenterDialogType","ChatCallbackType":"https://developer.roblox.com/en-us/api-reference/enum/ChatCallbackType","ChatColor":"https://developer.roblox.com/en-us/api-reference/enum/ChatColor","ChatMode":"https://developer.roblox.com/en-us/api-reference/enum/ChatMode","ChatPrivacyMode":"https://developer.roblox.com/en-us/api-reference/enum/ChatPrivacyMode","ChatStyle":"https://developer.roblox.com/en-us/api-reference/enum/ChatStyle","ChatVersion":"https://developer.roblox.com/en-us/api-reference/enum/ChatVersion","ClientAnimatorThrottlingMode":"https://developer.roblox.com/en-us/api-reference/enum/ClientAnimatorThrottlingMode","CollaboratorStatus":"https://developer.roblox.com/en-us/api-reference/enum/CollaboratorStatus","CollisionFidelity":"https://developer.roblox.com/en-us/api-reference/enum/CollisionFidelity","CommandPermission":"https://developer.roblox.com/en-us/api-reference/enum/CommandPermission","CompileTarget":"https://developer.roblox.com/en-us/api-reference/enum/CompileTarget","CompletionItemKind":"https://developer.roblox.com/en-us/api-reference/enum/CompletionItemKind","CompletionItemTag":"https://developer.roblox.com/en-us/api-reference/enum/CompletionItemTag","CompletionTriggerKind":"https://developer.roblox.com/en-us/api-reference/enum/CompletionTriggerKind","ComputerCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/ComputerCameraMovementMode","ComputerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/ComputerMovementMode","ConnectionError":"https://developer.roblox.com/en-us/api-reference/enum/ConnectionError","ConnectionState":"https://developer.roblox.com/en-us/api-reference/enum/ConnectionState","ContextActionPriority":"https://developer.roblox.com/en-us/api-reference/enum/ContextActionPriority","ContextActionResult":"https://developer.roblox.com/en-us/api-reference/enum/ContextActionResult","ControlMode":"https://developer.roblox.com/en-us/api-reference/enum/ControlMode","CoreGuiType":"https://developer.roblox.com/en-us/api-reference/enum/CoreGuiType","CreateOutfitFailure":"https://developer.roblox.com/en-us/api-reference/enum/CreateOutfitFailure","CreatorType":"https://developer.roblox.com/en-us/api-reference/enum/CreatorType","CreatorTypeFilter":"https://developer.roblox.com/en-us/api-reference/enum/CreatorTypeFilter","CurrencyType":"https://developer.roblox.com/en-us/api-reference/enum/CurrencyType","CustomCameraMode":"https://developer.roblox.com/en-us/api-reference/enum/CustomCameraMode","DataStoreRequestType":"https://developer.roblox.com/en-us/api-reference/enum/DataStoreRequestType","DeathStyle":"https://developer.roblox.com/en-us/api-reference/enum/DeathStyle","DebuggerEndReason":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerEndReason","DebuggerExceptionBreakMode":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerExceptionBreakMode","DebuggerFrameType":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerFrameType","DebuggerPauseReason":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerPauseReason","DebuggerStatus":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerStatus","DevCameraOcclusionMode":"https://developer.roblox.com/en-us/api-reference/enum/DevCameraOcclusionMode","DevComputerCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevComputerCameraMovementMode","DevComputerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevComputerMovementMode","DevTouchCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevTouchCameraMovementMode","DevTouchMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevTouchMovementMode","DeveloperMemoryTag":"https://developer.roblox.com/en-us/api-reference/enum/DeveloperMemoryTag","DeviceType":"https://developer.roblox.com/en-us/api-reference/enum/DeviceType","DialogBehaviorType":"https://developer.roblox.com/en-us/api-reference/enum/DialogBehaviorType","DialogPurpose":"https://developer.roblox.com/en-us/api-reference/enum/DialogPurpose","DialogTone":"https://developer.roblox.com/en-us/api-reference/enum/DialogTone","DominantAxis":"https://developer.roblox.com/en-us/api-reference/enum/DominantAxis","DraftStatusCode":"https://developer.roblox.com/en-us/api-reference/enum/DraftStatusCode","DragDetectorDragStyle":"https://developer.roblox.com/en-us/api-reference/enum/DragDetectorDragStyle","DragDetectorResponseStyle":"https://developer.roblox.com/en-us/api-reference/enum/DragDetectorResponseStyle","DraggerCoordinateSpace":"https://developer.roblox.com/en-us/api-reference/enum/DraggerCoordinateSpace","DraggerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DraggerMovementMode","EasingDirection":"https://developer.roblox.com/en-us/api-reference/enum/EasingDirection","EasingStyle":"https://developer.roblox.com/en-us/api-reference/enum/EasingStyle","ElasticBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ElasticBehavior","EnviromentalPhysicsThrottle":"https://developer.roblox.com/en-us/api-reference/enum/EnviromentalPhysicsThrottle","ExperienceAuthScope":"https://developer.roblox.com/en-us/api-reference/enum/ExperienceAuthScope","ExplosionType":"https://developer.roblox.com/en-us/api-reference/enum/ExplosionType","FacialAnimationStreamingState":"https://developer.roblox.com/en-us/api-reference/enum/FacialAnimationStreamingState","FieldOfViewMode":"https://developer.roblox.com/en-us/api-reference/enum/FieldOfViewMode","FillDirection":"https://developer.roblox.com/en-us/api-reference/enum/FillDirection","FilterResult":"https://developer.roblox.com/en-us/api-reference/enum/FilterResult","FinishRecordingOperation":"https://developer.roblox.com/en-us/api-reference/enum/FinishRecordingOperation","FluidForces":"https://developer.roblox.com/en-us/api-reference/enum/FluidForces","Font":"https://developer.roblox.com/en-us/api-reference/enum/Font","FontSize":"https://developer.roblox.com/en-us/api-reference/enum/FontSize","FontStyle":"https://developer.roblox.com/en-us/api-reference/enum/FontStyle","FontWeight":"https://developer.roblox.com/en-us/api-reference/enum/FontWeight","ForceLimitMode":"https://developer.roblox.com/en-us/api-reference/enum/ForceLimitMode","FormFactor":"https://developer.roblox.com/en-us/api-reference/enum/FormFactor","FrameStyle":"https://developer.roblox.com/en-us/api-reference/enum/FrameStyle","FramerateManagerMode":"https://developer.roblox.com/en-us/api-reference/enum/FramerateManagerMode","FriendRequestEvent":"https://developer.roblox.com/en-us/api-reference/enum/FriendRequestEvent","FriendStatus":"https://developer.roblox.com/en-us/api-reference/enum/FriendStatus","FunctionalTestResult":"https://developer.roblox.com/en-us/api-reference/enum/FunctionalTestResult","GameAvatarType":"https://developer.roblox.com/en-us/api-reference/enum/GameAvatarType","GearGenreSetting":"https://developer.roblox.com/en-us/api-reference/enum/GearGenreSetting","GearType":"https://developer.roblox.com/en-us/api-reference/enum/GearType","Genre":"https://developer.roblox.com/en-us/api-reference/enum/Genre","GraphicsMode":"https://developer.roblox.com/en-us/api-reference/enum/GraphicsMode","GuiState":"https://developer.roblox.com/en-us/api-reference/enum/GuiState","GuiType":"https://developer.roblox.com/en-us/api-reference/enum/GuiType","HandlesStyle":"https://developer.roblox.com/en-us/api-reference/enum/HandlesStyle","HighlightDepthMode":"https://developer.roblox.com/en-us/api-reference/enum/HighlightDepthMode","HorizontalAlignment":"https://developer.roblox.com/en-us/api-reference/enum/HorizontalAlignment","HoverAnimateSpeed":"https://developer.roblox.com/en-us/api-reference/enum/HoverAnimateSpeed","HttpCachePolicy":"https://developer.roblox.com/en-us/api-reference/enum/HttpCachePolicy","HttpContentType":"https://developer.roblox.com/en-us/api-reference/enum/HttpContentType","HttpError":"https://developer.roblox.com/en-us/api-reference/enum/HttpError","HttpRequestType":"https://developer.roblox.com/en-us/api-reference/enum/HttpRequestType","HumanoidCollisionType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidCollisionType","HumanoidDisplayDistanceType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidDisplayDistanceType","HumanoidHealthDisplayType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidHealthDisplayType","HumanoidOnlySetCollisionsOnStateChange":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidOnlySetCollisionsOnStateChange","HumanoidRigType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidRigType","HumanoidStateMachineMode":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidStateMachineMode","HumanoidStateType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidStateType","IKCollisionsMode":"https://developer.roblox.com/en-us/api-reference/enum/IKCollisionsMode","IKControlConstraintSupport":"https://developer.roblox.com/en-us/api-reference/enum/IKControlConstraintSupport","IKControlType":"https://developer.roblox.com/en-us/api-reference/enum/IKControlType","IXPLoadingStatus":"https://developer.roblox.com/en-us/api-reference/enum/IXPLoadingStatus","ImageCombineType":"https://developer.roblox.com/en-us/api-reference/enum/ImageCombineType","InOut":"https://developer.roblox.com/en-us/api-reference/enum/InOut","InfoType":"https://developer.roblox.com/en-us/api-reference/enum/InfoType","InitialDockState":"https://developer.roblox.com/en-us/api-reference/enum/InitialDockState","InputType":"https://developer.roblox.com/en-us/api-reference/enum/InputType","InterpolationThrottlingMode":"https://developer.roblox.com/en-us/api-reference/enum/InterpolationThrottlingMode","JointCreationMode":"https://developer.roblox.com/en-us/api-reference/enum/JointCreationMode","KeyCode":"https://developer.roblox.com/en-us/api-reference/enum/KeyCode","KeyInterpolationMode":"https://developer.roblox.com/en-us/api-reference/enum/KeyInterpolationMode","KeywordFilterType":"https://developer.roblox.com/en-us/api-reference/enum/KeywordFilterType","Language":"https://developer.roblox.com/en-us/api-reference/enum/Language","LeftRight":"https://developer.roblox.com/en-us/api-reference/enum/LeftRight","Limb":"https://developer.roblox.com/en-us/api-reference/enum/Limb","LineJoinMode":"https://developer.roblox.com/en-us/api-reference/enum/LineJoinMode","ListDisplayMode":"https://developer.roblox.com/en-us/api-reference/enum/ListDisplayMode","ListenerType":"https://developer.roblox.com/en-us/api-reference/enum/ListenerType","LiveEditingAtomicUpdateResponse":"https://developer.roblox.com/en-us/api-reference/enum/LiveEditingAtomicUpdateResponse","LoadCharacterLayeredClothing":"https://developer.roblox.com/en-us/api-reference/enum/LoadCharacterLayeredClothing","LoadDynamicHeads":"https://developer.roblox.com/en-us/api-reference/enum/LoadDynamicHeads","MarkupKind":"https://developer.roblox.com/en-us/api-reference/enum/MarkupKind","Material":"https://developer.roblox.com/en-us/api-reference/enum/Material","MaterialPattern":"https://developer.roblox.com/en-us/api-reference/enum/MaterialPattern","MembershipType":"https://developer.roblox.com/en-us/api-reference/enum/MembershipType","MeshPartDetailLevel":"https://developer.roblox.com/en-us/api-reference/enum/MeshPartDetailLevel","MeshPartHeadsAndAccessories":"https://developer.roblox.com/en-us/api-reference/enum/MeshPartHeadsAndAccessories","MeshScaleUnit":"https://developer.roblox.com/en-us/api-reference/enum/MeshScaleUnit","MeshType":"https://developer.roblox.com/en-us/api-reference/enum/MeshType","MessageType":"https://developer.roblox.com/en-us/api-reference/enum/MessageType","ModelLevelOfDetail":"https://developer.roblox.com/en-us/api-reference/enum/ModelLevelOfDetail","ModelStreamingBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ModelStreamingBehavior","ModelStreamingMode":"https://developer.roblox.com/en-us/api-reference/enum/ModelStreamingMode","ModifierKey":"https://developer.roblox.com/en-us/api-reference/enum/ModifierKey","MouseBehavior":"https://developer.roblox.com/en-us/api-reference/enum/MouseBehavior","MoveState":"https://developer.roblox.com/en-us/api-reference/enum/MoveState","MuteState":"https://developer.roblox.com/en-us/api-reference/enum/MuteState","NameOcclusion":"https://developer.roblox.com/en-us/api-reference/enum/NameOcclusion","NetworkOwnership":"https://developer.roblox.com/en-us/api-reference/enum/NetworkOwnership","NormalId":"https://developer.roblox.com/en-us/api-reference/enum/NormalId","OrientationAlignmentMode":"https://developer.roblox.com/en-us/api-reference/enum/OrientationAlignmentMode","OutfitSource":"https://developer.roblox.com/en-us/api-reference/enum/OutfitSource","OutfitType":"https://developer.roblox.com/en-us/api-reference/enum/OutfitType","OutputLayoutMode":"https://developer.roblox.com/en-us/api-reference/enum/OutputLayoutMode","OverrideMouseIconBehavior":"https://developer.roblox.com/en-us/api-reference/enum/OverrideMouseIconBehavior","PackagePermission":"https://developer.roblox.com/en-us/api-reference/enum/PackagePermission","PartType":"https://developer.roblox.com/en-us/api-reference/enum/PartType","ParticleEmitterShape":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShape","ParticleEmitterShapeInOut":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShapeInOut","ParticleEmitterShapeStyle":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShapeStyle","ParticleFlipbookLayout":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookLayout","ParticleFlipbookMode":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookMode","ParticleFlipbookTextureCompatible":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookTextureCompatible","ParticleOrientation":"https://developer.roblox.com/en-us/api-reference/enum/ParticleOrientation","PathStatus":"https://developer.roblox.com/en-us/api-reference/enum/PathStatus","PathWaypointAction":"https://developer.roblox.com/en-us/api-reference/enum/PathWaypointAction","PermissionLevelShown":"https://developer.roblox.com/en-us/api-reference/enum/PermissionLevelShown","PhysicsSimulationRate":"https://developer.roblox.com/en-us/api-reference/enum/PhysicsSimulationRate","PhysicsSteppingMethod":"https://developer.roblox.com/en-us/api-reference/enum/PhysicsSteppingMethod","PlaybackState":"https://developer.roblox.com/en-us/api-reference/enum/PlaybackState","PlayerActions":"https://developer.roblox.com/en-us/api-reference/enum/PlayerActions","PlayerChatType":"https://developer.roblox.com/en-us/api-reference/enum/PlayerChatType","PoseEasingDirection":"https://developer.roblox.com/en-us/api-reference/enum/PoseEasingDirection","PoseEasingStyle":"https://developer.roblox.com/en-us/api-reference/enum/PoseEasingStyle","PositionAlignmentMode":"https://developer.roblox.com/en-us/api-reference/enum/PositionAlignmentMode","PrivilegeType":"https://developer.roblox.com/en-us/api-reference/enum/PrivilegeType","ProductLocationRestriction":"https://developer.roblox.com/en-us/api-reference/enum/ProductLocationRestriction","ProductPurchaseDecision":"https://developer.roblox.com/en-us/api-reference/enum/ProductPurchaseDecision","PromptCreateAssetResult":"https://developer.roblox.com/en-us/api-reference/enum/PromptCreateAssetResult","PromptPublishAssetResult":"https://developer.roblox.com/en-us/api-reference/enum/PromptPublishAssetResult","PropertyStatus":"https://developer.roblox.com/en-us/api-reference/enum/PropertyStatus","ProximityPromptExclusivity":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptExclusivity","ProximityPromptInputType":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptInputType","ProximityPromptStyle":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptStyle","QualityLevel":"https://developer.roblox.com/en-us/api-reference/enum/QualityLevel","R15CollisionType":"https://developer.roblox.com/en-us/api-reference/enum/R15CollisionType","RaycastFilterType":"https://developer.roblox.com/en-us/api-reference/enum/RaycastFilterType","RejectCharacterDeletions":"https://developer.roblox.com/en-us/api-reference/enum/RejectCharacterDeletions","RenderFidelity":"https://developer.roblox.com/en-us/api-reference/enum/RenderFidelity","RenderPriority":"https://developer.roblox.com/en-us/api-reference/enum/RenderPriority","RenderingTestComparisonMethod":"https://developer.roblox.com/en-us/api-reference/enum/RenderingTestComparisonMethod","ReplicateInstanceDestroySetting":"https://developer.roblox.com/en-us/api-reference/enum/ReplicateInstanceDestroySetting","ResamplerMode":"https://developer.roblox.com/en-us/api-reference/enum/ResamplerMode","ReservedHighlightId":"https://developer.roblox.com/en-us/api-reference/enum/ReservedHighlightId","RestPose":"https://developer.roblox.com/en-us/api-reference/enum/RestPose","ReturnKeyType":"https://developer.roblox.com/en-us/api-reference/enum/ReturnKeyType","ReverbType":"https://developer.roblox.com/en-us/api-reference/enum/ReverbType","RibbonTool":"https://developer.roblox.com/en-us/api-reference/enum/RibbonTool","RigScale":"https://developer.roblox.com/en-us/api-reference/enum/RigScale","RigType":"https://developer.roblox.com/en-us/api-reference/enum/RigType","RollOffMode":"https://developer.roblox.com/en-us/api-reference/enum/RollOffMode","RotationOrder":"https://developer.roblox.com/en-us/api-reference/enum/RotationOrder","RotationType":"https://developer.roblox.com/en-us/api-reference/enum/RotationType","RtlTextSupport":"https://developer.roblox.com/en-us/api-reference/enum/RtlTextSupport","RunContext":"https://developer.roblox.com/en-us/api-reference/enum/RunContext","RuntimeUndoBehavior":"https://developer.roblox.com/en-us/api-reference/enum/RuntimeUndoBehavior","SafeAreaCompatibility":"https://developer.roblox.com/en-us/api-reference/enum/SafeAreaCompatibility","SalesTypeFilter":"https://developer.roblox.com/en-us/api-reference/enum/SalesTypeFilter","SaveAvatarThumbnailCustomizationFailure":"https://developer.roblox.com/en-us/api-reference/enum/SaveAvatarThumbnailCustomizationFailure","SaveFilter":"https://developer.roblox.com/en-us/api-reference/enum/SaveFilter","SavedQualitySetting":"https://developer.roblox.com/en-us/api-reference/enum/SavedQualitySetting","ScaleType":"https://developer.roblox.com/en-us/api-reference/enum/ScaleType","ScopeCheckResult":"https://developer.roblox.com/en-us/api-reference/enum/ScopeCheckResult","ScreenInsets":"https://developer.roblox.com/en-us/api-reference/enum/ScreenInsets","ScreenOrientation":"https://developer.roblox.com/en-us/api-reference/enum/ScreenOrientation","ScrollBarInset":"https://developer.roblox.com/en-us/api-reference/enum/ScrollBarInset","ScrollingDirection":"https://developer.roblox.com/en-us/api-reference/enum/ScrollingDirection","SelectionBehavior":"https://developer.roblox.com/en-us/api-reference/enum/SelectionBehavior","SelectionRenderMode":"https://developer.roblox.com/en-us/api-reference/enum/SelectionRenderMode","SelfViewPosition":"https://developer.roblox.com/en-us/api-reference/enum/SelfViewPosition","SensorMode":"https://developer.roblox.com/en-us/api-reference/enum/SensorMode","SensorUpdateType":"https://developer.roblox.com/en-us/api-reference/enum/SensorUpdateType","ServerAudioBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ServerAudioBehavior","ServiceVisibility":"https://developer.roblox.com/en-us/api-reference/enum/ServiceVisibility","Severity":"https://developer.roblox.com/en-us/api-reference/enum/Severity","SignalBehavior":"https://developer.roblox.com/en-us/api-reference/enum/SignalBehavior","SizeConstraint":"https://developer.roblox.com/en-us/api-reference/enum/SizeConstraint","SolverConvergenceMetricType":"https://developer.roblox.com/en-us/api-reference/enum/SolverConvergenceMetricType","SolverConvergenceVisualizationMode":"https://developer.roblox.com/en-us/api-reference/enum/SolverConvergenceVisualizationMode","SortDirection":"https://developer.roblox.com/en-us/api-reference/enum/SortDirection","SortOrder":"https://developer.roblox.com/en-us/api-reference/enum/SortOrder","SpecialKey":"https://developer.roblox.com/en-us/api-reference/enum/SpecialKey","StartCorner":"https://developer.roblox.com/en-us/api-reference/enum/StartCorner","StreamOutBehavior":"https://developer.roblox.com/en-us/api-reference/enum/StreamOutBehavior","StreamingIntegrityMode":"https://developer.roblox.com/en-us/api-reference/enum/StreamingIntegrityMode","StreamingPauseMode":"https://developer.roblox.com/en-us/api-reference/enum/StreamingPauseMode","StudioCloseMode":"https://developer.roblox.com/en-us/api-reference/enum/StudioCloseMode","StudioDataModelType":"https://developer.roblox.com/en-us/api-reference/enum/StudioDataModelType","StudioScriptEditorColorCategories":"https://developer.roblox.com/en-us/api-reference/enum/StudioScriptEditorColorCategories","StudioScriptEditorColorPresets":"https://developer.roblox.com/en-us/api-reference/enum/StudioScriptEditorColorPresets","StudioStyleGuideColor":"https://developer.roblox.com/en-us/api-reference/enum/StudioStyleGuideColor","StudioStyleGuideModifier":"https://developer.roblox.com/en-us/api-reference/enum/StudioStyleGuideModifier","Style":"https://developer.roblox.com/en-us/api-reference/enum/Style","SurfaceConstraint":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceConstraint","SurfaceGuiShape":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceGuiShape","SurfaceGuiSizingMode":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceGuiSizingMode","SurfaceType":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceType","SwipeDirection":"https://developer.roblox.com/en-us/api-reference/enum/SwipeDirection","TableMajorAxis":"https://developer.roblox.com/en-us/api-reference/enum/TableMajorAxis","Technology":"https://developer.roblox.com/en-us/api-reference/enum/Technology","TeleportMethod":"https://developer.roblox.com/en-us/api-reference/enum/TeleportMethod","TeleportResult":"https://developer.roblox.com/en-us/api-reference/enum/TeleportResult","TeleportState":"https://developer.roblox.com/en-us/api-reference/enum/TeleportState","TeleportType":"https://developer.roblox.com/en-us/api-reference/enum/TeleportType","TerrainAcquisitionMethod":"https://developer.roblox.com/en-us/api-reference/enum/TerrainAcquisitionMethod","TerrainFace":"https://developer.roblox.com/en-us/api-reference/enum/TerrainFace","TextChatMessageStatus":"https://developer.roblox.com/en-us/api-reference/enum/TextChatMessageStatus","TextDirection":"https://developer.roblox.com/en-us/api-reference/enum/TextDirection","TextFilterContext":"https://developer.roblox.com/en-us/api-reference/enum/TextFilterContext","TextInputType":"https://developer.roblox.com/en-us/api-reference/enum/TextInputType","TextTruncate":"https://developer.roblox.com/en-us/api-reference/enum/TextTruncate","TextXAlignment":"https://developer.roblox.com/en-us/api-reference/enum/TextXAlignment","TextYAlignment":"https://developer.roblox.com/en-us/api-reference/enum/TextYAlignment","TextureMode":"https://developer.roblox.com/en-us/api-reference/enum/TextureMode","TextureQueryType":"https://developer.roblox.com/en-us/api-reference/enum/TextureQueryType","ThreadPoolConfig":"https://developer.roblox.com/en-us/api-reference/enum/ThreadPoolConfig","ThrottlingPriority":"https://developer.roblox.com/en-us/api-reference/enum/ThrottlingPriority","ThumbnailSize":"https://developer.roblox.com/en-us/api-reference/enum/ThumbnailSize","ThumbnailType":"https://developer.roblox.com/en-us/api-reference/enum/ThumbnailType","TickCountSampleMethod":"https://developer.roblox.com/en-us/api-reference/enum/TickCountSampleMethod","TopBottom":"https://developer.roblox.com/en-us/api-reference/enum/TopBottom","TouchCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/TouchCameraMovementMode","TouchMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/TouchMovementMode","TrackerError":"https://developer.roblox.com/en-us/api-reference/enum/TrackerError","TrackerExtrapolationFlagMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerExtrapolationFlagMode","TrackerLodFlagMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerLodFlagMode","TrackerLodValueMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerLodValueMode","TrackerMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerMode","TrackerPromptEvent":"https://developer.roblox.com/en-us/api-reference/enum/TrackerPromptEvent","TriStateBoolean":"https://developer.roblox.com/en-us/api-reference/enum/TriStateBoolean","TweenStatus":"https://developer.roblox.com/en-us/api-reference/enum/TweenStatus","UITheme":"https://developer.roblox.com/en-us/api-reference/enum/UITheme","UiMessageType":"https://developer.roblox.com/en-us/api-reference/enum/UiMessageType","UsageContext":"https://developer.roblox.com/en-us/api-reference/enum/UsageContext","UserCFrame":"https://developer.roblox.com/en-us/api-reference/enum/UserCFrame","UserInputState":"https://developer.roblox.com/en-us/api-reference/enum/UserInputState","UserInputType":"https://developer.roblox.com/en-us/api-reference/enum/UserInputType","VRComfortSetting":"https://developer.roblox.com/en-us/api-reference/enum/VRComfortSetting","VRSafetyBubbleMode":"https://developer.roblox.com/en-us/api-reference/enum/VRSafetyBubbleMode","VRScaling":"https://developer.roblox.com/en-us/api-reference/enum/VRScaling","VRSessionState":"https://developer.roblox.com/en-us/api-reference/enum/VRSessionState","VRTouchpad":"https://developer.roblox.com/en-us/api-reference/enum/VRTouchpad","VRTouchpadMode":"https://developer.roblox.com/en-us/api-reference/enum/VRTouchpadMode","VelocityConstraintMode":"https://developer.roblox.com/en-us/api-reference/enum/VelocityConstraintMode","VerticalAlignment":"https://developer.roblox.com/en-us/api-reference/enum/VerticalAlignment","VerticalScrollBarPosition":"https://developer.roblox.com/en-us/api-reference/enum/VerticalScrollBarPosition","VibrationMotor":"https://developer.roblox.com/en-us/api-reference/enum/VibrationMotor","ViewMode":"https://developer.roblox.com/en-us/api-reference/enum/ViewMode","VirtualCursorMode":"https://developer.roblox.com/en-us/api-reference/enum/VirtualCursorMode","VirtualInputMode":"https://developer.roblox.com/en-us/api-reference/enum/VirtualInputMode","VoiceChatState":"https://developer.roblox.com/en-us/api-reference/enum/VoiceChatState","VolumetricAudio":"https://developer.roblox.com/en-us/api-reference/enum/VolumetricAudio","WaterDirection":"https://developer.roblox.com/en-us/api-reference/enum/WaterDirection","WaterForce":"https://developer.roblox.com/en-us/api-reference/enum/WaterForce","WeldConstraintPreserve":"https://developer.roblox.com/en-us/api-reference/enum/WeldConstraintPreserve","WrapLayerAutoSkin":"https://developer.roblox.com/en-us/api-reference/enum/WrapLayerAutoSkin","WrapLayerDebugMode":"https://developer.roblox.com/en-us/api-reference/enum/WrapLayerDebugMode","WrapTargetDebugMode":"https://developer.roblox.com/en-us/api-reference/enum/WrapTargetDebugMode","ZIndexBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ZIndexBehavior","Axes":"https://developer.roblox.com/en-us/api-reference/datatype/Axes","BrickColor":"https://developer.roblox.com/en-us/api-reference/datatype/BrickColor","CFrame":"https://developer.roblox.com/en-us/api-reference/datatype/CFrame","Color3":"https://developer.roblox.com/en-us/api-reference/datatype/Color3","ColorSequence":"https://developer.roblox.com/en-us/api-reference/datatype/ColorSequence","ColorSequenceKeypoint":"https://developer.roblox.com/en-us/api-reference/datatype/ColorSequenceKeypoint","DockWidgetPluginGuiInfo":"https://developer.roblox.com/en-us/api-reference/datatype/DockWidgetPluginGuiInfo","Enum":"https://developer.roblox.com/en-us/api-reference/datatype/Enum","EnumItem":"https://developer.roblox.com/en-us/api-reference/datatype/EnumItem","Enums":"https://developer.roblox.com/en-us/api-reference/datatype/Enums","Faces":"https://developer.roblox.com/en-us/api-reference/datatype/Faces","NumberRange":"https://developer.roblox.com/en-us/api-reference/datatype/NumberRange","NumberSequence":"https://developer.roblox.com/en-us/api-reference/datatype/NumberSequence","NumberSequenceKeypoint":"https://developer.roblox.com/en-us/api-reference/datatype/NumberSequenceKeypoint","PathWaypoint":"https://developer.roblox.com/en-us/api-reference/datatype/PathWaypoint","PhysicalProperties":"https://developer.roblox.com/en-us/api-reference/datatype/PhysicalProperties","Random":"https://developer.roblox.com/en-us/api-reference/datatype/Random","Ray":"https://developer.roblox.com/en-us/api-reference/datatype/Ray","RBXScriptConnection":"https://developer.roblox.com/en-us/api-reference/datatype/RBXScriptConnection","RBXScriptSignal":"https://developer.roblox.com/en-us/api-reference/datatype/RBXScriptSignal","Rect":"https://developer.roblox.com/en-us/api-reference/datatype/Rect","Region3":"https://developer.roblox.com/en-us/api-reference/datatype/Region3","Region3int16":"https://developer.roblox.com/en-us/api-reference/datatype/Region3int16","TweenInfo":"https://developer.roblox.com/en-us/api-reference/datatype/TweenInfo","UDim":"https://developer.roblox.com/en-us/api-reference/datatype/UDim","UDim2":"https://developer.roblox.com/en-us/api-reference/datatype/UDim2","Vector2":"https://developer.roblox.com/en-us/api-reference/datatype/Vector2","Vector2int16":"https://developer.roblox.com/en-us/api-reference/datatype/Vector2int16","Vector3":"https://developer.roblox.com/en-us/api-reference/datatype/Vector3","Vector3int16":"https://developer.roblox.com/en-us/api-reference/datatype/Vector3int16","Array":"/sift/api/Array","Dictionary":"/sift/api/Dictionary","Set":"/sift/api/Set","Sift":"/sift/api/Sift","None":"/sift/api/Sift#None"}')}}]); \ No newline at end of file diff --git a/assets/js/b571cfb1.53b29deb.js b/assets/js/b571cfb1.0e908777.js similarity index 55% rename from assets/js/b571cfb1.53b29deb.js rename to assets/js/b571cfb1.0e908777.js index e8866ad..e4b21e1 100644 --- a/assets/js/b571cfb1.53b29deb.js +++ b/assets/js/b571cfb1.0e908777.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[213],{63891:s=>{s.exports=JSON.parse('{"sourceUrl":"https://github.com/csqrl/sift/blob/main","baseUrl":"/sift/","classOrder":["Sift"],"apiCategories":[]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[213],{63891:s=>{s.exports=JSON.parse('{"sourceUrl":"https://github.com/cxmeel/sift/blob/main","baseUrl":"/sift/","classOrder":["Sift"],"apiCategories":[]}')}}]); \ No newline at end of file diff --git a/assets/js/f32ee857.32a54139.js b/assets/js/f32ee857.32a54139.js new file mode 100644 index 0000000..9d9716a --- /dev/null +++ b/assets/js/f32ee857.32a54139.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[977],{57160:e=>{e.exports=JSON.parse('{"functions":[{"name":"concat","desc":"Joins multiple arrays together into a single array.\\n\\n#### Aliases\\n\\n`join`, `merge`\\n\\n```lua\\nlocal table1 = { 1, 2, 3 }\\nlocal table2 = { 4, 5, 6 }\\n\\nlocal new = Concat(table1, table2) -- { 1, 2, 3, 4, 5, 6 }\\n```","params":[{"name":"...","desc":"The arrays to concatenate.","lua_type":"...any"}],"returns":[{"desc":"The concatenated array.","lua_type":"{T}"}],"function_type":"static","source":{"line":26,"path":"src/Array/concat.lua"}},{"name":"sort","desc":"Sorts an array.\\n\\n```lua\\nlocal array = { \\"a\\", \\"b\\", \\"c\\", \\"d\\", \\"e\\" }\\n\\nlocal new = Sort(array, function(a, b)\\n\\treturn a > b\\nend) -- { \\"e\\", \\"d\\", \\"c\\", \\"b\\", \\"a\\" }\\n```","params":[{"name":"array","desc":"The array to sort.","lua_type":"{T}"},{"name":"comparator?","desc":"The comparator function.","lua_type":"(a: T, b: T) -> boolean"}],"returns":[{"desc":"The sorted array.","lua_type":"{T}"}],"function_type":"static","source":{"line":22,"path":"src/Array/sort.lua"}},{"name":"pop","desc":"Removes an element from the end of the array, and returns\\nthe array with the popped elements removed.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Pop(array) -- { 1, 2 }\\nlocal new = Pop(array, 2) -- { 1 }\\n```","params":[{"name":"array","desc":"The array to pop an element from.","lua_type":"{T}"},{"name":"count?","desc":"The number of elements to pop.","lua_type":"number = 1"}],"returns":[{"desc":"An array with the popped elements removed.","lua_type":"{T}"}],"function_type":"static","source":{"line":20,"path":"src/Array/pop.lua"}},{"name":"copy","desc":"Copies an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Copy(array) -- { 1, 2, 3 }\\n\\nprint(new == array) -- false\\n```","params":[{"name":"array","desc":"The array to copy.","lua_type":"{T}"}],"returns":[{"desc":"The copied array.","lua_type":"{T}"}],"function_type":"static","source":{"line":19,"path":"src/Array/copy.lua"}},{"name":"push","desc":"Adds elements to the end of the array.\\n\\n#### Aliases\\n\\n`append`\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Push(array, 4, 5, 6) -- { 1, 2, 3, 4, 5, 6 }\\n```","params":[{"name":"array","desc":"The array to push an element to.","lua_type":"{T}"},{"name":"...","desc":"The elements to push.","lua_type":"...T"}],"returns":[{"desc":"The array with the pushed elements.","lua_type":"{T}"}],"function_type":"static","source":{"line":22,"path":"src/Array/push.lua"}},{"name":"update","desc":"Updates an array at the given index. If the value at the given index does\\nnot exist, `callback` will be called, and its return value will be used\\nas the value at the given index.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Update(array, 2, function(value)\\n\\treturn value + 1\\nend) -- { 2, 3, 3 }\\n\\nlocal new = Update(array, 4, function(value)\\n\\treturn value + 1\\nend, function(value)\\n\\treturn 10\\nend) -- { 1, 2, 3, 10 }\\n```","params":[{"name":"array","desc":"The array to update.","lua_type":"{T}"},{"name":"index","desc":"The index to update.","lua_type":"number"},{"name":"updater?","desc":"The updater function.","lua_type":"(value: T, index: number) -> T"},{"name":"callback?","desc":"The callback function.","lua_type":"(index: number) -> T"}],"returns":[{"desc":"The updated array.","lua_type":"{T}"}],"function_type":"static","source":{"line":44,"path":"src/Array/update.lua"}},{"name":"find","desc":"Finds the index of the first item in the array that matches the value. This is\\nmostly a wrapper around `table.find`, with the ability to specify a negative\\nnumber as the start index (to search relative to the end of the array).\\n\\n#### Aliases\\n`indexOf`\\n\\n```lua\\nlocal array = { \\"hello\\", \\"world\\", \\"hello\\" }\\n\\nlocal index = Find(array, \\"hello\\") -- 1\\nlocal index = Find(array, \\"hello\\", 2) -- 3\\n```","params":[{"name":"array","desc":"The array to search.","lua_type":"{T}"},{"name":"value?","desc":"The value to search for.","lua_type":"any"},{"name":"from?","desc":"The index to start searching from.","lua_type":"number"}],"returns":[{"desc":"The index of the first item in the array that matches the value.","lua_type":"number?"}],"function_type":"static","source":{"line":25,"path":"src/Array/find.lua"}},{"name":"first","desc":"Gets the first item in the array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = First(array) -- 1\\n```","params":[{"name":"array","desc":"The array to get the first item from.","lua_type":"{T}"}],"returns":[{"desc":"The first item in the array.","lua_type":"T"}],"function_type":"static","source":{"line":19,"path":"src/Array/first.lua"}},{"name":"map","desc":"Maps the array using the mapper function.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Map(array, function(value, index)\\n\\treturn value * 2\\nend) -- { 2, 4, 6 }\\n```","params":[{"name":"array","desc":"The array to map.","lua_type":"{T}"},{"name":"mapper","desc":"The mapper function.","lua_type":"(value: T, index: number, array: {T}) -> U?"}],"returns":[{"desc":"The mapped array.","lua_type":"{U}"}],"function_type":"static","source":{"line":20,"path":"src/Array/map.lua"}},{"name":"is","desc":"Checks if the given object is an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\nlocal dictionary = { hello = \\"world\\" }\\nlocal mixed = { 1, 2, hello = \\"world\\" }\\n\\nArray.is(array) -- true\\nArray.is(dictionary) -- false\\nArray.is(mixed) -- false\\n```","params":[{"name":"object","desc":"The object to check.","lua_type":"any"}],"returns":[{"desc":"Whether the object is an array.","lua_type":"boolean"}],"function_type":"static","source":{"line":21,"path":"src/Array/is.lua"}},{"name":"reverse","desc":"Reverses the order of the items in an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Reverse(array) -- { 3, 2, 1 }\\n```","params":[{"name":"array","desc":"The array to reverse.","lua_type":"{T}"}],"returns":[{"desc":"The reversed array.","lua_type":"{T}"}],"function_type":"static","source":{"line":17,"path":"src/Array/reverse.lua"}},{"name":"zip","desc":"Zips multiple arrays together into a single array.\\n\\n```lua\\nlocal table1 = { 1, 2, 3 }\\nlocal table2 = { \\"hello\\", \\"world\\", \\"goodbye\\" }\\n\\nlocal new = Zip(table1, table2) -- { { 1, \\"hello\\" }, { 2, \\"world\\" }, { 3, \\"goodbye\\" } }\\n```","params":[{"name":"...","desc":"The arrays to zip together.","lua_type":"{any}"}],"returns":[{"desc":"The zipped array.","lua_type":"{any}"}],"function_type":"static","source":{"line":20,"path":"src/Array/zip.lua"}},{"name":"flatten","desc":"Flattens an array. If depth is not specified, it will flatten\\nthe array as far as it can go.\\n\\n```lua\\nlocal array = {\\n\\t{ 1, 2, 3 },\\n\\t{ 4, 5, 6 },\\n\\t{ 7, { 8, 9 } },\\n}\\n\\nlocal new = Flatten(array) -- { 1, 2, 3, 4, 5, 6, 7, 8, 9 }\\nlocal new = Flatten(array, 1) -- { 1, 2, 3, 4, 5, 6, 7, { 8, 9 } }\\n```","params":[{"name":"array","desc":"The array to flatten.","lua_type":"{T}"},{"name":"depth?","desc":"The depth to flatten the array to.","lua_type":"number"}],"returns":[{"desc":"The flattened array.","lua_type":"{T}"}],"function_type":"static","source":{"line":24,"path":"src/Array/flatten.lua"}},{"name":"includes","desc":"Checks whether the array contains the value. This is a wrapper\\naround `Find`.\\n\\n#### Aliases\\n\\n`contains`, `has`\\n\\n```lua\\nlocal array = { \\"hello\\", \\"world\\", \\"goodbye\\" }\\n\\nlocal value = Includes(array, \\"hello\\") -- true\\nlocal value = Includes(array, \\"sift\\") -- false\\nlocal value = Includes(array, \\"hello\\", 2) -- false\\n```","params":[{"name":"array","desc":"The array to search.","lua_type":"{T}"},{"name":"value","desc":"The value to search for.","lua_type":"any"},{"name":"from?","desc":"The index to start searching from.","lua_type":"number"}],"returns":[{"desc":"Whether the array contains the value.","lua_type":"boolean"}],"function_type":"static","source":{"line":28,"path":"src/Array/includes.lua"}},{"name":"removeValues","desc":"Removes values from an array.\\n\\n```lua\\nlocal array = { \\"a\\", \\"b\\", \\"c\\", \\"c\\", \\"d\\", \\"e\\" }\\n\\nlocal new = RemoveValues(array, \\"c\\", \\"d\\") -- { \\"a\\", \\"b\\", \\"e\\" }\\n```","params":[{"name":"array","desc":"The array to remove values from.","lua_type":"{T}"},{"name":"...","desc":"The values to remove.","lua_type":"T"}],"returns":[{"desc":"The array with the values removed.","lua_type":"{T}"}],"function_type":"static","source":{"line":20,"path":"src/Array/removeValues.lua"}},{"name":"create","desc":"Creates an array of the given length, filled with the given value.\\nThis is just a wrapper around `table.create`.\\n\\n```lua\\nlocal array = Create(3, \\"Hello\\")\\n\\nprint(array) -- { \\"Hello\\", \\"Hello\\", \\"Hello\\" }\\n```","params":[{"name":"length","desc":"The length of the array to create.","lua_type":"number"},{"name":"value?","desc":"The value to fill the array with.","lua_type":"T"}],"returns":[{"desc":"The created array.","lua_type":"{T}"}],"function_type":"static","source":{"line":19,"path":"src/Array/create.lua"}},{"name":"splice","desc":"Splices an array.\\n\\n```lua\\nlocal array = { 1, 2, 3, 4, 5 }\\n\\nlocal new = Splice(array, 3, 4, 6, 7) -- { 1, 2, 6, 7, 4, 5 }\\nlocal new = Splice(array, -1, 0, 6, 7) -- { 1, 2, 3, 4, 6, 7 }\\nlocal new = Splice(array, 4, -1, 6, 7) -- { 1, 2, 3, 6, 7, 5 }\\n```","params":[{"name":"array","desc":"The array to splice.","lua_type":"{T}"},{"name":"start?","desc":"The index to start splicing at (can be negative).","lua_type":"number"},{"name":"end?","desc":"The index to end splicing at (can be negative).","lua_type":"number"},{"name":"...","desc":"The values to insert.","lua_type":"...T"}],"returns":[{"desc":"The spliced array.","lua_type":"{T}"}],"function_type":"static","source":{"line":22,"path":"src/Array/splice.lua"}},{"name":"difference","desc":"Returns an array of values that are in the first array, but not in the other arrays.\\n\\n```lua\\nlocal array1 = { \\"hello\\", \\"world\\" }\\nlocal array2 = { \\"cat\\", \\"dog\\", \\"hello\\" }\\n\\nlocal difference = Difference(array1, array2) -- { \\"world\\" }\\n```","params":[{"name":"array","desc":"The array to compare.","lua_type":"Array"},{"name":"...","desc":"The arrays to compare against.","lua_type":"...Array"}],"returns":[{"desc":"The difference between the arrays.","lua_type":"Array"}],"function_type":"static","source":{"line":25,"path":"src/Array/difference.lua"}},{"name":"last","desc":"Gets the last element of the array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = Last(array) -- 3\\n```","params":[{"name":"array","desc":"The array to get the last element of.","lua_type":"{T}"}],"returns":[{"desc":"The last element of the array.","lua_type":"T"}],"function_type":"static","source":{"line":19,"path":"src/Array/last.lua"}},{"name":"removeIndex","desc":"Removes a value from an array at the given index.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = RemoveIndex(array, 1) -- { 2, 3 }\\nlocal new = RemoveIndex(array, -1) -- { 1, 3 }\\n```","params":[{"name":"array","desc":"The array to remove the value from.","lua_type":"{T}"},{"name":"index","desc":"The index to remove the value from (can be negative).","lua_type":"number"}],"returns":[{"desc":"The array with the value removed.","lua_type":"{T}"}],"function_type":"static","source":{"line":19,"path":"src/Array/removeIndex.lua"}},{"name":"toSet","desc":"Converts an array to a set.\\n\\n```lua\\nlocal array = { \\"a\\", \\"b\\", \\"b\\", \\"c\\", \\"d\\" }\\n\\nlocal set = ToSet(array) -- { a = true, b = true, c = true, d = true }\\n```","params":[{"name":"array","desc":"The array to convert to a set.","lua_type":"{T}"}],"returns":[{"desc":"The set.","lua_type":"Set"}],"function_type":"static","source":{"line":20,"path":"src/Array/toSet.lua"}},{"name":"removeValue","desc":"Removes a value from an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = RemoveValue(array, 2) -- { 1, 3 }\\n```","params":[{"name":"array","desc":"The array to remove the value from.","lua_type":"{T}"},{"name":"value","desc":"The value to remove.","lua_type":"T"}],"returns":[{"desc":"The array with the value removed.","lua_type":"{T}"}],"function_type":"static","source":{"line":18,"path":"src/Array/removeValue.lua"}},{"name":"findWhere","desc":"Finds the index of the first item in the array that passes the predicate.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal index = FindWhere(array, function(item, index)\\n\\treturn item > 1\\nend) -- 2\\n```","params":[{"name":"array","desc":"The array to search.","lua_type":"{T}"},{"name":"predicate","desc":"The predicate to use to check the array.","lua_type":"(value: T, index: number, array: {T}) -> any"},{"name":"from?","desc":"The index to start searching from.","lua_type":"number"}],"returns":[{"desc":"The index of the first item in the array that matches the predicate.","lua_type":"number"}],"function_type":"static","source":{"line":21,"path":"src/Array/findWhere.lua"}},{"name":"reduceRight","desc":"Reduces the array using the given reducer and initial accumulator value,\\nstarting from the end of the array. If no `initialReduction` value is given,\\nthe last item in the array is used.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = ReduceRight(array, function(accumulator, item, index)\\n\\treturn accumulator - item\\nend) -- 0\\n\\nlocal value = ReduceRight(array, function(accumulator, item, index)\\n\\ttable.insert(accumulator, item)\\n\\treturn accumulator\\nend, {}) -- { 3, 2, 1 }\\n```","params":[{"name":"array","desc":"The array to reduce.","lua_type":"{T}"},{"name":"reducer","desc":"The reducer to use.","lua_type":"(accumulator: U, value: T, index: number, array: {T}) -> U"},{"name":"initialReduction?","desc":"The initial accumulator value.","lua_type":"U = {T}[#{T}]"}],"returns":[{"desc":"The final accumulator value.","lua_type":"U"}],"function_type":"static","source":{"line":28,"path":"src/Array/reduceRight.lua"}},{"name":"at","desc":"Gets a value from an array at the given index.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = At(array, 1) -- 1\\nlocal value = At(array, 0) -- 3\\n```","params":[{"name":"array","desc":"The array to get the value from.","lua_type":"{T}"},{"name":"index","desc":"The index to get the value from (can be negative).","lua_type":"number"}],"returns":[{"desc":"The value at the given index.","lua_type":"T"}],"function_type":"static","source":{"line":19,"path":"src/Array/at.lua"}},{"name":"filter","desc":"Filters an array using a filterer callback. Any items that do not pass the filterer will be removed from the array.\\n\\nIf no filterer is provided, all items will be kept.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal result = Filter(array, function(item, index)\\n\\treturn item > 1\\nend) -- { 2, 3 }\\n```","params":[{"name":"array","desc":"The array to filter.","lua_type":"{T}"},{"name":"filterer?","desc":"The callback to use to filter the array.","lua_type":"(value: T, index: number, array: {T}) -> any"}],"returns":[{"desc":"The filtered array.","lua_type":"{T}"}],"function_type":"static","source":{"line":26,"path":"src/Array/filter.lua"}},{"name":"every","desc":"Checks whether every item in the array passes the predicate.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = Every(array, function(item, index)\\n\\treturn item > 0\\nend) -- true\\n\\nlocal value = Every(array, function(item, index)\\n\\treturn item > 1\\nend) -- false\\n```","params":[{"name":"array","desc":"The array to check.","lua_type":"{T}"},{"name":"predicate","desc":"The predicate to use to check the array.","lua_type":"(value: T, index: number, array: {T}) -> any"}],"returns":[{"desc":"Whether every item in the array passes the predicate.","lua_type":"boolean"}],"function_type":"static","source":{"line":24,"path":"src/Array/every.lua"}},{"name":"copyDeep","desc":"Copies an array, with deep copies of all nested arrays.\\n\\n```lua\\nlocal array = { 1, 2, 3, { 4, 5 } }\\n\\nlocal result = CopyDeep(array) -- { 1, 2, 3, { 4, 5 } }\\n\\nprint(result == array) -- false\\nprint(result[4] == array[4]) -- false\\n```","params":[{"name":"array","desc":"The array to copy.","lua_type":"{T}"}],"returns":[{"desc":"The copied array.","lua_type":"{T}"}],"function_type":"static","source":{"line":20,"path":"src/Array/copyDeep.lua"}},{"name":"unshift","desc":"Inserts values to the beginning of an array.\\n\\n#### Aliases\\n\\n`prepend`\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Unshift(array, 4, 5) -- { 4, 5, 1, 2, 3 }\\n```","params":[{"name":"array","desc":"The array to insert the values to.","lua_type":"{T}"},{"name":"...","desc":"The values to insert.","lua_type":"...T"}],"returns":[{"desc":"The array with the values inserted.","lua_type":"{T}"}],"function_type":"static","source":{"line":22,"path":"src/Array/unshift.lua"}},{"name":"shuffle","desc":"Randomises the order of the items in an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Shuffle(array) -- { 2, 3, 1 }\\n```","params":[{"name":"array","desc":"The array to shuffle.","lua_type":"{T}"}],"returns":[{"desc":"The shuffled array.","lua_type":"{T}"}],"function_type":"static","source":{"line":19,"path":"src/Array/shuffle.lua"}},{"name":"equalsDeep","desc":"Compares two arrays for equality using deep comparison.\\n\\n```lua\\nlocal array = { 1, 2, 3, { 4, 5 } }\\nlocal other = { 1, 2, 3, { 4, 5 } }\\n\\nlocal value = EqualsDeep(array, other) -- true\\nlocal value = EqualsDeep(array, other, { 1, 2, 3, { 4, 5 } }) -- true\\nlocal value = EqualsDeep(array, other, { 1, 2, 3, { 4, 6 } }) -- false\\n```","params":[{"name":"...","desc":"The arrays to compare.","lua_type":"...{any}"}],"returns":[{"desc":"Whether the arrays are equal.","lua_type":"boolean"}],"function_type":"static","source":{"line":44,"path":"src/Array/equalsDeep.lua"}},{"name":"freeze","desc":"Freezes the top level of the array, making it read-only.\\n\\n```lua\\nlocal array = { 1, 2, 3, { 4, 5, 6 } }\\n\\nlocal new = Freeze(array)\\n\\nnew[1] = 4 -- error!\\nnew[4][1] = 7 -- still works!\\n```","params":[{"name":"array","desc":"The array to freeze.","lua_type":"{T}"}],"returns":[{"desc":"The frozen array.","lua_type":"{T}"}],"function_type":"static","source":{"line":22,"path":"src/Array/freeze.lua"}},{"name":"removeIndices","desc":"Removes values from an array at the given indices.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = RemoveIndices(array, 1, 2) -- { 3 }\\nlocal new = RemoveIndices(array, 0, -1) -- { 1 }\\n```","params":[{"name":"array","desc":"The array to remove the indices from.","lua_type":"{T}"},{"name":"...","desc":"The indices to remove the values from (can be negative).","lua_type":"...number"}],"returns":[{"desc":"The array with the values removed.","lua_type":"{T}"}],"function_type":"static","source":{"line":19,"path":"src/Array/removeIndices.lua"}},{"name":"set","desc":"Sets a value on an array at the given index.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Set(array, 2, 4) -- { 1, 4, 3 }\\nlocal new = Set(array, -1, 4) -- { 1, 2, 4 }\\n```","params":[{"name":"array","desc":"The array to set the value on.","lua_type":"{T}"},{"name":"index","desc":"The index to set the value at (can be negative).","lua_type":"number"},{"name":"value","desc":"The value to set.","lua_type":"T"}],"returns":[{"desc":"The array with the value set.","lua_type":"{T}"}],"function_type":"static","source":{"line":20,"path":"src/Array/set.lua"}},{"name":"count","desc":"Counts the number of items in an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = Count(array) -- 3\\nlocal value = Count(array, function(item, index)\\n\\treturn item == 2\\nend) -- 1\\n```","params":[{"name":"array","desc":"The array to count the number of items in.","lua_type":"{T}"},{"name":"predicate?","desc":"The predicate to use to filter the array.","lua_type":"(value: T, index: number, array: {T}) -> any"}],"returns":[{"desc":"The number of items in the array.","lua_type":"number"}],"function_type":"static","source":{"line":25,"path":"src/Array/count.lua"}},{"name":"shift","desc":"Removes the first item from an array and returns the array\\nwith the item removed.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Shift(array) -- { 2, 3 }\\nlocal new = Shift(array, 2) -- { 3 }\\n```","params":[{"name":"array","desc":"The array to shift.","lua_type":"{T}"},{"name":"count?","desc":"The number of items to shift.","lua_type":"number"}],"returns":[{"desc":"The shifted array.","lua_type":"{T}"}],"function_type":"static","source":{"line":20,"path":"src/Array/shift.lua"}},{"name":"findWhereLast","desc":"Finds the index of the last item in the array that passes the predicate.\\n\\n```lua\\nlocal array = { \\"hello\\", \\"world\\", \\"hello\\" }\\n\\nlocal index = FindWhereLast(array, function(item, index)\\n\\treturn item == \\"hello\\"\\nend) -- 3\\n\\nlocal index = FindWhereLast(array, function(item, index)\\n\\treturn item == \\"hello\\"\\nend, 2) -- 1\\n```","params":[{"name":"array","desc":"The array to search.","lua_type":"{T}"},{"name":"predicate","desc":"The predicate to use to check the array.","lua_type":"(value: T, index: number, array: {T}) -> any"},{"name":"from?","desc":"The index to start searching from.","lua_type":"number"}],"returns":[{"desc":"The index of the last item in the array that matches the predicate.","lua_type":"number"}],"function_type":"static","source":{"line":25,"path":"src/Array/findWhereLast.lua"}},{"name":"reduce","desc":"Reduces the array using the given reducer and initial accumulator value.\\nIf no `initialReduction` value is given, the first item in the array is used.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = Reduce(array, function(accumulator, item, index)\\n\\treturn accumulator - item\\nend) -- -4\\n\\nlocal value = Reduce(array, function(accumulator, item, index)\\n\\ttable.insert(accumulator, item)\\n\\treturn accumulator\\nend, {}) -- { 1, 2, 3 }\\n```","params":[{"name":"array","desc":"The array to reduce.","lua_type":"{T}"},{"name":"reducer","desc":"The reducer to use.","lua_type":"(accumulator: U, value: T, index: number, array: {T}) -> U"},{"name":"initialReduction?","desc":"The initial accumulator value.","lua_type":"U = {T}[1]"}],"returns":[{"desc":"The final accumulator value.","lua_type":"U"}],"function_type":"static","source":{"line":27,"path":"src/Array/reduce.lua"}},{"name":"equals","desc":"Compares two arrays for equality.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\nlocal other = { 1, 2, 3 }\\n\\nlocal value = Equals(array, other) -- true\\nlocal value = Equals(array, other, { 1, 2, 3 }) -- true\\nlocal value = Equals(array, other, { 1, 2, 4 }) -- false\\n```","params":[{"name":"...","desc":"The arrays to compare.","lua_type":"...{any}"}],"returns":[{"desc":"Whether the arrays are equal.","lua_type":"boolean"}],"function_type":"static","source":{"line":44,"path":"src/Array/equals.lua"}},{"name":"concatDeep","desc":"Joins multiple arrays together into a single array, with deep copies of all\\nnested arrays.\\n\\n#### Aliases\\n\\n`joinDeep`, `mergeDeep`\\n\\n```lua\\nlocal table1 = { 1, 2, { 3, 4 } }\\nlocal table2 = { 5, 6, { 7, 8 } }\\n\\nlocal new = ConcatDeep(table1, table2) -- { 1, 2, { 3, 4 }, 5, 6, { 7, 8 } }\\n```","params":[{"name":"...","desc":"The arrays to concatenate.","lua_type":"...any"}],"returns":[{"desc":"The concatenated array.","lua_type":"{T}"}],"function_type":"static","source":{"line":28,"path":"src/Array/concatDeep.lua"}},{"name":"findLast","desc":"Finds the index of the last item in the array that matches the value.\\n\\n```lua\\nlocal array = { \\"hello\\", \\"world\\", \\"hello\\" }\\n\\nlocal index = FindLast(array, \\"hello\\") -- 3\\nlocal index = FindLast(array, \\"hello\\", 2) -- 1\\n```","params":[{"name":"array","desc":"The array to search.","lua_type":"{T}"},{"name":"value?","desc":"The value to search for.","lua_type":"any"},{"name":"from?","desc":"The index to start searching from.","lua_type":"number"}],"returns":[{"desc":"The index of the last item in the array that matches the value.","lua_type":"number?"}],"function_type":"static","source":{"line":20,"path":"src/Array/findLast.lua"}},{"name":"slice","desc":"Slices an array.\\n\\n```lua\\nlocal array = { 1, 2, 3, 4, 5 }\\n\\nlocal new = Slice(array, 2, 3) -- { 2, 3 }\\nlocal new = Slice(array, -2, -1) -- { 3, 4 }\\nlocal new = Slice(array, 3) -- { 3, 4, 5 }\\n```","params":[{"name":"array","desc":"The array to slice.","lua_type":"{T}"},{"name":"from?","desc":"The index to start from (can be negative).","lua_type":"number"},{"name":"to?","desc":"The index to end at (can be negative).","lua_type":"number"}],"returns":[{"desc":"The sliced array.","lua_type":"{T}"}],"function_type":"static","source":{"line":21,"path":"src/Array/slice.lua"}},{"name":"zipAll","desc":"Zips multiple arrays together into a single array, filling\\nin missing values with `None`.\\n\\n```lua\\nlocal table1 = { 1, 2, 3, 4 }\\nlocal table2 = { \\"hello\\", \\"world\\", \\"goodbye\\" }\\n\\nlocal new = ZipAll(table1, table2) -- { { 1, \\"hello\\" }, { 2, \\"world\\" }, { 3, \\"goodbye\\" }, { 4, None } }\\n```","params":[{"name":"...","desc":"The arrays to zip.","lua_type":"...{any}"}],"returns":[{"desc":"The zipped array.","lua_type":"{any}"}],"function_type":"static","source":{"line":24,"path":"src/Array/zipAll.lua"}},{"name":"differenceSymmetric","desc":"Returns an array of values that are in the first array, but not in the other arrays, and vice versa.\\n\\n```lua\\nlocal array1 = { \\"hello\\", \\"world\\" }\\nlocal array2 = { \\"cat\\", \\"dog\\", \\"hello\\" }\\n\\nlocal difference = DifferenceSymmetric(array1, array2) -- { \\"world\\", \\"cat\\", \\"dog\\" }\\n```","params":[{"name":"array","desc":"The array to compare.","lua_type":"Array"},{"name":"...","desc":"The arrays to compare against.","lua_type":"...Array"}],"returns":[{"desc":"The symmetric difference between the arrays.","lua_type":"Array"}],"function_type":"static","source":{"line":25,"path":"src/Array/differenceSymmetric.lua"}},{"name":"some","desc":"Checks whether some item in the array passes the predicate.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = Some(array, function(item, index)\\n\\treturn item > 1\\nend) -- true\\n\\nlocal value = Some(array, function(item, index)\\n\\treturn item > 3\\nend) -- false\\n```","params":[{"name":"array","desc":"The array to check.","lua_type":"{T}"},{"name":"predicate","desc":"The predicate to use to check the array.","lua_type":"(value: T, index: number, array: {T}) -> any"}],"returns":[{"desc":"Whether some item in the array passes the predicate.","lua_type":"boolean"}],"function_type":"static","source":{"line":24,"path":"src/Array/some.lua"}},{"name":"insert","desc":"Inserts the given values into an array at the given index, shifting all values after it to the right. If the index is negative (or 0), it is counted from the end of the array.\\n\\nIf the index to insert at is out of range, the array is not modified.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal newArray = Insert(array, 2, 4) -- { 1, 4, 2, 3 }\\n```","params":[{"name":"array","desc":"The array to insert the value into.","lua_type":"{T}"},{"name":"index","desc":"The index to insert the value at (can be negative).","lua_type":"number"},{"name":"values","desc":"The values to insert.","lua_type":"...T"}],"returns":[{"desc":"The array with the value inserted.","lua_type":"{T}"}],"function_type":"static","source":{"line":21,"path":"src/Array/insert.lua"}},{"name":"freezeDeep","desc":"Freezes the entire array, making it read-only, including all\\nnested arrays.\\n\\n```lua\\nlocal array = { 1, 2, 3, { 4, 5, 6 } }\\n\\nlocal new = FreezeDeep(array)\\n\\nnew[1] = 4 -- error!\\nnew[4][1] = 7 -- error!\\n```","params":[{"name":"array","desc":"The array to freeze.","lua_type":"{T}"}],"returns":[{"desc":"The frozen array.","lua_type":"{T}"}],"function_type":"static","source":{"line":21,"path":"src/Array/freezeDeep.lua"}}],"properties":[],"types":[],"name":"Array","desc":"An array is a table consisting of index-value pairs. You don\'t need to\\nmanually specify the indices when you create an array.\\n\\n```lua\\nlocal array = {\\n\\t\\"hello\\",\\n\\t\\"world\\",\\n}\\n```\\n\\n

\\n\\n#### Aliases\\n\\n`List`","source":{"line":21,"path":"src/Array/init.lua"}}')}}]); \ No newline at end of file diff --git a/assets/js/f32ee857.ec7e4ea6.js b/assets/js/f32ee857.ec7e4ea6.js deleted file mode 100644 index da5171d..0000000 --- a/assets/js/f32ee857.ec7e4ea6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[977],{57160:e=>{e.exports=JSON.parse('{"functions":[{"name":"count","desc":"Counts the number of items in an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = Count(array) -- 3\\nlocal value = Count(array, function(item, index)\\n\\treturn item == 2\\nend) -- 1\\n```","params":[{"name":"array","desc":"The array to count the number of items in.","lua_type":"{T}"},{"name":"predicate?","desc":"The predicate to use to filter the array.","lua_type":"(value: T, index: number, array: {T}) -> any"}],"returns":[{"desc":"The number of items in the array.","lua_type":"number"}],"function_type":"static","source":{"line":25,"path":"src/Array/count.lua"}},{"name":"toSet","desc":"Converts an array to a set.\\n\\n```lua\\nlocal array = { \\"a\\", \\"b\\", \\"b\\", \\"c\\", \\"d\\" }\\n\\nlocal set = ToSet(array) -- { a = true, b = true, c = true, d = true }\\n```","params":[{"name":"array","desc":"The array to convert to a set.","lua_type":"{T}"}],"returns":[{"desc":"The set.","lua_type":"Set"}],"function_type":"static","source":{"line":20,"path":"src/Array/toSet.lua"}},{"name":"concatDeep","desc":"Joins multiple arrays together into a single array, with deep copies of all\\nnested arrays.\\n\\n#### Aliases\\n\\n`joinDeep`, `mergeDeep`\\n\\n```lua\\nlocal table1 = { 1, 2, { 3, 4 } }\\nlocal table2 = { 5, 6, { 7, 8 } }\\n\\nlocal new = ConcatDeep(table1, table2) -- { 1, 2, { 3, 4 }, 5, 6, { 7, 8 } }\\n```","params":[{"name":"...","desc":"The arrays to concatenate.","lua_type":"...any"}],"returns":[{"desc":"The concatenated array.","lua_type":"{T}"}],"function_type":"static","source":{"line":28,"path":"src/Array/concatDeep.lua"}},{"name":"find","desc":"Finds the index of the first item in the array that matches the value. This is\\nmostly a wrapper around `table.find`, with the ability to specify a negative\\nnumber as the start index (to search relative to the end of the array).\\n\\n#### Aliases\\n`indexOf`\\n\\n```lua\\nlocal array = { \\"hello\\", \\"world\\", \\"hello\\" }\\n\\nlocal index = Find(array, \\"hello\\") -- 1\\nlocal index = Find(array, \\"hello\\", 2) -- 3\\n```","params":[{"name":"array","desc":"The array to search.","lua_type":"{T}"},{"name":"value?","desc":"The value to search for.","lua_type":"any"},{"name":"from?","desc":"The index to start searching from.","lua_type":"number"}],"returns":[{"desc":"The index of the first item in the array that matches the value.","lua_type":"number?"}],"function_type":"static","source":{"line":25,"path":"src/Array/find.lua"}},{"name":"sort","desc":"Sorts an array.\\n\\n```lua\\nlocal array = { \\"a\\", \\"b\\", \\"c\\", \\"d\\", \\"e\\" }\\n\\nlocal new = Sort(array, function(a, b)\\n\\treturn a > b\\nend) -- { \\"e\\", \\"d\\", \\"c\\", \\"b\\", \\"a\\" }\\n```","params":[{"name":"array","desc":"The array to sort.","lua_type":"{T}"},{"name":"comparator?","desc":"The comparator function.","lua_type":"(a: T, b: T) -> boolean"}],"returns":[{"desc":"The sorted array.","lua_type":"{T}"}],"function_type":"static","source":{"line":22,"path":"src/Array/sort.lua"}},{"name":"first","desc":"Gets the first item in the array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = First(array) -- 1\\n```","params":[{"name":"array","desc":"The array to get the first item from.","lua_type":"{T}"}],"returns":[{"desc":"The first item in the array.","lua_type":"T"}],"function_type":"static","source":{"line":19,"path":"src/Array/first.lua"}},{"name":"unshift","desc":"Inserts values to the beginning of an array.\\n\\n#### Aliases\\n\\n`prepend`\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Unshift(array, 4, 5) -- { 4, 5, 1, 2, 3 }\\n```","params":[{"name":"array","desc":"The array to insert the values to.","lua_type":"{T}"},{"name":"...","desc":"The values to insert.","lua_type":"...T"}],"returns":[{"desc":"The array with the values inserted.","lua_type":"{T}"}],"function_type":"static","source":{"line":22,"path":"src/Array/unshift.lua"}},{"name":"pop","desc":"Removes an element from the end of the array, and returns\\nthe array with the popped elements removed.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Pop(array) -- { 1, 2 }\\nlocal new = Pop(array, 2) -- { 1 }\\n```","params":[{"name":"array","desc":"The array to pop an element from.","lua_type":"{T}"},{"name":"count?","desc":"The number of elements to pop.","lua_type":"number = 1"}],"returns":[{"desc":"An array with the popped elements removed.","lua_type":"{T}"}],"function_type":"static","source":{"line":20,"path":"src/Array/pop.lua"}},{"name":"reverse","desc":"Reverses the order of the items in an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Reverse(array) -- { 3, 2, 1 }\\n```","params":[{"name":"array","desc":"The array to reverse.","lua_type":"{T}"}],"returns":[{"desc":"The reversed array.","lua_type":"{T}"}],"function_type":"static","source":{"line":17,"path":"src/Array/reverse.lua"}},{"name":"includes","desc":"Checks whether the array contains the value. This is a wrapper\\naround `Find`.\\n\\n#### Aliases\\n\\n`contains`, `has`\\n\\n```lua\\nlocal array = { \\"hello\\", \\"world\\", \\"goodbye\\" }\\n\\nlocal value = Includes(array, \\"hello\\") -- true\\nlocal value = Includes(array, \\"sift\\") -- false\\nlocal value = Includes(array, \\"hello\\", 2) -- false\\n```","params":[{"name":"array","desc":"The array to search.","lua_type":"{T}"},{"name":"value","desc":"The value to search for.","lua_type":"any"},{"name":"from?","desc":"The index to start searching from.","lua_type":"number"}],"returns":[{"desc":"Whether the array contains the value.","lua_type":"boolean"}],"function_type":"static","source":{"line":28,"path":"src/Array/includes.lua"}},{"name":"zipAll","desc":"Zips multiple arrays together into a single array, filling\\nin missing values with `None`.\\n\\n```lua\\nlocal table1 = { 1, 2, 3, 4 }\\nlocal table2 = { \\"hello\\", \\"world\\", \\"goodbye\\" }\\n\\nlocal new = ZipAll(table1, table2) -- { { 1, \\"hello\\" }, { 2, \\"world\\" }, { 3, \\"goodbye\\" }, { 4, None } }\\n```","params":[{"name":"...","desc":"The arrays to zip.","lua_type":"...{any}"}],"returns":[{"desc":"The zipped array.","lua_type":"{any}"}],"function_type":"static","source":{"line":24,"path":"src/Array/zipAll.lua"}},{"name":"removeValue","desc":"Removes a value from an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = RemoveValue(array, 2) -- { 1, 3 }\\n```","params":[{"name":"array","desc":"The array to remove the value from.","lua_type":"{T}"},{"name":"value","desc":"The value to remove.","lua_type":"T"}],"returns":[{"desc":"The array with the value removed.","lua_type":"{T}"}],"function_type":"static","source":{"line":18,"path":"src/Array/removeValue.lua"}},{"name":"is","desc":"Checks if the given object is an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\nlocal dictionary = { hello = \\"world\\" }\\nlocal mixed = { 1, 2, hello = \\"world\\" }\\n\\nArray.is(array) -- true\\nArray.is(dictionary) -- false\\nArray.is(mixed) -- false\\n```","params":[{"name":"object","desc":"The object to check.","lua_type":"any"}],"returns":[{"desc":"Whether the object is an array.","lua_type":"boolean"}],"function_type":"static","source":{"line":21,"path":"src/Array/is.lua"}},{"name":"copyDeep","desc":"Copies an array, with deep copies of all nested arrays.\\n\\n```lua\\nlocal array = { 1, 2, 3, { 4, 5 } }\\n\\nlocal result = CopyDeep(array) -- { 1, 2, 3, { 4, 5 } }\\n\\nprint(result == array) -- false\\nprint(result[4] == array[4]) -- false\\n```","params":[{"name":"array","desc":"The array to copy.","lua_type":"{T}"}],"returns":[{"desc":"The copied array.","lua_type":"{T}"}],"function_type":"static","source":{"line":20,"path":"src/Array/copyDeep.lua"}},{"name":"map","desc":"Maps the array using the mapper function.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Map(array, function(value, index)\\n\\treturn value * 2\\nend) -- { 2, 4, 6 }\\n```","params":[{"name":"array","desc":"The array to map.","lua_type":"{T}"},{"name":"mapper","desc":"The mapper function.","lua_type":"(value: T, index: number, array: {T}) -> U?"}],"returns":[{"desc":"The mapped array.","lua_type":"{U}"}],"function_type":"static","source":{"line":20,"path":"src/Array/map.lua"}},{"name":"freeze","desc":"Freezes the top level of the array, making it read-only.\\n\\n```lua\\nlocal array = { 1, 2, 3, { 4, 5, 6 } }\\n\\nlocal new = Freeze(array)\\n\\nnew[1] = 4 -- error!\\nnew[4][1] = 7 -- still works!\\n```","params":[{"name":"array","desc":"The array to freeze.","lua_type":"{T}"}],"returns":[{"desc":"The frozen array.","lua_type":"{T}"}],"function_type":"static","source":{"line":22,"path":"src/Array/freeze.lua"}},{"name":"removeIndex","desc":"Removes a value from an array at the given index.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = RemoveIndex(array, 1) -- { 2, 3 }\\nlocal new = RemoveIndex(array, -1) -- { 1, 3 }\\n```","params":[{"name":"array","desc":"The array to remove the value from.","lua_type":"{T}"},{"name":"index","desc":"The index to remove the value from (can be negative).","lua_type":"number"}],"returns":[{"desc":"The array with the value removed.","lua_type":"{T}"}],"function_type":"static","source":{"line":19,"path":"src/Array/removeIndex.lua"}},{"name":"removeValues","desc":"Removes values from an array.\\n\\n```lua\\nlocal array = { \\"a\\", \\"b\\", \\"c\\", \\"c\\", \\"d\\", \\"e\\" }\\n\\nlocal new = RemoveValues(array, \\"c\\", \\"d\\") -- { \\"a\\", \\"b\\", \\"e\\" }\\n```","params":[{"name":"array","desc":"The array to remove values from.","lua_type":"{T}"},{"name":"...","desc":"The values to remove.","lua_type":"T"}],"returns":[{"desc":"The array with the values removed.","lua_type":"{T}"}],"function_type":"static","source":{"line":20,"path":"src/Array/removeValues.lua"}},{"name":"equals","desc":"Compares two arrays for equality.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\nlocal other = { 1, 2, 3 }\\n\\nlocal value = Equals(array, other) -- true\\nlocal value = Equals(array, other, { 1, 2, 3 }) -- true\\nlocal value = Equals(array, other, { 1, 2, 4 }) -- false\\n```","params":[{"name":"...","desc":"The arrays to compare.","lua_type":"...{any}"}],"returns":[{"desc":"Whether the arrays are equal.","lua_type":"boolean"}],"function_type":"static","source":{"line":44,"path":"src/Array/equals.lua"}},{"name":"flatten","desc":"Flattens an array. If depth is not specified, it will flatten\\nthe array as far as it can go.\\n\\n```lua\\nlocal array = {\\n\\t{ 1, 2, 3 },\\n\\t{ 4, 5, 6 },\\n\\t{ 7, { 8, 9 } },\\n}\\n\\nlocal new = Flatten(array) -- { 1, 2, 3, 4, 5, 6, 7, 8, 9 }\\nlocal new = Flatten(array, 1) -- { 1, 2, 3, 4, 5, 6, 7, { 8, 9 } }\\n```","params":[{"name":"array","desc":"The array to flatten.","lua_type":"{T}"},{"name":"depth?","desc":"The depth to flatten the array to.","lua_type":"number"}],"returns":[{"desc":"The flattened array.","lua_type":"{T}"}],"function_type":"static","source":{"line":24,"path":"src/Array/flatten.lua"}},{"name":"update","desc":"Updates an array at the given index. If the value at the given index does\\nnot exist, `callback` will be called, and its return value will be used\\nas the value at the given index.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Update(array, 2, function(value)\\n\\treturn value + 1\\nend) -- { 2, 3, 3 }\\n\\nlocal new = Update(array, 4, function(value)\\n\\treturn value + 1\\nend, function(value)\\n\\treturn 10\\nend) -- { 1, 2, 3, 10 }\\n```","params":[{"name":"array","desc":"The array to update.","lua_type":"{T}"},{"name":"index","desc":"The index to update.","lua_type":"number"},{"name":"updater?","desc":"The updater function.","lua_type":"(value: T, index: number) -> T"},{"name":"callback?","desc":"The callback function.","lua_type":"(index: number) -> T"}],"returns":[{"desc":"The updated array.","lua_type":"{T}"}],"function_type":"static","source":{"line":44,"path":"src/Array/update.lua"}},{"name":"some","desc":"Checks whether some item in the array passes the predicate.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = Some(array, function(item, index)\\n\\treturn item > 1\\nend) -- true\\n\\nlocal value = Some(array, function(item, index)\\n\\treturn item > 3\\nend) -- false\\n```","params":[{"name":"array","desc":"The array to check.","lua_type":"{T}"},{"name":"predicate","desc":"The predicate to use to check the array.","lua_type":"(value: T, index: number, array: {T}) -> any"}],"returns":[{"desc":"Whether some item in the array passes the predicate.","lua_type":"boolean"}],"function_type":"static","source":{"line":24,"path":"src/Array/some.lua"}},{"name":"push","desc":"Adds elements to the end of the array.\\n\\n#### Aliases\\n\\n`append`\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Push(array, 4, 5, 6) -- { 1, 2, 3, 4, 5, 6 }\\n```","params":[{"name":"array","desc":"The array to push an element to.","lua_type":"{T}"},{"name":"...","desc":"The elements to push.","lua_type":"...T"}],"returns":[{"desc":"The array with the pushed elements.","lua_type":"{T}"}],"function_type":"static","source":{"line":22,"path":"src/Array/push.lua"}},{"name":"shuffle","desc":"Randomises the order of the items in an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Shuffle(array) -- { 2, 3, 1 }\\n```","params":[{"name":"array","desc":"The array to shuffle.","lua_type":"{T}"}],"returns":[{"desc":"The shuffled array.","lua_type":"{T}"}],"function_type":"static","source":{"line":19,"path":"src/Array/shuffle.lua"}},{"name":"filter","desc":"Filters an array using a filterer callback. Any items that do not pass the filterer will be removed from the array.\\n\\nIf no filterer is provided, all items will be kept.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal result = Filter(array, function(item, index)\\n\\treturn item > 1\\nend) -- { 2, 3 }\\n```","params":[{"name":"array","desc":"The array to filter.","lua_type":"{T}"},{"name":"filterer?","desc":"The callback to use to filter the array.","lua_type":"(value: T, index: number, array: {T}) -> any"}],"returns":[{"desc":"The filtered array.","lua_type":"{T}"}],"function_type":"static","source":{"line":26,"path":"src/Array/filter.lua"}},{"name":"findWhere","desc":"Finds the index of the first item in the array that passes the predicate.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal index = FindWhere(array, function(item, index)\\n\\treturn item > 1\\nend) -- 2\\n```","params":[{"name":"array","desc":"The array to search.","lua_type":"{T}"},{"name":"predicate","desc":"The predicate to use to check the array.","lua_type":"(value: T, index: number, array: {T}) -> any"},{"name":"from?","desc":"The index to start searching from.","lua_type":"number"}],"returns":[{"desc":"The index of the first item in the array that matches the predicate.","lua_type":"number"}],"function_type":"static","source":{"line":21,"path":"src/Array/findWhere.lua"}},{"name":"splice","desc":"Splices an array.\\n\\n```lua\\nlocal array = { 1, 2, 3, 4, 5 }\\n\\nlocal new = Splice(array, 3, 4, 6, 7) -- { 1, 2, 6, 7, 4, 5 }\\nlocal new = Splice(array, -1, 0, 6, 7) -- { 1, 2, 3, 4, 6, 7 }\\nlocal new = Splice(array, 4, -1, 6, 7) -- { 1, 2, 3, 6, 7, 5 }\\n```","params":[{"name":"array","desc":"The array to splice.","lua_type":"{T}"},{"name":"start?","desc":"The index to start splicing at (can be negative).","lua_type":"number"},{"name":"end?","desc":"The index to end splicing at (can be negative).","lua_type":"number"},{"name":"...","desc":"The values to insert.","lua_type":"...T"}],"returns":[{"desc":"The spliced array.","lua_type":"{T}"}],"function_type":"static","source":{"line":22,"path":"src/Array/splice.lua"}},{"name":"at","desc":"Gets a value from an array at the given index.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = At(array, 1) -- 1\\nlocal value = At(array, 0) -- 3\\n```","params":[{"name":"array","desc":"The array to get the value from.","lua_type":"{T}"},{"name":"index","desc":"The index to get the value from (can be negative).","lua_type":"number"}],"returns":[{"desc":"The value at the given index.","lua_type":"T"}],"function_type":"static","source":{"line":19,"path":"src/Array/at.lua"}},{"name":"shift","desc":"Removes the first item from an array and returns the array\\nwith the item removed.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Shift(array) -- { 2, 3 }\\nlocal new = Shift(array, 2) -- { 3 }\\n```","params":[{"name":"array","desc":"The array to shift.","lua_type":"{T}"},{"name":"count?","desc":"The number of items to shift.","lua_type":"number"}],"returns":[{"desc":"The shifted array.","lua_type":"{T}"}],"function_type":"static","source":{"line":20,"path":"src/Array/shift.lua"}},{"name":"freezeDeep","desc":"Freezes the entire array, making it read-only, including all\\nnested arrays.\\n\\n```lua\\nlocal array = { 1, 2, 3, { 4, 5, 6 } }\\n\\nlocal new = FreezeDeep(array)\\n\\nnew[1] = 4 -- error!\\nnew[4][1] = 7 -- error!\\n```","params":[{"name":"array","desc":"The array to freeze.","lua_type":"{T}"}],"returns":[{"desc":"The frozen array.","lua_type":"{T}"}],"function_type":"static","source":{"line":21,"path":"src/Array/freezeDeep.lua"}},{"name":"removeIndices","desc":"Removes values from an array at the given indices.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = RemoveIndices(array, 1, 2) -- { 3 }\\nlocal new = RemoveIndices(array, 0, -1) -- { 1 }\\n```","params":[{"name":"array","desc":"The array to remove the indices from.","lua_type":"{T}"},{"name":"...","desc":"The indices to remove the values from (can be negative).","lua_type":"...number"}],"returns":[{"desc":"The array with the values removed.","lua_type":"{T}"}],"function_type":"static","source":{"line":19,"path":"src/Array/removeIndices.lua"}},{"name":"concat","desc":"Joins multiple arrays together into a single array.\\n\\n#### Aliases\\n\\n`join`, `merge`\\n\\n```lua\\nlocal table1 = { 1, 2, 3 }\\nlocal table2 = { 4, 5, 6 }\\n\\nlocal new = Concat(table1, table2) -- { 1, 2, 3, 4, 5, 6 }\\n```","params":[{"name":"...","desc":"The arrays to concatenate.","lua_type":"...any"}],"returns":[{"desc":"The concatenated array.","lua_type":"{T}"}],"function_type":"static","source":{"line":26,"path":"src/Array/concat.lua"}},{"name":"reduce","desc":"Reduces the array using the given reducer and initial accumulator value.\\nIf no `initialReduction` value is given, the first item in the array is used.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = Reduce(array, function(accumulator, item, index)\\n\\treturn accumulator - item\\nend) -- -4\\n\\nlocal value = Reduce(array, function(accumulator, item, index)\\n\\ttable.insert(accumulator, item)\\n\\treturn accumulator\\nend, {}) -- { 1, 2, 3 }\\n```","params":[{"name":"array","desc":"The array to reduce.","lua_type":"{T}"},{"name":"reducer","desc":"The reducer to use.","lua_type":"(accumulator: U, value: T, index: number, array: {T}) -> U"},{"name":"initialReduction?","desc":"The initial accumulator value.","lua_type":"U = {T}[1]"}],"returns":[{"desc":"The final accumulator value.","lua_type":"U"}],"function_type":"static","source":{"line":27,"path":"src/Array/reduce.lua"}},{"name":"set","desc":"Sets a value on an array at the given index.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Set(array, 2, 4) -- { 1, 4, 3 }\\nlocal new = Set(array, -1, 4) -- { 1, 2, 4 }\\n```","params":[{"name":"array","desc":"The array to set the value on.","lua_type":"{T}"},{"name":"index","desc":"The index to set the value at (can be negative).","lua_type":"number"},{"name":"value","desc":"The value to set.","lua_type":"T"}],"returns":[{"desc":"The array with the value set.","lua_type":"{T}"}],"function_type":"static","source":{"line":20,"path":"src/Array/set.lua"}},{"name":"insert","desc":"Inserts the given values into an array at the given index, shifting all values after it to the right. If the index is negative (or 0), it is counted from the end of the array.\\n\\nIf the index to insert at is out of range, the array is not modified.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal newArray = Insert(array, 2, 4) -- { 1, 4, 2, 3 }\\n```","params":[{"name":"array","desc":"The array to insert the value into.","lua_type":"{T}"},{"name":"index","desc":"The index to insert the value at (can be negative).","lua_type":"number"},{"name":"values","desc":"The values to insert.","lua_type":"...T"}],"returns":[{"desc":"The array with the value inserted.","lua_type":"{T}"}],"function_type":"static","source":{"line":21,"path":"src/Array/insert.lua"}},{"name":"last","desc":"Gets the last element of the array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = Last(array) -- 3\\n```","params":[{"name":"array","desc":"The array to get the last element of.","lua_type":"{T}"}],"returns":[{"desc":"The last element of the array.","lua_type":"T"}],"function_type":"static","source":{"line":19,"path":"src/Array/last.lua"}},{"name":"copy","desc":"Copies an array.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal new = Copy(array) -- { 1, 2, 3 }\\n\\nprint(new == array) -- false\\n```","params":[{"name":"array","desc":"The array to copy.","lua_type":"{T}"}],"returns":[{"desc":"The copied array.","lua_type":"{T}"}],"function_type":"static","source":{"line":19,"path":"src/Array/copy.lua"}},{"name":"every","desc":"Checks whether every item in the array passes the predicate.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = Every(array, function(item, index)\\n\\treturn item > 0\\nend) -- true\\n\\nlocal value = Every(array, function(item, index)\\n\\treturn item > 1\\nend) -- false\\n```","params":[{"name":"array","desc":"The array to check.","lua_type":"{T}"},{"name":"predicate","desc":"The predicate to use to check the array.","lua_type":"(value: T, index: number, array: {T}) -> any"}],"returns":[{"desc":"Whether every item in the array passes the predicate.","lua_type":"boolean"}],"function_type":"static","source":{"line":24,"path":"src/Array/every.lua"}},{"name":"reduceRight","desc":"Reduces the array using the given reducer and initial accumulator value,\\nstarting from the end of the array. If no `initialReduction` value is given,\\nthe last item in the array is used.\\n\\n```lua\\nlocal array = { 1, 2, 3 }\\n\\nlocal value = ReduceRight(array, function(accumulator, item, index)\\n\\treturn accumulator - item\\nend) -- 0\\n\\nlocal value = ReduceRight(array, function(accumulator, item, index)\\n\\ttable.insert(accumulator, item)\\n\\treturn accumulator\\nend, {}) -- { 3, 2, 1 }\\n```","params":[{"name":"array","desc":"The array to reduce.","lua_type":"{T}"},{"name":"reducer","desc":"The reducer to use.","lua_type":"(accumulator: U, value: T, index: number, array: {T}) -> U"},{"name":"initialReduction?","desc":"The initial accumulator value.","lua_type":"U = {T}[#{T}]"}],"returns":[{"desc":"The final accumulator value.","lua_type":"U"}],"function_type":"static","source":{"line":28,"path":"src/Array/reduceRight.lua"}},{"name":"create","desc":"Creates an array of the given length, filled with the given value.\\nThis is just a wrapper around `table.create`.\\n\\n```lua\\nlocal array = Create(3, \\"Hello\\")\\n\\nprint(array) -- { \\"Hello\\", \\"Hello\\", \\"Hello\\" }\\n```","params":[{"name":"length","desc":"The length of the array to create.","lua_type":"number"},{"name":"value?","desc":"The value to fill the array with.","lua_type":"T"}],"returns":[{"desc":"The created array.","lua_type":"{T}"}],"function_type":"static","source":{"line":19,"path":"src/Array/create.lua"}},{"name":"slice","desc":"Slices an array.\\n\\n```lua\\nlocal array = { 1, 2, 3, 4, 5 }\\n\\nlocal new = Slice(array, 2, 3) -- { 2, 3 }\\nlocal new = Slice(array, -2, -1) -- { 3, 4 }\\nlocal new = Slice(array, 3) -- { 3, 4, 5 }\\n```","params":[{"name":"array","desc":"The array to slice.","lua_type":"{T}"},{"name":"from?","desc":"The index to start from (can be negative).","lua_type":"number"},{"name":"to?","desc":"The index to end at (can be negative).","lua_type":"number"}],"returns":[{"desc":"The sliced array.","lua_type":"{T}"}],"function_type":"static","source":{"line":21,"path":"src/Array/slice.lua"}},{"name":"difference","desc":"Returns an array of values that are in the first array, but not in the other arrays.\\n\\n```lua\\nlocal array1 = { \\"hello\\", \\"world\\" }\\nlocal array2 = { \\"cat\\", \\"dog\\", \\"hello\\" }\\n\\nlocal difference = Difference(array1, array2) -- { \\"world\\" }\\n```","params":[{"name":"array","desc":"The array to compare.","lua_type":"Array"},{"name":"...","desc":"The arrays to compare against.","lua_type":"...Array"}],"returns":[{"desc":"The difference between the arrays.","lua_type":"Array"}],"function_type":"static","source":{"line":25,"path":"src/Array/difference.lua"}},{"name":"findWhereLast","desc":"Finds the index of the last item in the array that passes the predicate.\\n\\n```lua\\nlocal array = { \\"hello\\", \\"world\\", \\"hello\\" }\\n\\nlocal index = FindWhereLast(array, function(item, index)\\n\\treturn item == \\"hello\\"\\nend) -- 3\\n\\nlocal index = FindWhereLast(array, function(item, index)\\n\\treturn item == \\"hello\\"\\nend, 2) -- 1\\n```","params":[{"name":"array","desc":"The array to search.","lua_type":"{T}"},{"name":"predicate","desc":"The predicate to use to check the array.","lua_type":"(value: T, index: number, array: {T}) -> any"},{"name":"from?","desc":"The index to start searching from.","lua_type":"number"}],"returns":[{"desc":"The index of the last item in the array that matches the predicate.","lua_type":"number"}],"function_type":"static","source":{"line":25,"path":"src/Array/findWhereLast.lua"}},{"name":"zip","desc":"Zips multiple arrays together into a single array.\\n\\n```lua\\nlocal table1 = { 1, 2, 3 }\\nlocal table2 = { \\"hello\\", \\"world\\", \\"goodbye\\" }\\n\\nlocal new = Zip(table1, table2) -- { { 1, \\"hello\\" }, { 2, \\"world\\" }, { 3, \\"goodbye\\" } }\\n```","params":[{"name":"...","desc":"The arrays to zip together.","lua_type":"{any}"}],"returns":[{"desc":"The zipped array.","lua_type":"{any}"}],"function_type":"static","source":{"line":20,"path":"src/Array/zip.lua"}},{"name":"differenceSymmetric","desc":"Returns an array of values that are in the first array, but not in the other arrays, and vice versa.\\n\\n```lua\\nlocal array1 = { \\"hello\\", \\"world\\" }\\nlocal array2 = { \\"cat\\", \\"dog\\", \\"hello\\" }\\n\\nlocal difference = DifferenceSymmetric(array1, array2) -- { \\"world\\", \\"cat\\", \\"dog\\" }\\n```","params":[{"name":"array","desc":"The array to compare.","lua_type":"Array"},{"name":"...","desc":"The arrays to compare against.","lua_type":"...Array"}],"returns":[{"desc":"The symmetric difference between the arrays.","lua_type":"Array"}],"function_type":"static","source":{"line":25,"path":"src/Array/differenceSymmetric.lua"}},{"name":"equalsDeep","desc":"Compares two arrays for equality using deep comparison.\\n\\n```lua\\nlocal array = { 1, 2, 3, { 4, 5 } }\\nlocal other = { 1, 2, 3, { 4, 5 } }\\n\\nlocal value = EqualsDeep(array, other) -- true\\nlocal value = EqualsDeep(array, other, { 1, 2, 3, { 4, 5 } }) -- true\\nlocal value = EqualsDeep(array, other, { 1, 2, 3, { 4, 6 } }) -- false\\n```","params":[{"name":"...","desc":"The arrays to compare.","lua_type":"...{any}"}],"returns":[{"desc":"Whether the arrays are equal.","lua_type":"boolean"}],"function_type":"static","source":{"line":44,"path":"src/Array/equalsDeep.lua"}},{"name":"findLast","desc":"Finds the index of the last item in the array that matches the value.\\n\\n```lua\\nlocal array = { \\"hello\\", \\"world\\", \\"hello\\" }\\n\\nlocal index = FindLast(array, \\"hello\\") -- 3\\nlocal index = FindLast(array, \\"hello\\", 2) -- 1\\n```","params":[{"name":"array","desc":"The array to search.","lua_type":"{T}"},{"name":"value?","desc":"The value to search for.","lua_type":"any"},{"name":"from?","desc":"The index to start searching from.","lua_type":"number"}],"returns":[{"desc":"The index of the last item in the array that matches the value.","lua_type":"number?"}],"function_type":"static","source":{"line":20,"path":"src/Array/findLast.lua"}}],"properties":[],"types":[],"name":"Array","desc":"An array is a table consisting of index-value pairs. You don\'t need to\\nmanually specify the indices when you create an array.\\n\\n```lua\\nlocal array = {\\n\\t\\"hello\\",\\n\\t\\"world\\",\\n}\\n```\\n\\n

\\n\\n#### Aliases\\n\\n`List`","source":{"line":21,"path":"src/Array/init.lua"}}')}}]); \ No newline at end of file diff --git a/assets/js/main.ffe14e76.js b/assets/js/main.b47e52bb.js similarity index 98% rename from assets/js/main.ffe14e76.js rename to assets/js/main.b47e52bb.js index 0ff578a..c17499e 100644 --- a/assets/js/main.ffe14e76.js +++ b/assets/js/main.b47e52bb.js @@ -1,2 +1,2 @@ -/*! For license information please see main.ffe14e76.js.LICENSE.txt */ -(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(67294),a=n(87462),o=n(68356),i=n.n(o),l=n(16887);const s={"02fae9b5":[()=>n.e(331).then(n.bind(n,24948)),"@site/pages/index.md",24948],"06a8c222":[()=>n.e(527).then(n.t.bind(n,83769,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",83769],"0e384e19":[()=>n.e(671).then(n.bind(n,59881)),"@site/docs/intro.md",59881],17896441:[()=>Promise.all([n.e(532),n.e(272),n.e(918)]).then(n.bind(n,15462)),"@theme/DocItem",15462],"1be78505":[()=>Promise.all([n.e(532),n.e(514)]).then(n.bind(n,90606)),"@theme/DocPage",90606],"1d634d37":[()=>n.e(867).then(n.t.bind(n,63668,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/Sift-toc.json",63668],"1eea45a3":[()=>n.e(513).then(n.t.bind(n,95250,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/Dictionary.json",95250],"1f391b9e":[()=>Promise.all([n.e(532),n.e(272),n.e(85)]).then(n.bind(n,14247)),"@theme/MDXPage",14247],"1ff659d4":[()=>n.e(553).then(n.bind(n,57784)),"@site/docs/Installation.md",57784],"30e81be4":[()=>n.e(614).then(n.t.bind(n,84612,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/Sift.json",84612],"3c19531b":[()=>n.e(58).then(n.t.bind(n,88303,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/plugin-route-context-module-100.json",88303],"8639b05e":[()=>n.e(668).then(n.t.bind(n,15745,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",15745],"880d272a":[()=>n.e(715).then(n.t.bind(n,14245,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/Set.json",14245],"8deedfb8":[()=>n.e(556).then(n.bind(n,26437)),"@site/pages/CHANGELOG.md",26437],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"941e9f46":[()=>n.e(167).then(n.t.bind(n,47241,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/Set-toc.json",47241],af5cd4f0:[()=>n.e(273).then(n.bind(n,25304)),"@site/docs/Examples.md",25304],b09b2928:[()=>n.e(677).then(n.t.bind(n,85492,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/typeLinks.json",85492],b571cfb1:[()=>n.e(213).then(n.t.bind(n,63891,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/options.json",63891],d420ad06:[()=>Promise.all([n.e(532),n.e(600)]).then(n.bind(n,81117)),"/home/runner/.cache/moonwave/sift/node_modules/docusaurus-plugin-moonwave/src/components/LuaClass.js",81117],d5429bdc:[()=>n.e(968).then(n.t.bind(n,35718,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/Array-toc.json",35718],d8feab7c:[()=>n.e(389).then(n.t.bind(n,27616,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/Dictionary-toc.json",27616],f32ee857:[()=>n.e(977).then(n.t.bind(n,57160,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/Array.json",57160],f6e6b639:[()=>n.e(714).then(n.bind(n,23424)),"/home/runner/.cache/moonwave/sift/node_modules/docusaurus-plugin-moonwave/src/components/Redirect.js",23424],faf187bb:[()=>n.e(411).then(n.t.bind(n,7636,19)),"/home/runner/.cache/moonwave/sift/.docusaurus/docusaurus-plugin-moonwave/moonwave/sidebar.json",7636]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(99670),d=n(30226);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],h=(0,c.Z)(o);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/sift/api/",component:f("/sift/api/","c67"),exact:!0},{path:"/sift/api/Array",component:f("/sift/api/Array","da1"),exact:!0},{path:"/sift/api/Dictionary",component:f("/sift/api/Dictionary","463"),exact:!0},{path:"/sift/api/Set",component:f("/sift/api/Set","81e"),exact:!0},{path:"/sift/api/Sift",component:f("/sift/api/Sift","b9f"),exact:!0},{path:"/sift/CHANGELOG",component:f("/sift/CHANGELOG","f7a"),exact:!0},{path:"/sift/docs",component:f("/sift/docs","b7c"),routes:[{path:"/sift/docs/Examples",component:f("/sift/docs/Examples","22a"),exact:!0,sidebar:"defaultSidebar"},{path:"/sift/docs/Installation",component:f("/sift/docs/Installation","233"),exact:!0,sidebar:"defaultSidebar"},{path:"/sift/docs/intro",component:f("/sift/docs/intro","176"),exact:!0,sidebar:"defaultSidebar"}]},{path:"/sift/",component:f("/sift/","f7b"),exact:!0},{path:"*",component:f("*")}]},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(67294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},49383:(e,t,n)=>{"use strict";var r=n(67294),a=n(73935),o=n(73727),i=n(70405),l=n(10412);const s=[n(32497),n(3310),n(18320),n(34197)];var u=n(723),c=n(16550),d=n(18790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(87462),m=n(35742),h=n(52263),g=n(44996),v=n(86668),b=n(1944),y=n(94711),w=n(19727),E=n(43320),k=n(90197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),a=function(){const{siteConfig:{url:e}}=(0,h.Z)(),{pathname:t}=(0,c.TH)();return e+(0,g.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function _(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,v.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(b.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(k.Z,{tag:E.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const C=new Map;function T(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var A=n(98934),L=n(58940);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const O=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),N("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function P(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?N("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(O,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const R=I,D="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner",F="docusaurus-base-url-issue-banner-suggestion-container",B="__DOCUSAURUS_INSERT_BASEURL_BANNER";function $(e){return`\nwindow['${B}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${B}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${D}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{window[B]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,$(e))),r.createElement("div",{id:D}))}function z(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(U,null):null}function j(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,h.Z)(),i=(0,g.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var Z=n(44763);function H(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(Z.Z,null,r.createElement(L.M,null,r.createElement(A.t,null,r.createElement(f,null,r.createElement(j,null),r.createElement(_,null),r.createElement(z,null),r.createElement(R,{location:T(t)},e)))))}var V=n(16887);const G=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var W=n(99670);const q=new Set,Y=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,X={prefetch(e){if(!(e=>!K()&&!Y.has(e)&&!q.has(e))(e))return!1;q.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(V).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,W.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?G(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!Y.has(e))(e)&&(Y.add(e),P(e))},Q=Object.freeze(X);if(l.Z.canUseDOM){window.docusaurus=Q;const e=a.hydrate;P(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(H,null))),document.getElementById("__docusaurus"))}))}},58940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(67294),a=n(36809);const o=JSON.parse('{"docusaurus-lunr-search":{"default":{"fileNames":{"searchDoc":"search-doc-1693510076477.json","lunrIndex":"lunr-index-1693510076477.json"}}},"docusaurus-plugin-content-docs":{"default":{"path":"/sift/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/sift/docs","mainDocId":"intro","docs":[{"id":"Examples","path":"/sift/docs/Examples","sidebar":"defaultSidebar"},{"id":"Installation","path":"/sift/docs/Installation","sidebar":"defaultSidebar"},{"id":"intro","path":"/sift/docs/intro","sidebar":"defaultSidebar"}],"draftIds":[],"sidebars":{"defaultSidebar":{"link":{"path":"/sift/docs/intro","label":"intro"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(57529);const s=JSON.parse('{"docusaurusVersion":"2.3.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.3.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.3.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.3.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.3.1"},"docusaurus-plugin-moonwave":{"type":"package","name":"docusaurus-plugin-moonwave","version":"1.1.2"},"docusaurus-lunr-search":{"type":"package","name":"docusaurus-lunr-search","version":"2.3.2"}}}'),u={siteConfig:a.Z,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(67294),a=n(10412),o=n(35742),i=n(34510);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(c,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const u=e=>r.createElement(s,e);class c extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??u)(e)}return e??null}}},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(70405);function o(e){return r.createElement(a.ql,e)}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var r=n(87462),a=n(67294),o=n(73727),i=n(18780),l=n(52263),s=n(13919),u=n(10412);const c=a.createContext({collectLink:()=>{}}),d=()=>(0,a.useContext)(c);var f=n(44996);const p=e=>e.startsWith("/");function m(e,t){let{isNavLink:n,to:c,href:m,activeClassName:h,isActive:g,"data-noBrokenLinkCheck":v,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:{trailingSlash:w,baseUrl:E}}=(0,l.Z)(),{withBaseUrl:k}=(0,f.C)(),S=d(),x=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>x.current));const _=c||m;const C=(0,s.Z)(_),T=_?.replace("pathname://","");let A=void 0!==T?(L=T,b&&p(L)?k(L):L):void 0;var L;A&&C&&(A=(0,i.applyTrailingSlash)(A,{trailingSlash:w,baseUrl:E}));const N=(0,a.useRef)(!1),O=n?o.OL:o.rU,P=u.Z.canUseIntersectionObserver,I=(0,a.useRef)(),R=()=>{N.current||null==A||(window.docusaurus.preload(A),N.current=!0)};(0,a.useEffect)((()=>(!P&&C&&null!=A&&window.docusaurus.prefetch(A),()=>{P&&I.current&&I.current.disconnect()})),[I,A,P,C]);const D=A?.startsWith("#")??!1,M=!A||!C||D;return M||v||S.collectLink(A),M?a.createElement("a",(0,r.Z)({ref:x,href:A},_&&!C&&{target:"_blank",rel:"noopener noreferrer"},y)):a.createElement(O,(0,r.Z)({},y,{onMouseEnter:R,onTouchStart:R,innerRef:e=>{x.current=e,P&&e&&C&&(I.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(I.current.unobserve(e),I.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),I.current.observe(e))},to:A},n&&{isActive:g,activeClassName:h}))}const h=a.forwardRef(m)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(67294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(57529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},13919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(67294),a=n(52263),o=n(13919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(58940);function o(){return(0,r.useContext)(a._)}},28084:(e,t,n)=>{"use strict";n.d(t,{OD:()=>o,eZ:()=>i});var r=n(52263),a=n(29935);function o(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const r=o(e),i=r?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(98934);function o(){return(0,r.useContext)(a._)}},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t=".",n={};return function e(a,o){Object.entries(a).forEach((a=>{let[i,l]=a;const s=o?`${o}${t}${i}`:i;r(l)?e(l,s):n[s]=l}))}(e),n}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(67294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},94104:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>p,gA:()=>c,_r:()=>s,Jo:()=>m,zh:()=>u,yW:()=>f,gB:()=>d});var r=n(16550),a=n(28084);const o=e=>e.versions.find((e=>e.isLast));function i(e,t){const n=function(e,t){const n=o(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const l={},s=()=>(0,a.OD)("docusaurus-plugin-content-docs")??l,u=e=>(0,a.eZ)("docusaurus-plugin-content-docs",e,{failfast:!0});function c(e){void 0===e&&(e={});const t=s(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function d(e){return u(e).versions}function f(e){const t=u(e);return o(t)}function p(e){const t=u(e),{pathname:n}=(0,r.TH)();return i(t,n)}function m(e){const t=u(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=o(e);return{latestDocSuggestion:i(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(74865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(87410),a=n(36809);!function(e){const{themeConfig:{prism:t}}=a.Z,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(33003)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},34510:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ut});var r=n(67294),a=n(86010),o=n(44763),i=n(1944),l=n(87462),s=n(16550),u=n(95999),c=n(85936);const d="docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,u.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:a}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:a}),t))}var g=n(35281),v=n(19727);const b={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(h,{className:b.skipToContent})}var w=n(86668),E=n(59689);function k(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function x(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",S.closeButton,e.className)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,E.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:T.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:T.announcementBarPlaceholder}),r.createElement(C,{className:T.announcementBarContent}),i&&r.createElement(x,{onClick:n,className:T.announcementBarClose}))}var L=n(72961),N=n(12466);var O=n(902),P=n(13102);const I=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,P.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,O.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(I.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function M(){const e=(0,r.useContext)(I);if(!e)throw new O.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:D(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=M();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var B=n(92949),$=n(72389);function U(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function z(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const j={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function Z(e){let{className:t,value:n,onChange:o}=e;const i=(0,$.Z)(),l=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(j.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",j.toggleButton,!i&&j.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(U,{className:(0,a.Z)(j.toggleIcon,j.lightToggleIcon)}),r.createElement(z,{className:(0,a.Z)(j.toggleIcon,j.darkToggleIcon)})))}const H=r.memo(Z);function V(e){let{className:t}=e;const n=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,B.I)();return n?null:r.createElement(H,{className:t,value:a,onChange:o})}var G=n(21327);function W(){return r.createElement(G.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function q(){const e=(0,L.e)();return r.createElement("button",{type:"button","aria-label":(0,u.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(k,{color:"var(--ifm-color-emphasis-600)"}))}function Y(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(W,null),r.createElement(V,{className:"margin-right--md"}),r.createElement(q,null))}var K=n(39960),X=n(44996),Q=n(13919);function J(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var ee=n(39471);function te(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const f=(0,X.Z)(a),p=(0,X.Z)(t),m=(0,X.Z)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,Q.Z)(o),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(ee.Z,u&&{width:12,height:12}))};return o?r.createElement(K.Z,(0,l.Z)({href:c?m:o},d,g)):r.createElement(K.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?J(n,t.pathname):t.pathname.startsWith(p)},d,g))}function ne(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(te,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function re(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(te,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function ae(e){let{mobile:t=!1,position:n,...a}=e;const o=t?re:ne;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var oe=n(86043),ie=n(48596),le=n(52263);function se(e,t){return e.some((e=>function(e,t){return!!(0,ie.Mg)(e.to,t)||!!J(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(te,(0,l.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,n)=>r.createElement(Te,(0,l.Z)({isDropdownItem:!0,onKeyDown:e=>{if(n===t.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);const t=u.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:n}))))))}function ce(e){let{items:t,className:n,position:o,onClick:i,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=se(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,oe.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(te,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),p()}}),u.children??u.label),r.createElement(oe.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(Te,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function de(e){let{mobile:t=!1,...n}=e;const a=t?ce:ue;return r.createElement(a,n)}var fe=n(94711);function pe(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const me={iconLanguage:"iconLanguage_nlXk"};var he=n(94184),ge=n.n(he),ve=n(28084);const be=e=>{const t=(0,r.useRef)(!1),a=(0,r.useRef)(null),[o,i]=(0,r.useState)(!1),l=(0,s.k6)(),{siteConfig:u={}}=(0,le.Z)(),c=(0,$.Z)(),{baseUrl:d}=u,f=(0,ve.eZ)("docusaurus-lunr-search"),p=()=>{t.current||(Promise.all([fetch(`${d}${f.fileNames.searchDoc}`).then((e=>e.json())),fetch(`${d}${f.fileNames.lunrIndex}`).then((e=>e.json())),Promise.all([n.e(878),n.e(339)]).then(n.bind(n,30894)),Promise.all([n.e(532),n.e(343)]).then(n.bind(n,53343))]).then((e=>{let[t,n,{default:r}]=e;0!==t.length&&(((e,t,n)=>{new n({searchDocs:e,searchIndex:t,baseUrl:d,inputSelector:"#search_input_react",handleSelected:(e,t,n)=>{const r=n.url||"/";document.createElement("a").href=r,l.push(r)}})})(t,n,r),i(!0))})),t.current=!0)},m=(0,r.useCallback)((t=>{a.current.contains(t.target)||a.current.focus(),e.handleSearchBarToggle&&e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]);return c&&p(),r.createElement("div",{className:"navbar__search",key:"search-box"},r.createElement("span",{"aria-label":"expand searchbar",role:"button",className:ge()("search-icon",{"search-icon-hidden":e.isSearchBarExpanded}),onClick:m,onKeyDown:m,tabIndex:0}),r.createElement("input",{id:"search_input_react",type:"search",placeholder:o?"Search":"Loading...","aria-label":"Search",className:ge()("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onClick:p,onMouseOver:p,onFocus:m,onBlur:m,ref:a,disabled:!o}))},ye={searchBox:"searchBox_ZlJk"};function we(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,ye.searchBox)},t)}var Ee=n(94104),ke=n(52802);const Se=e=>e.docs.find((t=>t.id===e.mainDocId));var xe=n(60373);const _e=e=>e.docs.find((t=>t.id===e.mainDocId));const Ce={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.Z)(),f=(0,fe.l)(),{search:p,hash:m}=(0,s.TH)(),h=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],g=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(de,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(pe,{className:me.iconLanguage}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(we,{className:n},r.createElement(be,null))},dropdown:de,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Ee.Iw)(a),s=(0,ke.vY)(t,a);return null===s?null:r.createElement(ae,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Ee.Iw)(a),s=(0,ke.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(ae,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,ke.lO)(a)[0],s=t??i.label,u=n??Se(i).path;return r.createElement(ae,(0,l.Z)({},o,{label:s,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...c}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,Ee.Iw)(n),m=(0,Ee.gB)(n),{savePreferredVersionName:h}=(0,xe.J)(n),g=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??_e(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...i],v=(0,ke.lO)(n)[0],b=t&&g.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):v.label,y=t&&g.length>1?void 0:_e(v).path;return g.length<=1?r.createElement(ae,(0,l.Z)({},c,{mobile:t,label:b,to:y,isActive:a?()=>!1:void 0})):r.createElement(de,(0,l.Z)({},c,{mobile:t,label:b,to:y,items:g,isActive:a?()=>!1:void 0}))}};function Te(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ce[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function Ae(){const e=(0,L.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Te,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Le(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function Ne(){const e=0===(0,w.L)().navbar.items.length,t=M();return r.createElement(r.Fragment,null,!e&&r.createElement(Le,{onClick:()=>t.hide()}),t.content)}function Oe(){const e=(0,L.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(F,{header:r.createElement(Y,null),primaryMenu:r.createElement(Ae,null),secondaryMenu:r.createElement(Ne,null)}):null}const Pe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ie(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Re(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,L.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,N.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Pe.navbarHideable,!s&&Pe.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ie,{onClick:i.toggle}),r.createElement(Oe,null))}const De="right";function Me(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Fe(){const{toggle:e,shown:t}=(0,L.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(Me,null))}const Be={colorModeToggle:"colorModeToggle_DEke"};function $e(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Te,(0,l.Z)({},e,{key:t})))))}function Ue(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function ze(){const e=(0,L.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??De)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(Ue,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Fe,null),r.createElement(W,null),r.createElement($e,{items:n})),right:r.createElement(r.Fragment,null,r.createElement($e,{items:a}),r.createElement(V,{className:Be.colorModeToggle}),!o&&r.createElement(we,null,r.createElement(be,null)))})}function je(){return r.createElement(Re,null,r.createElement(ze,null))}function Ze(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,u=(0,X.Z)(n),c=(0,X.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(K.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:u},s),o,a&&!(0,Q.Z)(a)&&r.createElement(ee.Z,null))}function He(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(Ze,{item:t}))}function Ve(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(He,{key:t,item:e})))))}function Ge(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(Ve,{key:t,column:e}))))}function We(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function qe(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Ze,{item:t})}function Ye(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(qe,{item:e}),t.length!==n+1&&r.createElement(We,null))))))}function Ke(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(Ge,{columns:t}):r.createElement(Ye,{links:t})}var Xe=n(50941);const Qe={footerLogoLink:"footerLogoLink_BH7S"};function Je(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(Xe.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function et(e){let{logo:t}=e;return t.href?r.createElement(K.Z,{href:t.href,className:Qe.footerLogoLink,target:t.target},r.createElement(Je,{logo:t})):r.createElement(Je,{logo:t})}function tt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function nt(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function rt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(nt,{style:o,links:n&&n.length>0&&r.createElement(Ke,{links:n}),logo:a&&r.createElement(et,{logo:a}),copyright:t&&r.createElement(tt,{copyright:t})})}const at=r.memo(rt),ot=(0,O.Qc)([B.S,E.pl,N.OC,xe.L5,i.VC,function(e){let{children:t}=e;return r.createElement(P.n2,null,r.createElement(L.M,null,r.createElement(R,null,t)))}]);function it(e){let{children:t}=e;return r.createElement(ot,null,t)}function lt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const st={mainWrapper:"mainWrapper_z2l0"};function ut(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:u}=e;return(0,v.t)(),r.createElement(it,null,r.createElement(i.d,{title:s,description:u}),r.createElement(y,null),r.createElement(A,null),r.createElement(je,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,st.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(lt,e)},t)),!n&&r.createElement(at,null))}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(87462),a=n(67294),o=n(39960),i=n(44996),l=n(52263),s=n(86668),u=n(50941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:u}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.Z)(u?.href||"/"),h=n?"":t,g=u?.alt??h;return a.createElement(o.Z,(0,r.Z)({to:m},p,u?.target&&{target:u.target}),u&&a.createElement(c,{logo:u,alt:g,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(35742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},50941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(87462),a=n(67294),o=n(86010),i=n(72389),l=n(92949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],c)},f)))))}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>h});var r=n(87462),a=n(67294),o=n(10412);const i="ease-in-out";function l(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const s={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?s:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function d(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??i}`,height:`${t}px`}}function l(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=s.height,e.style.overflow=s.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!o.Z.canUseDOM)return e?s:u}function p(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const u=(0,a.useRef)(null);return d({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(u.current,n),i?.(n))},className:l},r)}function m(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(p,(0,r.Z)({},n,{collapsed:l})):null}function h(e){let{lazy:t,...n}=e;const r=t?m:p;return a.createElement(r,n)}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(67294),a=n(72389),o=n(50012),i=n(902),l=n(86668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(67294),a=n(10412),o=n(902),i=n(50012),l=n(86668);const s=r.createContext(void 0),u="theme",c=(0,i.WA)(u),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{c.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>b,L5:()=>g});var r=n(67294),a=n(94104),o=n(29935),i=n(86668),l=n(52802),s=n(902),u=n(50012);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function g(e){let{children:t}=e;return l.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=v(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(67294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},72961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(67294),a=n(13102),o=n(87524),i=n(16550),l=(n(61688),n(902));function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(86668);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,u.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(67294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(67294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(67294),a=n(10412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function u(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},35281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},52802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>h,cE:()=>d,hI:()=>E,lO:()=>b,vY:()=>w,oz:()=>y,s1:()=>v});var r=n(67294),a=n(16550),o=n(18790),i=n(94104),l=n(60373),s=n(1116);function u(e){return Array.from(new Set(e))}var c=n(48596);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,c.Mg)(e,t),m=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||m(e.items,t))}function g(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,c.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,c.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function v(){const e=(0,s.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?g({sidebarItems:e.items,pathname:t}):null}function b(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function y(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\n Available sidebar ids are:\n - ${Object.keys(t).join("\n- ")}`);return r[1]}),[e,n])}function w(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`DocNavbarItem: couldn't find any doc with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:u}}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>c,VC:()=>p});var r=n(67294),a=n(86010),o=n(35742),i=n(30226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(44996),u=n(52263);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(67294);const a=n(10412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(67294),a=n(723),o=n(52263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(67294),a=n(10412),o=n(72389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},43320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(52263);const r="default";function a(e,t){return`docs-${e}-${t}`}},50012:(e,t,n)=>{"use strict";n.d(t,{WA:()=>s});n(67294),n(61688);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=o(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(52263),a=n(16550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(r)}${s}`}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(67294),a=n(16550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(52263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},18780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},94184:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function a(){for(var e=[],t=0;t{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>S,q_:()=>L,ob:()=>h,PP:()=>O,Ep:()=>m,Hp:()=>g});var r=n(87462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};function l(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const s=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=l(t),a=l(n);return r!==t||a!==n?e(r,a):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var u=n(38776);function c(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function f(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function p(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function m(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function h(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function g(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&s(e.state,t.state)}function v(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=h(e,t,f(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(59864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},32497:(e,t,n)=>{"use strict";n.r(t)},34197:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},27418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s{var r=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],h=n[2],g=n[3],v=n[4],b=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var E=null!=h&&null!=m&&m!==h,k="+"===y||"*"===y,S="?"===y||"*"===y,x=n[2]||c,_=v||b;r.push({name:g||o++,prefix:h||"",delimiter:x,optional:S,repeat:k,partial:E,asterisk:!!w,pattern:_?u(_):w?".*":"[^"+s(x)+"]+?"})}}return i{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=k.value.length,k=k.next){var x=k.value;if(t.length>e.length)return;if(!(x instanceof a)){var _,C=1;if(b){if(!(_=o(E,S,e,v))||_.index>=e.length)break;var T=_.index,A=_.index+_[0].length,L=S;for(L+=k.value.length;T>=L;)L+=(k=k.next).value.length;if(S=L-=k.value.length,k.value instanceof a)continue;for(var N=k;N!==t.tail&&(Ld.reach&&(d.reach=R);var D=k.prev;if(P&&(D=s(t,D,P),S+=P.length),u(t,D,C),k=s(t,D,new a(f,g?r.tokenize(O,g):O,y,O)),I&&s(t,k,I),C>1){var M={cause:f+","+m,reach:R};i(e,t,n,k.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var h=[p];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),v=f.substring(m+p.length),b=[];h&&b.push.apply(b,i([h])),b.push(g),v&&b.push.apply(b,i([v])),"string"==typeof u?l.splice.apply(l,[s,1].concat(b)):u.content=b}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},66841:()=>{Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},33003:(e,t,n)=>{var r={"./prism-lua":66841};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=33003},92703:(e,t,n)=>{"use strict";var r=n(50414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var r=n(67294),a=n(27418),o=n(63840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n