From 6d340a22259121eae8750999387a1d03fb14ed55 Mon Sep 17 00:00:00 2001 From: Antoine FONDEUR Date: Tue, 28 May 2024 22:46:21 +0200 Subject: [PATCH 1/2] add testing framework --- src/tests.ts | 164 ++++--- src/ui/Code.ts | 1 - src/vm/constants.ts | 1002 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1096 insertions(+), 71 deletions(-) diff --git a/src/tests.ts b/src/tests.ts index a47c530..3e504dd 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -1,84 +1,108 @@ -function testInstruction( - encodedInstruction: string = "0x208b7fff7fff7ffe", -): void { - const instruction: [any[]] = DECODE_INSTRUCTION(encodedInstruction); - console.log(instruction); -} +function testRunner() { + if (typeof GasTap === "undefined") { + eval( + UrlFetchApp.fetch( + "https://raw.githubusercontent.com/huan/gast/master/src/gas-tap-lib.js", + ).getContentText(), + ); + } -function testGetR1C1(): void { - var ss: GoogleAppsScript.Spreadsheet.Spreadsheet = - SpreadsheetApp.getActiveSpreadsheet(); - var sheet: GoogleAppsScript.Spreadsheet.Sheet = ss.getSheets()[0]; + var test = new GasTap(); - var range: GoogleAppsScript.Spreadsheet.Range = sheet.getRange("B5"); - var formula: number = range.getColumn(); - Logger.log(formula); -} + test("instruction decoder", (t) => { + var encodedInstruction: string = "0x208b7fff7fff7ffe"; + const instruction: [any[]] = DECODE_INSTRUCTION(encodedInstruction); + const expectedInstruction: [any[]] = [ + ["Ret", "[FP - 2]", "[FP - 1]", "jmp abs", "AP", "Dst"], + ]; + t.deepEqual(instruction, expectedInstruction); + }); -function testGetProgram(): void { - const program: any[][] = SpreadsheetApp.getActiveSpreadsheet() - .getSheetByName("Program") - .getRange("A2:A") - .getValues(); - Logger.log(program); -} + test("get R1C1", (t) => { + var ss: GoogleAppsScript.Spreadsheet.Spreadsheet = + SpreadsheetApp.getActiveSpreadsheet(); + var sheet: GoogleAppsScript.Spreadsheet.Sheet = ss.getSheets()[0]; -function testObjectFromArray(): void { - const keys: string[] = ["a", "b", "c"]; - const values: number[] = [1, 2, 3]; - const target: any = objectFromEntries(keys, values); - Logger.log(target); -} + var range: GoogleAppsScript.Spreadsheet.Range = sheet.getRange("B5"); + var formula: number = range.getColumn(); + t.equal(formula, 2.0); + }); -function testCurrentStep(): void { - Logger.log(getLastActiveRowIndex("A") - 2); -} + test("get program", (t) => { + var ss: GoogleAppsScript.Spreadsheet.Spreadsheet = + SpreadsheetApp.getActiveSpreadsheet(); + const program: any[][] = ss + .getSheetByName("Program") + .getRange("A2:A") + .getValues(); + t.deepEqual(program, expectedProgram); + }); -function testAddition(): void { - var P = new AffinePoint( - "45477851653901153117103016505176923677805691341513469374986918421704783798", - "183085939200008105303514891306249502070824714566204820793608690653248096343", - ); - var Q = new AffinePoint( - "1110490586165327629491026518265864493948957016447342824580924691292949995955", - "3150911138446828848637348285516855379003902600135909185517179002759670428860", - ); - var minusP = new AffinePoint( - "45477851653901153117103016505176923677805691341513469374986918421704783798", - "-183085939200008105303514891306249502070824714566204820793608690653248096343", - ); - var neutralElement = new AffinePoint("0x0", "0x0", true); - Logger.log(add(P, neutralElement)); - //Expect : - //x=45477851653901153117103016505176923677805691341513469374986918421704783798 - //y=183085939200008105303514891306249502070824714566204820793608690653248096343 - Logger.log(add(neutralElement, P)); - //x=45477851653901153117103016505176923677805691341513469374986918421704783798 - //y=183085939200008105303514891306249502070824714566204820793608690653248096343 - Logger.log(add(P, minusP)); - //Expect : - //isNeutralElement=true - Logger.log(add(P, P)); - //Expect : - //x=1968885970339083619948296146201104092252508104349267720068326878178341392969 - //y=593121236708823356289653686480454355603982629001053929931980663109960391985 - Logger.log(add(P, Q)); - //Expect : - //x=2825233123465961750980798694652743017262313358557354910947070689454726096961 - //y=3554824400633731496516020947624430028316074332303691877626182575674539922487 -} + test("object from array", (t) => { + const keys: string[] = ["a", "b", "c"]; + const values: number[] = [1, 2, 3]; + const target: any = objectFromEntries(keys, values); + const expectedTarget = { b: 2.0, a: 1.0, c: 3.0 }; + t.deepEqual(target, expectedTarget); + }); + + test("ec addition (pedersen)", (t) => { + var P = new AffinePoint( + "45477851653901153117103016505176923677805691341513469374986918421704783798", + "183085939200008105303514891306249502070824714566204820793608690653248096343", + ); + var Q = new AffinePoint( + "1110490586165327629491026518265864493948957016447342824580924691292949995955", + "3150911138446828848637348285516855379003902600135909185517179002759670428860", + ); + var minusP = new AffinePoint( + "45477851653901153117103016505176923677805691341513469374986918421704783798", + "-183085939200008105303514891306249502070824714566204820793608690653248096343", + ); + var neutralElement = new AffinePoint("0x0", "0x0", true); -function testPedersen(): void { - Logger.log( - pedersen( + var R: AffinePoint; + var expectedR; + + R = add(P, neutralElement); + expectedR = P; + t.deepEqual(R, expectedR, "P + 0 = P"); + + R = add(neutralElement, P); + expectedR = P; + t.deepEqual(R, expectedR, "0 + P = P"); + + R = add(P, minusP); + t.equal(R.isNeutralElement, true, "P - P = 0"); + + R = add(P, P); + expectedR = new AffinePoint( + "1968885970339083619948296146201104092252508104349267720068326878178341392969", + "593121236708823356289653686480454355603982629001053929931980663109960391985", + ); + t.deepEqual(R, expectedR, "P + P"); + + R = add(P, Q); + expectedR = new AffinePoint( + "2825233123465961750980798694652743017262313358557354910947070689454726096961", + "3554824400633731496516020947624430028316074332303691877626182575674539922487", + ); + t.deepEqual(R, expectedR, "P + Q"); + }); + + test("pedersen hash", (t) => { + var hash: string = pedersen( BigInt( "0x03d937c035c878245caf64531a5756109c53068da139362728feb561405371cb", ), BigInt( "0x0208a0a10250e382e1e4bbe2880906c2791bf6275695e02fbbc6aeff9cd8b31a", ), - ).toString(16), - ); - //Expect : - //30e480bed5fe53fa909cc0f8c4d99b8f9f2c016be4c41e13a4848797979c662 + ).toString(16); + var expectedHash: string = + "30e480bed5fe53fa909cc0f8c4d99b8f9f2c016be4c41e13a4848797979c662"; + t.equal(hash, expectedHash); + }); + + test.finish(); } diff --git a/src/ui/Code.ts b/src/ui/Code.ts index 32b368c..7a608de 100644 --- a/src/ui/Code.ts +++ b/src/ui/Code.ts @@ -14,7 +14,6 @@ function DECODE_INSTRUCTION(encodedInstruction: string): [any[]] { const instruction: decodedInstruction = decodeInstruction( BigInt(encodedInstruction), ); - Logger.log(instruction); if ( instruction.Opcode === Opcodes.NOp && diff --git a/src/vm/constants.ts b/src/vm/constants.ts index cc4c1d1..a2d106b 100644 --- a/src/vm/constants.ts +++ b/src/vm/constants.ts @@ -84,3 +84,1005 @@ const FpUpdates: FpUpdatesType = { const FINAL_FP: string = ""; const FINAL_PC: string = ""; + +const expectedProgram: any[][] = [ + ["0x482680017ffd8000"], + ["0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffff"], + ["0x480680017fff8000"], + ["0x1"], + ["0x480680017fff8000"], + ["0x1"], + ["0x482480017ffd8000"], + ["0x800000000000011000000000000000000000000000000000000000000000000"], + ["0x48127ffe7fff8000"], + ["0x48307ffd7ffc8000"], + ["0x20680017fff7ffd"], + ["0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffd"], + ["0x208b7fff7fff7ffe"], + ["0x480680017fff8000"], + ["0xa"], + ["0x1104800180018000"], + ["0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff2"], + ["0x208b7fff7fff7ffe"], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], + [""], +]; From 37a3673afe86dace24036af81b7681f05eccb7a8 Mon Sep 17 00:00:00 2001 From: Antoine FONDEUR Date: Wed, 29 May 2024 22:07:24 +0200 Subject: [PATCH 2/2] removed irrelevent tests --- src/tests.ts | 20 - src/vm/constants.ts | 1002 ------------------------------------------- 2 files changed, 1022 deletions(-) diff --git a/src/tests.ts b/src/tests.ts index 3e504dd..652ae66 100644 --- a/src/tests.ts +++ b/src/tests.ts @@ -18,26 +18,6 @@ function testRunner() { t.deepEqual(instruction, expectedInstruction); }); - test("get R1C1", (t) => { - var ss: GoogleAppsScript.Spreadsheet.Spreadsheet = - SpreadsheetApp.getActiveSpreadsheet(); - var sheet: GoogleAppsScript.Spreadsheet.Sheet = ss.getSheets()[0]; - - var range: GoogleAppsScript.Spreadsheet.Range = sheet.getRange("B5"); - var formula: number = range.getColumn(); - t.equal(formula, 2.0); - }); - - test("get program", (t) => { - var ss: GoogleAppsScript.Spreadsheet.Spreadsheet = - SpreadsheetApp.getActiveSpreadsheet(); - const program: any[][] = ss - .getSheetByName("Program") - .getRange("A2:A") - .getValues(); - t.deepEqual(program, expectedProgram); - }); - test("object from array", (t) => { const keys: string[] = ["a", "b", "c"]; const values: number[] = [1, 2, 3]; diff --git a/src/vm/constants.ts b/src/vm/constants.ts index a2d106b..cc4c1d1 100644 --- a/src/vm/constants.ts +++ b/src/vm/constants.ts @@ -84,1005 +84,3 @@ const FpUpdates: FpUpdatesType = { const FINAL_FP: string = ""; const FINAL_PC: string = ""; - -const expectedProgram: any[][] = [ - ["0x482680017ffd8000"], - ["0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffff"], - ["0x480680017fff8000"], - ["0x1"], - ["0x480680017fff8000"], - ["0x1"], - ["0x482480017ffd8000"], - ["0x800000000000011000000000000000000000000000000000000000000000000"], - ["0x48127ffe7fff8000"], - ["0x48307ffd7ffc8000"], - ["0x20680017fff7ffd"], - ["0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffd"], - ["0x208b7fff7fff7ffe"], - ["0x480680017fff8000"], - ["0xa"], - ["0x1104800180018000"], - ["0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff2"], - ["0x208b7fff7fff7ffe"], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], - [""], -];