Here's a library I want to put inside a map.
I don't know how to put it.
This is what I'm asking.
Spoiler:
Code: Select all
library BigInt /* v2.3.1.0
*************************************************************************************
*
* Used for creating very large unsigned integers in any base. Stored in linked list.
*
*************************************************************************************
*
* */uses/*
*
* */ Base /* hiveworkshop.com/forums/submissions-414/snippet-base-188814/
*
*************************************************************************************
*
* struct BigInt extends array
*
* - All Operations Require That Bases Between Two BigInts
* - Be The Same Size
*
* - No Methods Will Ever Crash. If A Method Is Op Limit Safe, It Means
* - That It Runs Inside Of Its Own Thread, Allowing You To Call It Many Times
* - Safely.
*
* ---------------------------------------
* -
* - Key
* -
* - Op Limit Safe: +
* - Not Op Limit Safe: ~
* -
* ---------------------------------------
*
* - Fields
*
* +readonly boolean packed
* - Is the value in a compressed state? (unreadable, but good for base conversions)
* +readonly integer size
* +readonly thistype next
* +readonly thistype prev
* - Used For Iterating Over Digits
* +integer digit
* - The Value Of The Specific Digit
* +readonly boolean head
* - A Value Of 0 Will Only Have The Head
* - The Head Can Only Be 0, So Do Not Change Value
* - Of The Head Or You Will Break Division.
*
* - Methods
*
* ~method lt takes BigInt i returns boolean
* - this < i
* ~method gt takes BigInt i returns boolean
* - this > i
* ~method eq takes BigInt i returns boolean
* - this == i
* ~method neq takes BigInt i returns boolean
* - this != i
* ~method ltoe takes BigInt i returns boolean
* - this <= i
* ~method gtoe takes BigInt i returns boolean
* - this >= i
*
* ~method add takes integer i returns nothing
* - this + i
* ~method addBig takes BigInt i returns nothing
* - this + i
* ~method addString takes string s returns nothing
* - this + s
*
* ~method subtract takes integer i returns nothing
* - this - i
* ~method subtractBig takes BigInt i returns nothing
* - this - i
*
* ~method multiply takes integer i returns nothing
* - this * i
* ~method multiplyBig takes BigInt i returns nothing
* - this * i
*
* ~method divide takes integer d returns integer
* - this / d
* ~method divideBig takes BigInt d returns BigInt
* - this/d
*
* ~method operator base takes nothing returns Base
* ~method operator base= takes Base base returns nothing
* - Converts BigInt to target base
* - Base 0 is default base, which is 46340
* - Only perform operations on BigInts when they are in Base 0 As
* - The Operations Will Be Much Faster
*
* ~method mod takes integer i returns integer
* - this % i
* ~method modBig takes BigInt i returns BigInt
* - this % i
*
* +static method create takes nothing returns BigInt
* - Creates 0 BigInt In Default Base
* - Do Not Change Default Base Unless Displaying
* +static method convertString takes string s, Base base returns BigInt
* - Converts Target String In Base To BigInt
* - Be Sure To Change Base Of BigInt To 0 Afterwards
* +method destroy takes nothing returns nothing
*
* +method clear takes nothing returns nothing
* - Resets BigInt To 0, Does Not Reset Base
* +method copy takes nothing returns BigInt
* - Copies BigInt
* +method remake takes nothing returns BigInt
* - Moves All Digits On BigInt To A New BigInt And
* - Returns It
*
* local BigInt i = convertString("22829", base10)
* local BigInt i2 = i.remake()
* -> i = 0
* -> i2 = 22829
*
* +method enq takes integer i returns nothing
* - Adds A New Digit To Front Of BigInt
*
* local BigInt i = convertString("22829", base10)
* call i.enq(7)
* -> i = 722829
* +method deq takes nothing returns nothing
* - Removes Digit From Front Of BigInt
*
* local BigInt i = convertString("22829", base10)
* call i.deq()
* -> i = 2829
*
* +method deto takes thistype target returns nothing
* - Similar to deq except pushes onto target BigInt
*
* +method popto takes thistype target returns nothing
* - Similar to pop except enques onto target BigInt
*
* +method push takes integer i returns nothing
* - Pushes A New Digit To Back Of BigInt
*
* local BigInt i = convertString("22829", base10)
* call i.push(7)
* -> i = 228297
* +method pop takes nothing returns nothing
* - Removes Digit From Back Of BigInt
*
* local BigInt i = convertString("22829", base10)
* call i.pop()
* -> i = 2282
*
* +method toInt takes nothing returns integer
* - Converts BigInt To An Integer
* - This Will Overflow If The BigInt Can't Fit Into An Integer
*
* local BigInt i = convertString("22829", base10)
* local integer int = i.toInt()
* -> int = 22829
* +method toString takes nothing returns string
* - Converts BigInt To A String
* - If The Base Is The Default Base, The Digits Will Be Listed In That Base
*
* local BigInt i = convertString("22829", base10)
* local string str = i.toString()
* -> str = "22829"
*
* ~method pack takes nothing returns nothing
* - Commpresses the BigInt as much as possible (useful for base conversion)
* ~method unpack takes nothing returns nothing
* - Decompresses the BigInt
*
*************************************************************************************/
globals
private constant integer BASE = 46340
private constant boolean DEBUG_MSGS = true
private constant boolean DOUBLE_FREE_CHECK = false
endglobals
private module Init
private static method onInit takes nothing returns nothing
local integer base
set evalBase = CreateTrigger()
call TriggerAddCondition(evalBase, Condition(function thistype.ebase))
set evalMultBig = CreateTrigger()
call TriggerAddCondition(evalMultBig, Condition(function thistype.eMultiplyBig))
set evalDivideBig = CreateTrigger()
call TriggerAddCondition(evalDivideBig, Condition(function thistype.eDivideBig))
set evalSetBase = CreateTrigger()
call TriggerAddCondition(evalSetBase, Condition(function thistype.setBase))
set evalConvertString = CreateTrigger()
call TriggerAddCondition(evalConvertString, Condition(function thistype.eConvertString))
set evalCopy = CreateTrigger()
call TriggerAddCondition(evalCopy, Condition(function thistype.eCopy))
set evalToString = CreateTrigger()
call TriggerAddCondition(evalToString, Condition(function thistype.eToString))
set packedBase[0] = 46340
set packedPower[0] = 1
set packedBase[2] = 32768
set packedPower[2] = 15
set packedBase[3] = 19683
set packedPower[3] = 9
set packedBase[4] = 16384
set packedPower[4] = 8
set packedBase[5] = 15625
set packedPower[5] = 6
set packedBase[6] = 7776
set packedPower[6] = 5
set packedBase[7] = 16807
set packedPower[7] = 5
set packedBase[8] = 32768
set packedPower[8] = 5
set packedBase[9] = 6561
set packedPower[9] = 4
set packedBase[10] = 10000
set packedPower[10] = 4
set packedBase[11] = 14641
set packedPower[11] = 4
set packedBase[12] = 20736
set packedPower[12] = 4
set packedBase[13] = 28561
set packedPower[13] = 4
set packedBase[14] = 38416
set packedPower[14] = 4
set packedBase[15] = 3375
set packedPower[15] = 3
set packedBase[16] = 4096
set packedPower[16] = 3
set packedBase[17] = 4913
set packedPower[17] = 3
set packedBase[18] = 5832
set packedPower[18] = 3
set packedBase[19] = 6859
set packedPower[19] = 3
set packedBase[20] = 8000
set packedPower[20] = 3
set packedBase[21] = 9261
set packedPower[21] = 3
set packedBase[22] = 10648
set packedPower[22] = 3
set packedBase[23] = 12167
set packedPower[23] = 3
set packedBase[24] = 13824
set packedPower[24] = 3
set packedBase[25] = 15625
set packedPower[25] = 3
set packedBase[26] = 17576
set packedPower[26] = 3
set packedBase[27] = 19683
set packedPower[27] = 3
set packedBase[28] = 21952
set packedPower[28] = 3
set packedBase[29] = 24389
set packedPower[29] = 3
set packedBase[30] = 27000
set packedPower[30] = 3
set packedBase[31] = 29791
set packedPower[31] = 3
set packedBase[32] = 32768
set packedPower[32] = 3
set packedBase[33] = 35937
set packedPower[33] = 3
set packedBase[34] = 39304
set packedPower[34] = 3
set packedBase[35] = 42875
set packedPower[35] = 3
set base = 128
loop
exitwhen 35 == base
set packedBase[base] = base*base
set packedPower[base] = 2
set base = base - 1
endloop
endmethod
endmodule
struct BigInt extends array
private Base bm
readonly thistype next
readonly thistype prev
integer digit
readonly boolean head
readonly integer size
readonly boolean packed
private static trigger evalBase
private static trigger evalMultBig
private static trigger evalDivideBig
private static trigger evalSetBase
private static trigger evalConvertString
private static trigger evalCopy
private static trigger evalToString
private static integer array packedBase
private static integer array packedPower
private static integer count = 0
debug private static boolean rn
static if DOUBLE_FREE_CHECK then
private boolean allocated
endif
private static method allocate takes nothing returns thistype
local thistype this = thistype(0).next
if (0 == this) then
set this = count + 1
set count = this
else
set thistype(0).next = next
endif
static if DOUBLE_FREE_CHECK then
if (allocated) then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"DOUBLE ALLOC")
set this = 1/0
endif
set allocated = true
endif
set digit = 0
return this
endmethod
static if DOUBLE_FREE_CHECK then
private method deallocate takes nothing returns nothing
if (not allocated) then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"DOUBLE FREE")
set this = 1/0
endif
set allocated = false
set next = thistype(0).next
set thistype(0).next = this
endmethod
endif
static if DOUBLE_FREE_CHECK then
private static method deallocateRange takes thistype min, thistype max returns nothing
set max.next = thistype(0).next
set thistype(0).next = min
loop
if (not max.allocated) then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"DOUBLE FREE")
set max = 1/0
endif
set max.allocated = false
exitwhen max == min
set max = max.prev
endloop
endmethod
endif
private method ad takes thistype n returns nothing
set n.next = this
set n.prev = prev
set prev.next = n
set prev = n
set size = size + 1
endmethod
private method adp takes thistype n returns nothing
set n.next = next
set n.prev = this
set next.prev = n
set next = n
set size = size + 1
endmethod
method deto takes thistype tar returns nothing
debug if not (head and tar.head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Pop Null BigInt")
debug set this = 1/0
debug return
debug endif
debug if (0 == size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Pop 0 BigInt")
debug set this = 1/0
debug return
debug endif
set size = size - 1
set this = prev
set prev.next = next
set next.prev = prev
if (not tar.prev.head or 0 != digit) then
call tar.adp(this)
else
static if DOUBLE_FREE_CHECK then
call deallocate()
else
set next = thistype(0).next
set thistype(0).next = this
endif
endif
endmethod
method popto takes thistype tar returns nothing
debug if not (head and tar.head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Pop Null BigInt")
debug set this = 1/0
debug return
debug endif
debug if (0 == size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Pop 0 BigInt")
debug set this = 1/0
debug return
debug endif
set size = size - 1
set this = next
set prev.next = next
set next.prev = prev
if (not tar.prev.head or 0 != digit) then
call tar.ad(this)
else
static if DOUBLE_FREE_CHECK then
call deallocate()
else
set next = thistype(0).next
set thistype(0).next = this
endif
endif
endmethod
method lt takes thistype i returns boolean
local boolean b = false
debug if (not head or not i.head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To < Compare Null BigInt")
debug set i = 1/0
debug return false
debug endif
debug if (bm.size != i.bm.size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To < Compare BigInts With Different Bases")
debug set i = 1/0
debug return false
debug endif
if (size == i.size) then
loop
set this = prev
set i = i.prev
exitwhen head or digit != i.digit
endloop
return digit < i.digit
endif
return size < i.size
endmethod
method gt takes thistype i returns boolean
local boolean b = false
debug if (not head or not i.head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To > Compare Null BigInt")
debug set i = 1/0
debug return false
debug endif
debug if (bm.size != i.bm.size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To > Compare BigInts With Different Bases")
debug set i = 1/0
debug return false
debug endif
if (size == i.size) then
loop
set this = prev
set i = i.prev
exitwhen head or digit != i.digit
endloop
return digit > i.digit
endif
return size > i.size
endmethod
method eq takes thistype i returns boolean
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To == Compare Null BigInt")
debug set i = 1/0
debug return false
debug endif
if (0 == i) then
loop
set this = next
exitwhen head or 0 != digit
endloop
return head
endif
debug if (not i.head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To == Compare Null BigInt")
debug set i = 1/0
debug return false
debug endif
debug if (bm.size != i.bm.size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To == Compare BigInts With Different Bases")
debug set i = 1/0
debug return false
debug endif
if (size == i.size) then
loop
set this = next
set i = i.next
exitwhen head or digit != i.digit
endloop
return head
endif
return false
endmethod
method neq takes thistype i returns boolean
debug if (not head or not i.head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To != Compare Null BigInt")
debug set i = 1/0
debug return false
debug endif
debug if (bm.size != i.bm.size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To != Compare BigInts With Different Bases")
debug set i = 1/0
debug return false
debug endif
return not eq(i)
endmethod
method ltoe takes thistype i returns boolean
local boolean b = false
debug if (not head or not i.head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To <= Compare Null BigInt")
debug set i = 1/0
debug return false
debug endif
debug if (bm.size != i.bm.size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To <= Compare BigInts With Different Bases")
debug set i = 1/0
debug return false
debug endif
if (size == i.size) then
loop
set this = prev
set i = i.prev
exitwhen head or digit != i.digit
endloop
return digit <= i.digit
endif
return size < i.size
endmethod
method gtoe takes thistype i returns boolean
local boolean b = false
debug if (not head or not i.head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To >= Compare Null BigInt")
debug set i = 1/0
debug return false
debug endif
debug if (bm.size != i.bm.size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To >= Compare BigInts With Different Bases")
debug set i = 1/0
debug return false
debug endif
if (size == i.size) then
loop
set this = prev
set i = i.prev
exitwhen head or digit != i.digit
endloop
return digit >= i.digit
endif
return size > i.size
endmethod
method add takes integer i returns nothing
local integer carry = 0
local thistype root = this
local integer base
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To Add Null BigInt")
debug set i = 1/0
debug return
debug endif
if (packed or 0 == bm) then
set base = packedBase[bm.size]
else
set base = bm.size
endif
loop
exitwhen 0 == i
set this = next
if (head) then
set this = allocate()
call root.ad(this)
endif
set digit = digit + i - i/base*base + carry
set i = i/base
set carry = digit/base
set digit = digit - digit/base*base
endloop
loop
exitwhen 0 == carry
set this = next
if (head) then
set this = allocate()
call root.ad(this)
endif
set digit = digit + carry
set carry = digit/base
set digit = digit - digit/base*base
endloop
endmethod
method addBig takes BigInt i returns nothing
local integer carry = 0
local thistype root = this
local integer count = 0
local integer base
debug if (not head or not i.head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To Add Null BigInt")
debug set i = 1/0
debug return
debug endif
debug if (bm.size != i.bm.size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To Add BigInts With Different Bases")
debug set i = 1/0
debug return
debug endif
if (packed or 0 == bm) then
set base = packedBase[bm.size]
else
set base = bm.size
endif
loop
set i = i.next
exitwhen i.head
set this = next
if (head) then
set this = allocate()
call root.ad(this)
endif
set digit = digit + i.digit + carry
set carry = digit/base
set digit = digit - digit/base*base
endloop
loop
exitwhen 0 == carry
set this = next
if (head) then
set this = allocate()
call root.ad(this)
endif
set digit = digit + carry
set carry = digit/base
set digit = digit - digit/base*base
endloop
endmethod
method addString takes string s returns nothing
local integer carry = 0
local thistype root = this
local integer i = StringLength(s)
local Base b = bm
local integer base = b.size
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempting To Add Null BigInt")
debug set i = 1/0
debug return
debug endif
loop
exitwhen 0 == i
set this = next
if (head) then
set this = allocate()
call root.ad(this)
endif
set digit = digit + b.ord(SubString(s, i - 1, i)) + carry
set carry = digit/base
set digit = digit - digit/base*base
set i = i - 1
endloop
loop
exitwhen 0 == carry
set this = next
if (head) then
set this = allocate()
call root.ad(this)
endif
set digit = digit + carry
set carry = digit/base
set digit = digit - digit/base*base
endloop
endmethod
static method create takes nothing returns thistype
local thistype this = allocate()
set size = 0
set next = this
set prev = this
set head = true
set bm = 0
set packed = false
return this
endmethod
private static string eStringToConvert
private static Base eConvertingBase
private static BigInt eConvertingBigInt
private static integer eConvertingIndex
private static method eConvertString takes nothing returns boolean
local thistype this = eConvertingBigInt
local string s = eStringToConvert
local Base base = eConvertingBase
local thistype digit
local integer index = eConvertingIndex
local integer ops = 1260
debug set rn = false
loop
exitwhen 0 == index or 0 == ops
set ops = ops - 1
set index = index - 1
set digit = allocate()
call ad(digit)
set digit.digit = base.ord(SubString(s, index, index+1))
endloop
debug set rn = true
set eConvertingIndex = index
return 0 == index
endmethod
static method convertString takes string s, Base base returns thistype
local thistype this = allocate()
debug if (0 != base and 0 == base.size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Convert Bad Base")
debug return 0
debug endif
debug if (0 == StringLength(s)) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Convert Bad String")
debug return 0
debug endif
set size = 0
set next = this
set prev = this
set head = true
set bm = base
set packed = false
set eStringToConvert = s
set eConvertingBase = base
set eConvertingBigInt = this
set eConvertingIndex = StringLength(s)
loop
exitwhen TriggerEvaluate(evalConvertString)
debug if not rn then
static if DEBUG_MSGS then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"CONVERT STRING THREAD CRASH")
endif
debug set this = 1/0
debug endif
endloop
return this
endmethod
method clear takes nothing returns nothing
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Clear Null BigInt")
debug return
debug endif
if (not next.head) then
static if DOUBLE_FREE_CHECK then
call deallocateRange(next, prev)
else
set prev.next = thistype(0).next
set thistype(0).next = next
endif
set next = this
set prev = this
set size = 0
endif
set digit = 0
endmethod
method destroy takes nothing returns nothing
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Destroy Null BigInt")
debug return
debug endif
static if DOUBLE_FREE_CHECK then
call deallocateRange(this, prev)
else
set prev.next = thistype(0).next
set thistype(0).next = this
endif
set head = false
set size = 0
endmethod
private static BigInt eToCopy
private static BigInt eCloneCopy
private static method eCopy takes nothing returns boolean
local thistype this = eToCopy
local thistype n = eCloneCopy
local thistype clone = eCloneCopy
local integer ops = 3092
debug set rn = false
loop
set this = next
exitwhen head or 0 == ops
set ops = ops - 1
set n = allocate()
call clone.ad(n)
set n.digit = digit
endloop
debug set rn = true
set eToCopy = this
return head
endmethod
method copy takes nothing returns thistype
local thistype clone
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Copy Null BigInt")
debug return 0
debug endif
set clone = allocate()
set clone.next = clone
set clone.prev = clone
set clone.head = true
set clone.bm = bm
set clone.packed = packed
set eToCopy = this
set eCloneCopy = clone
loop
exitwhen TriggerEvaluate(evalCopy)
debug if (not rn) then
static if DEBUG_MSGS then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"COPY THREAD CRASH")
endif
debug set this = 1/0
debug endif
endloop
return clone
endmethod
method remake takes nothing returns thistype
local thistype clone
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Remake Null BigInt")
debug return 0
debug endif
set clone = allocate()
set clone.head = true
set clone.bm = bm
set clone.size = size
set clone.packed = packed
if (clone == this) then
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Allocation Error In Remake")
set size = 1/0
endif
set size = 0
if (not next.head) then
set clone.next = next
set clone.prev = prev
set clone.next.prev = clone
set clone.prev.next = clone
set next = this
set prev = this
else
set clone.next = clone
set clone.prev = clone
endif
return clone
endmethod
method enq takes integer i returns nothing
local thistype n
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Enqueue Null BigInt")
debug return
debug endif
set n = allocate()
call ad(n)
set n.digit = i
endmethod
method push takes integer i returns nothing
local thistype n
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Push Null BigInt")
debug return
debug endif
set n = allocate()
call adp(n)
set n.digit = i
endmethod
method pop takes nothing returns nothing
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Pop Null BigInt")
debug return
debug endif
debug if (next.head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Pop 0 BigInt")
debug return
debug endif
set size = size - 1
set this = next
set prev.next = next
set next.prev = prev
static if DOUBLE_FREE_CHECK then
call deallocate()
else
set next = thistype(0).next
set thistype(0).next = this
endif
endmethod
method deq takes nothing returns nothing
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Deq Null BigInt")
debug return
debug endif
debug if (next.head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Deq 0 BigInt")
debug return
debug endif
set size = size - 1
set this = prev
set prev.next = next
set next.prev = prev
static if DOUBLE_FREE_CHECK then
call deallocate()
else
set next = thistype(0).next
set thistype(0).next = this
endif
endmethod
method toInt takes nothing returns integer
local integer i = 0
local integer base
debug if (not head) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Attempted To Convert Null BigInt To Int")
debug set i = 1/0
debug endif
if (packed or 0 == bm) then
set base = packedBase[bm.size]
else
set base = bm.size
endif
loop
set this = prev
exitwhen head
set i = i*base+digit
endloop
return i
endmethod
private static string eBigIntString
private static BigInt eBigInt2String
private static method eToString takes nothing returns boolean
local thistype this = eBigInt2String
local string s = ""
local string array chars
local integer stringLength = 0
local Base b = bm
debug local integer c = 0
debug local thistype root = this
if (packed or 0 == bm) then
if (next.head) then
set eBigIntString = "0"
return true
endif
loop
set this = next
exitwhen head
set chars[stringLength] = I2S(digit)
set chars[stringLength + 1] = ", "
set stringLength = stringLength + 2
debug set c = c + 1
debug if (c > root.size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Malformed BigInt: "+s)
debug set b = 1/0
debug endif
endloop
set stringLength = stringLength - 1
else
if (next.head) then
set eBigIntString = b.char(0)
return true
endif
loop
set this = next
exitwhen head
set chars[stringLength] = b.char(digit)
set stringLength = stringLength + 1
debug set c = c + 1
debug if (c > root.size) then
debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,"Malformed BigInt: "+s)
debug set b = 1/0
debug endif
endloop
endif
set s = chars[4095] + chars[4094] + chars[4093] + chars[4092] + chars[4091] + chars[4090] + chars[4089] + chars[4088] + chars[4087] + chars[4086] + chars[4085] + chars[4084] + chars[4083] + chars[4082] + chars[4081] + chars[4080] + chars[4079] + chars[4078] + chars[4077] + chars[4076] + chars[4075] + chars[4074] + chars[4073] + chars[4072] + chars[4071] + chars[4070] + chars[4069] + chars[4068] + chars[4067] + chars[4066] + chars[4065] + chars[4064] + chars[4063] + chars[4062] + chars[4061] + chars[4060] + chars[4059] + chars[4058] + chars[4057] + chars[4056] + chars[4055] + chars[4054] + chars[4053] + chars[4052] + chars[4051] + chars[4050] + chars[4049] + chars[4048] + chars[4047] + chars[4046] + chars[4045] + chars[4044] + chars[4043] + chars[4042] + chars[4041] + chars[4040] + chars[4039] + chars[4038] + chars[4037] + chars[4036] + chars[4035] + chars[4034] + chars[4033] + chars[4032] + chars[4031] + chars[4030] + chars[4029] + chars[4028] + chars[4027] + chars[4026] + chars[4025] + chars[4024] + chars[4023] + chars[4022] + chars[4021] + chars[4020] + chars[4019] + chars[4018] + chars[4017] + chars[4016] + chars[4015] + chars[4014] + chars[4013] + chars[4012] + chars[4011] + chars[4010] + chars[4009] + chars[4008] + chars[4007] + chars[4006] + chars[4005] + chars[4004] + chars[4003] + chars[4002] + chars[4001] + chars[4000] + /*
*/chars[3999] + chars[3998] + chars[3997] + chars[3996] + chars[3995] + chars[3994] + chars[3993] + chars[3992] + chars[3991] + chars[3990] + chars[3989] + chars[3988] + chars[3987] + chars[3986] + chars[3985] + chars[3984] + chars[3983] + chars[3982] + chars[3981] + chars[3980] + chars[3979] + chars[3978] + chars[3977] + chars[3976] + chars[3975] + chars[3974] + chars[3973] + chars[3972] + chars[3971] + chars[3970] + chars[3969] + chars[3968] + chars[3967] + chars[3966] + chars[3965] + chars[3964] + chars[3963] + chars[3962] + chars[3961] + chars[3960] + chars[3959] + chars[3958] + chars[3957] + chars[3956] + chars[3955] + chars[3954] + chars[3953] + chars[3952] + chars[3951] + chars[3950] + chars[3949] + chars[3948] + chars[3947] + chars[3946] + chars[3945] + chars[3944] + chars[3943] + chars[3942] + chars[3941] + chars[3940] + chars[3939] + chars[3938] + chars[3937] + chars[3936] + chars[3935] + chars[3934] + chars[3933] + chars[3932] + chars[3931] + chars[3930] + chars[3929] + chars[3928] + chars[3927] + chars[3926] + chars[3925] + chars[3924] + chars[3923] + chars[3922] + chars[3921] + chars[3920] + chars[3919] + chars[3918] + chars[3917] + chars[3916] + chars[3915] + chars[3914] + chars[3913] + chars[3912] + chars[3911] + chars[3910] + chars[3909] + chars[3908] + chars[3907] + chars[3906] + chars[3905] + chars[3904] + chars[3903] + chars[3902] + chars[3901] + chars[3900] + /*
*/chars[3899] + chars[3898] + chars[3897] + chars[3896] + chars[3895] + chars[3894] + chars[3893] + chars[3892] + chars[3891] + chars[3890] + chars[3889] + chars[3888] + chars[3887] + chars[3886] + chars[3885] + chars[3884] + chars[3883] + chars[3882] + chars[3881] + chars[3880] + chars[3879] + chars[3878] + chars[3877] + chars[3876] + chars[3875] + chars[3874] + chars[3873] + chars[3872] + chars[3871] + chars[3870] + chars[3869] + chars[3868] + chars[3867] + chars[3866] + chars[3865] + chars[3864] + chars[3863] + chars[3862] + chars[3861] + chars[3860] + chars[3859] + chars[3858] + chars[3857] + chars[3856] + chars[3855] + chars[3854] + chars[3853] + chars[3852] + chars[3851] + chars[3850] + chars[3849] + chars[3848] + chars[3847] + chars[3846] + chars[3845] + chars[3844] + chars[3843] + chars[3842] + chars[3841] + chars[3840] + chars[3839] + chars[3838] + chars[3837] + chars[3836] + chars[3835] + chars[3834] + chars[3833] + chars[3832] + chars[3831] + chars[3830] + chars[3829] + chars[3828] + chars[3827] + chars[3826] + chars[3825] + chars[3824] + chars[3823] + chars[3822] + chars[3821] + chars[3820] + chars[3819] + chars[3818] + chars[3817] + chars[3816] + chars[3815] + chars[3814] + chars[3813] + chars[3812] + chars[3811] + chars[3810] + chars[3809] + chars[3808] + chars[3807] + chars[3806] + chars[3805] + chars[3804] + chars[3803] + chars[3802] + chars[3801] + chars[3800] + /*
*/chars[3799] + chars[3798] + chars[3797] + chars[3796] + chars[3795] + chars[3794] + chars[3793] + chars[3792] + chars[3791] + chars[3790] + chars[3789] + chars[3788] + chars[3787] + chars[3786] + chars[3785] + chars[3784] + chars[3783] + chars[3782] + chars[3781] + chars[3780] + chars[3779] + chars[3778] + chars[3777] + chars[3776] + chars[3775] + chars[3774] + chars[3773] + chars[3772] + chars[3771] + chars[3770] + chars[3769] + chars[3768] + chars[3767] + chars[3766] + chars[3765] + chars[3764] + chars[3763] + chars[3762] + chars[3761] + chars[3760] + chars[3759] + chars[3758] + chars[3757] + chars[3756] + chars[3755] + chars[3754] + chars[3753] + chars[3752] + chars[3751] + chars[3750] + chars[3749] + chars[3748] + chars[3747] + chars[3746] + chars[3745] + chars[3744] + chars[3743] + chars[3742] + chars[3741] + chars[3740] + chars[3739] + chars[3738] + chars[3737] + chars[3736] + chars[3735] + chars[3734] + chars[3733] + chars[3732] + chars[3731] + chars[3730] + chars[3729] + chars[3728] + chars[3727] + chars[3726] + chars[3725] + chars[3724] + chars[3723] + chars[3722] + chars[3721] + chars[3720] + chars[3719] + chars[3718] + chars[3717] + chars[3716] + chars[3715] + chars[3714] + chars[3713] + chars[3712] + chars[3711] + chars[3710] + chars[3709] + chars[3708] + chars[3707] + chars[3706] + chars[3705] + chars[3704] + chars[3703] + chars[3702] + chars[3701] + chars[3700] + /*
*/chars[3699] + chars[3698] + chars[3697] + chars[3696] + chars[3695] + chars[3694] + chars[3693] + chars[3692] + chars[3691] + chars[3690] + chars[3689] + chars[3688] + chars[3687] + chars[3686] + chars[3685] + chars[3684] + chars[3683] + chars[3682] + chars[3681] + chars[3680] + chars[3679] + chars[3678] + chars[3677] + chars[3676] + chars[3675] + chars[3674] + chars[3673] + chars[3672] + chars[3671] + chars[3670] + chars[3669] + chars[3668] + chars[3667] + chars[3666] + chars[3665] + chars[3664] + chars[3663] + chars[3662] + chars[3661] + chars[3660] + chars[3659] + chars[3658] + chars[3657] + chars[3656] + chars[3655] + chars[3654] + chars[3653] + chars[3652] + chars[3651] + chars[3650] + chars[3649] + chars[3648] + chars[3647] + chars[3646] + chars[3645] + chars[3644] + chars[3643] + chars[3642] + chars[3641] + chars[3640] + chars[3639] + chars[3638] + chars[3637] + chars[3636] + chars[3635] + chars[3634] + chars[3633] + chars[3632] + chars[3631] + chars[3630] + chars[3629] + chars[3628] + chars[3627] + chars[3626] + chars[3625] + chars[3624] + chars[3623] + chars[3622] + chars[3621] + chars[3620] + chars[3619] + chars[3618] + chars[3617] + chars[3616] + chars[3615] + chars[3614] + chars[3613] + chars[3612] + chars[3611] + chars[3610] + chars[3609] + chars[3608] + chars[3607] + chars[3606] + chars[3605] + chars[3604] + chars[3603] + chars[3602] + chars[3601] + chars[3600] + /*
*/chars[3599] + chars[3598] + chars[3597] + chars[3596] + chars[3595] + chars[3594] + chars[3593] + chars[3592] + chars[3591] + chars[3590] + chars[3589] + chars[3588] + chars[3587] + chars[3586] + chars[3585] + chars[3584] + chars[3583] + chars[3582] + chars[3581] + chars[3580] + chars[3579] + chars[3578] + chars[3577] + chars[3576] + chars[3575] + chars[3574] + chars[3573] + chars[3572] + chars[3571] + chars[3570] + chars[3569] + chars[3568] + chars[3567] + chars[3566] + chars[3565] + chars[3564] + chars[3563] + chars[3562] + chars[3561] + chars[3560] + chars[3559] + chars[3558] + chars[3557] + chars[3556] + chars[3555] + chars[3554] + chars[3553] + chars[3552] + chars[3551] + chars[3550] + chars[3549] + chars[3548] + chars[3547] + chars[3546] + chars[3545] + chars[3544] + chars[3543] + chars[3542] + chars[3541] + chars[3540] + chars[3539] + chars[3538] + chars[3537] + chars[3536] + chars[3535] + chars[3534] + chars[3533] + chars[3532] + chars[3531] + chars[3530] + chars[3529] + chars[3528] + chars[3527] + chars[3526] + chars[3525] + chars[3524] + chars[3523] + chars[3522] + chars[3521] + chars[3520] + chars[3519] + chars[3518] + chars[3517] + chars[3516] + chars[3515] + chars[3514] + chars[3513] + chars[3512] + chars[3511] + chars[3510] + chars[3509] + chars[3508] + chars[3507] + chars[3506] + chars[3505] + chars[3504] + chars[3503] + chars[3502] + chars[3501] + chars[3500] + /*
*/chars[3499] + chars[3498] + chars[3497] + chars[3496] + chars[3495] + chars[3494] + chars[3493] + chars[3492] + chars[3491] + chars[3490] + chars[3489] + chars[3488] + chars[3487] + chars[3486] + chars[3485] + chars[3484] + chars[3483] + chars[3482] + chars[3481] + chars[3480] + chars[3479] + chars[3478] + chars[3477] + chars[3476] + chars[3475] + chars[3474] + chars[3473] + chars[3472] + chars[3471] + chars[3470] + chars[3469] + chars[3468] + chars[3467] + chars[3466] + chars[3465] + chars[3464] + chars[3463] + chars[3462] + chars[3461] + chars[3460] + chars[3459] + chars[3458] + chars[3457] + chars[3456] + chars[3455] + chars[3454] + chars[3453] + chars[3452] + chars[3451] + chars[3450] + chars[3449] + chars[3448] + chars[3447] + chars[3446] + chars[3445] + chars[3444] + chars[3443] + chars[3442] + chars[3441] + chars[3440] + chars[3439] + chars[3438] + chars[3437] + chars[3436] + chars[3435] + chars[3434] + chars[3433] + chars[3432] + chars[3431] + chars[3430] + chars[3429] + chars[3428] + chars[3427] + chars[3426] + chars[3425] + chars[3424] + chars[3423] + chars[3422] + chars[3421] + chars[3420] + chars[3419] + chars[3418] + chars[3417] + chars[3416] + chars[3415] + chars[3414] + chars[3413] + chars[3412] + chars[3411] + chars[3410] + chars[3409] + chars[3408] + chars[3407] + chars[3406] + chars[3405] + chars[3404] + chars[3403] + chars[3402] + chars[3401] + chars[3400] + /*
*/chars[3399] + chars[3398] + chars[3397] + chars[3396] + chars[3395] + chars[3394] + chars[3393] + chars[3392] + chars[3391] + chars[3390] + chars[3389] + chars[3388] + chars[3387] + chars[3386] + chars[3385] + chars[3384] + chars[3383] + chars[3382] + chars[3381] + chars[3380] + chars[3379] + chars[3378] + chars[3377] + chars[3376] + chars[3375] + chars[3374] + chars[3373] + chars[3372] + chars[3371] + chars[3370] + chars[3369] + chars[3368] + chars[3367] + chars[3366] + chars[3365] + chars[3364] + chars[3363] + chars[3362] + chars[3361] + chars[3360] + chars[3359] + chars[3358] + chars[3357] + chars[3356] + chars[3355] + chars[3354] + chars[3353] + chars[3352] + chars[3351] + chars[3350] + chars[3349] + chars[3348] + chars[3347] + chars[3346] + chars[3345] + chars[3344] + chars[3343] + chars[3342] + chars[3341] + chars[3340] + chars[3339] + chars[3338] + chars[3337] + chars[3336] + chars[3335] + chars[3334] + chars[3333] + chars[3332] + chars[3331] + chars[3330] + chars[3329] + chars[3328] + chars[3327] + chars[3326] + chars[3325] + chars[3324] + chars[3323] + chars[3322] + chars[3321] + chars[3320] + chars[3319] + chars[3318] + chars[3317] + chars[3316] + chars[3315] + chars[3314] + chars[3313] + chars[3312] + chars[3311] + chars[3310] + chars[3309] + chars[3308] + chars[3307] + chars[3306] + chars[3305] + chars[3304] + chars[3303] + chars[3302] + chars[3301] + chars[3300] + /*
*/chars[3299] + chars[3298] + chars[3297] + chars[3296] + chars[3295] + chars[3294] + chars[3293] + chars[3292] + chars[3291] + chars[3290] + chars[3289] + chars[3288] + chars[3287] + chars[3286] + chars[3285] + chars[3284] + chars[3283] + chars[3282] + chars[3281] + chars[3280] + chars[3279] + chars[3278] + chars[3277] + chars[3276] + chars[3275] + chars[3274] + chars[3273] + chars[3272] + chars[3271] + chars[3270] + chars[3269] + chars[3268] + chars[3267] + chars[3266] + chars[3265] + chars[3264] + chars[3263] + chars[3262] + chars[3261] + chars[3260] + chars[3259] + chars[3258] + chars[3257] + chars[3256] + chars[3255] + chars[3254] + chars[3253] + chars[3252] + chars[3251] + chars[3250] + chars[3249] + chars[3248] + chars[3247] + chars[3246] + chars[3245] + chars[3244] + chars[3243] + chars[3242] + chars[3241] + chars[3240] + chars[3239] + chars[3238] + chars[3237] + chars[3236] + chars[3235] + chars[3234] + chars[3233] + chars[3232] + chars[3231] + chars[3230] + chars[3229] + chars[3228] + chars[3227] + chars[3226] + chars[3225] + chars[3224] + chars[3223] + chars[3222] + chars[3221] + chars[3220] + chars[3219] + chars[3218] + chars[3217] + chars[3216] + chars[3215] + chars[3214] + chars[3213] + chars[3212] + chars[3211] + chars[3210] + chars[3209] + chars[3208] + chars[3207] + chars[3206] + chars[3205] + chars[3204] + chars[3203] + chars[3202] + chars[3201] + chars[3200] + /*
*/chars[3199] + chars[3198] + chars[3197] + chars[3196] + chars[3195] + chars[3194] + chars[3193] + chars[3192] + chars[3191] + chars[3190] + chars[3189] + chars[3188] + chars[3187] + chars[3186] + chars[3185] + chars[3184] + chars[3183] + chars[3182] + chars[3181] + chars[3180] + chars[3179] + chars[3178] + chars[3177] + chars[3176] + chars[3175] + chars[3174] + chars[3173] + chars[3172] + chars[3171] + chars[3170] + chars[3169] + chars[3168] + chars[3167] + chars[3166] + chars[3165] + chars[3164] + chars[3163] + chars[3162] + chars[3161] + chars[3160] + chars[3159] + chars[3158] + chars[3157] + chars[3156] + chars[3155] + chars[3154] + chars[3153] + chars[3152] + chars[3151] + chars[3150] + chars[3149] + chars[3148] + chars[3147] + chars[3146] + chars[3145] + chars[3144] + chars[3143] + chars[3142] + chars[3141] + chars[3140] + chars[3139] + chars[3138] + chars[3137] + chars[3136] + chars[3135] + chars[3134] + chars[3133] + chars[3132] + chars[3131] + chars[3130] + chars[3129] + chars[3128] + chars[3127] + chars[3126] + chars[3125] + chars[3124] + chars[3123] + chars[3122] + chars[3121] + chars[3120] + chars[3119] + chars[3118] + chars[3117] + chars[3116] + chars[3115] + chars[3114] + chars[3113] + chars[3112] + chars[3111] + chars[3110] + chars[3109] + chars[3108] + chars[3107] + chars[3106] + chars[3105] + chars[3104] + chars[3103] + chars[3102] + chars[3101] + chars[3100] + /*
*/chars[3099] + chars[3098] + chars[3097] + chars[3096] + chars[3095] + chars[3094] + chars[3093] + chars[3092] + chars[3091] + chars[3090] + chars[3089] + chars[3088] + chars[3087] + chars[3086] + chars[3085] + chars[3084] + chars[3083] + chars[3082] + chars[3081] + chars[3080] + chars[3079] + chars[3078] + chars[3077] + chars[3076] + chars[3075] + chars[3074] + chars[3073] + chars[3072] + chars[3071] + chars[3070] + chars[3069] + chars[3068] + chars[3067] + chars[3066] + chars[3065] + chars[3064] + chars[3063] + chars[3062] + chars[3061] + chars[3060] + chars[3059] + chars[3058] + chars[3057] + chars[3056] + chars[3055] + chars[3054] + chars[3053] + chars[3052] + chars[3051] + chars[3050] + chars[3049] + chars[3048] + chars[3047] + chars[3046] + chars[3045] + chars[3044] + chars[3043] + chars[3042] + chars[3041] + chars[3040] + chars[3039] + chars[3038] + chars[3037] + chars[3036] + chars[3035] + chars[3034] + chars[3033] + chars[3032] + chars[3031] + chars[3030] + chars[3029] + chars[3028] + chars[3027] + chars[3026] + chars[3025] + chars[3024] + chars[3023] + chars[3022] + chars[3021] + chars[3020] + chars[3019] + chars[3018] + chars[3017] + chars[3016] + chars[3015] + chars[3014] + chars[3013] + chars[3012] + chars[3011] + chars[3010] + chars[3009] + chars[3008] + chars[3007] + chars[3006] + chars[3005] + chars[3004] + chars[3003] + chars[3002] + chars[3001] + chars[3000] + /*
*/chars[2999] + chars[2998] + chars[2997] + chars[2996] + chars[2995] + chars[2994] + chars[2993] + chars[2992] + chars[2991] + chars[2990] + chars[2989] + chars[2988] + chars[2987] + chars[2986] + chars[2985] + chars[2984] + chars[2983] + chars[2982] + chars[2981] + chars[2980] + chars[2979] + chars[2978] + chars[2977] + chars[2976] + chars[2975] + chars[2974] + chars[2973] + chars[2972] + chars[2971] + chars[2970] + chars[2969] + chars[2968] + chars[2967] + chars[2966] + chars[2965] + chars[2964] + chars[2963] + chars[2962] + chars[2961] + chars[2960] + chars[2959] + chars[2958] + chars[2957] + chars[2956] + chars[2955] + chars[2954] + chars[2953] + chars[2952] + chars[2951] + chars[2950] + chars[2949] + chars[2948] + chars[2947] + chars[2946] + chars[2945] + chars[2944] + chars[2943] + chars[2942] + chars[2941] + chars[2940] + chars[2939] + chars[2938] + chars[2937] + chars[2936] + chars[2935] + chars[2934] + chars[2933] + chars[2932] + chars[2931] + chars[2930] + chars[2929] + chars[2928] + chars[2927] + chars[2926] + chars[2925] + chars[2924] + chars[2923] + chars[2922] + chars[2921] + chars[2920] + chars[2919] + chars[2918] + chars[2917] + chars[2916] + chars[2915] + chars[2914] + chars[2913] + chars[2912] + chars[2911] + chars[2910] + chars[2909] + chars[2908] + chars[2907] + chars[2906] + chars[2905] + chars[2904] + chars[2903] + chars[2902] + chars[2901] + chars[2900] + /*
*/chars[2899] + chars[2898] + chars[2897] + chars[2896] + chars[2895] + chars[2894] + chars[2893] + chars[2892] + chars[2891] + chars[2890] + chars[2889] + chars[2888] + chars[2887] + chars[2886] + chars[2885] + chars[2884] + chars[2883] + chars[2882] + chars[2881] + chars[2880] + chars[2879] + chars[2878] + chars[2877] + chars[2876] + chars[2875] + chars[2874] + chars[2873] + chars[2872] + chars[2871] + chars[2870] + chars[2869] + chars[2868] + chars[2867] + chars[2866] + chars[2865] + chars[2864] + chars[2863] + chars[2862] + chars[2861] + chars[2860] + chars[2859] + chars[2858] + chars[2857] + chars[2856] + chars[2855] + chars[2854] + chars[2853] + chars[2852] + chars[2851] + chars[2850] + chars[2849] + chars[2848] + chars[2847] + chars[2846] + chars[2845] + chars[2844] + chars[2843] + chars[2842] + chars[2841] + chars[2840] + chars[2839] + chars[2838] + chars[2837] + chars[2836] + chars[2835] + chars[2834] + chars[2833] + chars[2832] + chars[2831] + chars[2830] + chars[2829] + chars[2828] + chars[2827] + chars[2826] + chars[2825] + chars[2824] + chars[2823] + chars[2822] + chars[2821] + chars[2820] + chars[2819] + chars[2818] + chars[2817] + chars[2816] + chars[2815] + chars[2814] + chars[2813] + chars[2812] + chars[2811] + chars[2810] + chars[2809] + chars[2808] + chars[2807] + chars[2806] + chars[2805] + chars[2804] + chars[2803] + chars[2802] + chars[2801] + chars[2800] + /*
*/chars[2799] + chars[2798] + chars[2797] + chars[2796] + chars[2795] + chars[2794] + chars[2793] + chars[2792] + chars[2791] + chars[2790] + chars[2789] + chars[2788] + chars[2787] + chars[2786] + chars[2785] + chars[2784] + chars[2783] + chars[2782] + chars[2781] + chars[2780] + chars[2779] + chars[2778] + chars[2777] + chars[2776] + chars[2775] + chars[2774] + chars[2773] + chars[2772] + chars[2771] + chars[2770] + chars[2769] + chars[2768] + chars[2767] + chars[2766] + chars[2765] + chars[2764] + chars[2763] + chars[2762] + chars[2761] + chars[2760] + chars[2759] + chars[2758] + chars[2757] + chars[2756] + chars[2755] + chars[2754] + chars[2753] + chars[2752] + chars[2751] + chars[2750] + chars[2749] + chars[2748] + chars[2747] + chars[2746] + chars[2745] + chars[2744] + chars[2743] + chars[2742] + chars[2741] + chars[2740] + chars[2739] + chars[2738] + chars[2737] + chars[2736] + chars[2735] + chars[2734] + chars[2733] + chars[2732] + chars[2731] + chars[2730] + chars[2729] + chars[2728] + chars[2727] + chars[2726] + chars[2725] + chars[2724] + chars[2723] + chars[2722] + chars[2721] + chars[2720] + chars[2719] + chars[2718] + chars[2717] + chars[2716] + chars[2715] + chars[2714] + chars[2713] + chars[2712] + chars[2711] + chars[2710] + chars[2709] + chars[2708] + chars[2707] + chars[2706] + chars[2705] + chars[2704] + chars[2703] + chars[2702] + chars[2701] + chars[2700] + /*
*/chars[2699] + chars[2698] + chars[2697] + chars[2696] + chars[2695] + chars[2694] + chars[2693] + chars[2692] + chars[2691] + chars[2690] + chars[2689] + chars[2688] + chars[2687] + chars[2686] + chars[2685] + chars[2684] + chars[2683] + chars[2682] + chars[2681] + chars[2680] + chars[2679] + chars[2678] + chars[2677] + chars[2676] + chars[2675] + chars[2674] + chars[2673] + chars[2672] + chars[2671] + chars[2670] + chars[2669] + chars[2668] + chars[2667] + chars[2666] + chars[2665] + chars[2664] + chars[2663] + chars[2662] + chars[2661] + chars[2660] + chars[2659] + chars[2658] + chars[2657] + chars[2656] + chars[2655] + chars[2654] + chars[2653] + chars[2652] + chars[2651] + chars[2650] + chars[2649] + chars[2648] + chars[2647] + chars[2646] + chars[2645] + chars[2644] + chars[2643] + chars[2642] + chars[2641] + chars[2640] + chars[2639] + chars[2638] + chars[2637] + chars[2636] + chars[2635] + chars[2634] + chars[2633] + chars[2632] + chars[2631] + chars[2630] + chars[2629] + chars[2628] + chars[2627] + chars[2626] + chars[2625] + chars[2624] + chars[2623] + chars[2622] + chars[2621] + chars[2620] + chars[2619] + chars[2618] + chars[2617] + chars[2616] + chars[2615] + chars[2614] + chars[2613] + chars[2612] + chars[2611] + chars[2610] + chars[2609] + chars[2608] + chars[2607] + chars[2606] + chars[2605] + chars[2604] + chars[2603] + chars[2602] + chars[2601] + chars[2600] + /*
*/chars[2599] + chars[2598] + chars[2597] + chars[2596] + chars[2595] + chars[2594] + chars[2593] + chars[2592] + chars[2591] + chars[2590] + chars[2589] + chars[2588] + chars[2587] + chars[2586] + chars[2585] + chars[2584] + chars[2583] + chars[2582] + chars[2581] + chars[2580] + chars[2579] + chars[2578] + chars[2577] + chars[2576] + chars[2575] + chars[2574] + chars[2573] + chars[2572] + chars[2571] + chars[2570] + chars[2569] + chars[2568] + chars[2567] + chars[2566] + chars[2565] + chars[2564] + chars[2563] + chars[2562] + chars[2561] + chars[2560] + chars[2559] + chars[2558] + chars[2557] + chars[2556] + chars[2555] + chars[2554] + chars[2553] + chars[2552] + chars[2551] + chars[2550] + chars[2549] + chars[2548] + chars[2547] + chars[2546] + chars[2545] + chars[2544] + chars[2543] + chars[2542] + chars[2541] + chars[2540] + chars[2539] + chars[2538] + chars[2537] + chars[2536] + chars[2535] + chars[2534] + chars[2533] + chars[2532] + chars[2531] + chars[2530] + chars[2529] + chars[2528] + chars[2527] + chars[2526] + chars[2525] + chars[2524] + chars[2523] + chars[2522] + chars[2521] + chars[2520] + chars[2519] + chars[2518] + chars[2517] + chars[2516] + chars[2515] + chars[2514] + chars[2513] + chars[2512] + chars[2511] + chars[2510] + chars[2509] + chars[2508] + chars[2507] + chars[2506] + chars[2505] + chars[2504] + chars[2503] + chars[2502] + chars[2501] + chars[2500] + /*
*/chars[2499] + chars[2498] + chars[2497] + chars[2496] + chars[2495] + chars[2494] + chars[2493] + chars[2492] + chars[2491] + chars[2490] + chars[2489] + chars[2488] + chars[2487] + chars[2486] + chars[2485] + chars[2484] + chars[2483] + chars[2482] + chars[2481] + chars[2480] + chars[2479] + chars[2478] + chars[2477] + chars[2476] + chars[2475] + chars[2474] + chars[2473] + chars[2472] + chars[2471] + chars[2470] + chars[2469] + chars[2468] + chars[2467] + chars[2466] + chars[2465] + chars[2464] + chars[2463] + chars[2462] + chars[2461] + chars[2460] + chars[2459] + chars[2458] + chars[2457] + chars[2456] + chars[2455] + chars[2454] + chars[2453] + chars[2452] + chars[2451] + chars[2450] + chars[2449] + chars[2448] + chars[2447] + chars[2446] + chars[2445] + chars[2444] + chars[2443] + chars[2442] + chars[2441] + chars[2440] + chars[2439] + chars[2438] + chars[2437] + chars[2436] + chars[2435] + chars[2434] + chars[2433] + chars[2432] + chars[2431] + chars[2430] + chars[2429] + chars[2428] + chars[2427] + chars[2426] + chars[2425] + chars[2424] + chars[2423] + chars[2422] + chars[2421] + chars[2420] + chars[2419] + chars[2418] + chars[2417] + chars[2416] + chars[2415] + chars[2414] + chars[2413] + chars[2412] + chars[2411] + chars[2410] + chars[2409] + chars[2408] + chars[2407] + chars[2406] + chars[2405] + chars[2404] + chars[2403] + chars[2402] + chars[2401] + chars[2400] + /*