From 61e9bef2a32107ea893dec935e644d1deea25fb8 Mon Sep 17 00:00:00 2001 From: Adam Chidlow Date: Fri, 22 Mar 2024 12:17:51 +0800 Subject: [PATCH] docs: add `default=` keyword to `GlobalState.get()` usage to make example clearer --- .../out/TicTacToeContract.approval.mir | 626 +++++++++--------- .../out/TicTacToeContract.approval.teal | 58 +- .../out/TicTacToeContract.arc32.json | 2 +- .../out/TicTacToeContract.destructured.ir | 46 +- .../tictactoe/out/TicTacToeContract.ssa.ir | 50 +- .../out/TicTacToeContract.ssa.opt_pass_1.ir | 46 +- .../out/TicTacToeContract.ssa.opt_pass_2.ir | 46 +- .../out_O2/TicTacToeContract.destructured.ir | 40 +- .../TicTacToeContract.approval.teal | 60 +- .../TicTacToeContract.destructured.ir | 50 +- examples/tictactoe/puya.log | 226 +++---- examples/tictactoe/tictactoe.py | 4 +- 12 files changed, 636 insertions(+), 618 deletions(-) diff --git a/examples/tictactoe/out/TicTacToeContract.approval.mir b/examples/tictactoe/out/TicTacToeContract.approval.mir index 8024617421..4bcd14ea12 100644 --- a/examples/tictactoe/out/TicTacToeContract.approval.mir +++ b/examples/tictactoe/out/TicTacToeContract.approval.mir @@ -293,26 +293,26 @@ join_game_block@0: // examples.tictactoe.tictactoe.TicTacToeContract.make_move(player: bytes, move.0: uint64, move.1: uint64) -> void: make_move: - proto 3 0 // (𝕡) player#0,move.0#0,move.1#0 | @subroutine\ndef make_move(self, player: arc4.UInt8, move: Move) -> None: tictactoe/tictactoe.py:58-59 + proto 3 0 // (𝕡) player#0,move.0#0,move.1#0 | @subroutine\ndef make_move(self, player: arc4.UInt8, move: Move) -> None: tictactoe/tictactoe.py:60-61 make_move_block@0: - frame_dig -2 // load move.0#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | move.0#0 column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:61 - int 3 // (𝕡) player#0,move.0#0,move.1#0 | move.0#0,3 3 tictactoe/tictactoe.py:61 - < // (𝕡) player#0,move.0#0,move.1#0 | {<} column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:61 - dup // store tmp%0#0 to l-stack (copy) (𝕡) player#0,move.0#0,move.1#0 | tmp%0#0,tmp%0#0 column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:61 - swap // store tmp%0#0 to f-stack (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%0#0 column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:61 - // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%0#0 column < 3 and row < 3 tictactoe/tictactoe.py:61 - bz make_move_bool_false@3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | column < 3 and row < 3 tictactoe/tictactoe.py:61 - // Implicit fall through to make_move_and_contd@1 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | column < 3 and row < 3 tictactoe/tictactoe.py:61 + frame_dig -2 // load move.0#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | move.0#0 column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:63 + int 3 // (𝕡) player#0,move.0#0,move.1#0 | move.0#0,3 3 tictactoe/tictactoe.py:63 + < // (𝕡) player#0,move.0#0,move.1#0 | {<} column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:63 + dup // store tmp%0#0 to l-stack (copy) (𝕡) player#0,move.0#0,move.1#0 | tmp%0#0,tmp%0#0 column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:63 + swap // store tmp%0#0 to f-stack (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%0#0 column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:63 + // virtual: load tmp%0#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%0#0 column < 3 and row < 3 tictactoe/tictactoe.py:63 + bz make_move_bool_false@3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | column < 3 and row < 3 tictactoe/tictactoe.py:63 + // Implicit fall through to make_move_and_contd@1 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | column < 3 and row < 3 tictactoe/tictactoe.py:63 make_move_and_contd@1: - frame_dig -1 // load move.1#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | move.1#0 row < 3, "Move must be in range" tictactoe/tictactoe.py:61 - int 3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | move.1#0,3 3 tictactoe/tictactoe.py:61 - < // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {<} row < 3, "Move must be in range" tictactoe/tictactoe.py:61 - // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%1#0 row < 3, "Move must be in range" tictactoe/tictactoe.py:61 - // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%1#0 column < 3 and row < 3 tictactoe/tictactoe.py:61 - bz make_move_bool_false@3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | column < 3 and row < 3 tictactoe/tictactoe.py:61 - // Implicit fall through to make_move_bool_true@2 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | column < 3 and row < 3 tictactoe/tictactoe.py:61 + frame_dig -1 // load move.1#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | move.1#0 row < 3, "Move must be in range" tictactoe/tictactoe.py:63 + int 3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | move.1#0,3 3 tictactoe/tictactoe.py:63 + < // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {<} row < 3, "Move must be in range" tictactoe/tictactoe.py:63 + // virtual: store tmp%1#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%1#0 row < 3, "Move must be in range" tictactoe/tictactoe.py:63 + // virtual: load tmp%1#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%1#0 column < 3 and row < 3 tictactoe/tictactoe.py:63 + bz make_move_bool_false@3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | column < 3 and row < 3 tictactoe/tictactoe.py:63 + // Implicit fall through to make_move_bool_true@2 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | column < 3 and row < 3 tictactoe/tictactoe.py:63 make_move_bool_true@2: int 1 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 1 @@ -325,126 +325,126 @@ make_move_bool_false@3: // Implicit fall through to make_move_bool_merge@4 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | (𝕏) and_result%2#0 | and_result%2#0 make_move_bool_merge@4: - // virtual: load and_result%2#0 from x-stack (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | and_result%2#0 and_result%2#0 assert column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:61 - assert // Move must be in range // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | assert column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:61 - int 0 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0 self.game tictactoe/tictactoe.py:62 - byte "game" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0,"game" self.game tictactoe/tictactoe.py:62 - app_global_get_ex // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.game tictactoe/tictactoe.py:62 - // virtual: store game_exists%4#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_exists%4#0,{app_global_get_ex}.0 self.game tictactoe/tictactoe.py:62 - // virtual: store game_value%3#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,game_exists%4#0 self.game tictactoe/tictactoe.py:62 - // virtual: load game_exists%4#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,game_exists%4#0 self.game tictactoe/tictactoe.py:62 - assert // check game exists // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0 self.game tictactoe/tictactoe.py:62 - frame_dig -1 // load move.1#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,move.1#0 self.game[row] tictactoe/tictactoe.py:62 - int 3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,move.1#0,3 self.game[row] tictactoe/tictactoe.py:62 - < // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,{<} self.game[row] tictactoe/tictactoe.py:62 - // virtual: store index_is_in_bounds%6#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,index_is_in_bounds%6#0 self.game[row] tictactoe/tictactoe.py:62 - // virtual: load index_is_in_bounds%6#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,index_is_in_bounds%6#0 self.game[row] tictactoe/tictactoe.py:62 - assert // Index access is out of bounds // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0 self.game[row] tictactoe/tictactoe.py:62 - frame_dig -1 // load move.1#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,move.1#0 self.game[row] tictactoe/tictactoe.py:62 - int 3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,move.1#0,3 self.game[row] tictactoe/tictactoe.py:62 - * // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,{*} self.game[row] tictactoe/tictactoe.py:62 - // virtual: store item_index%7#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,item_index%7#0 self.game[row] tictactoe/tictactoe.py:62 - // virtual: load game_value%3#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%3#0 self.game[row] tictactoe/tictactoe.py:62 - // virtual: load item_index%7#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,item_index%7#0 self.game[row] tictactoe/tictactoe.py:62 + // virtual: load and_result%2#0 from x-stack (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | and_result%2#0 and_result%2#0 assert column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:63 + assert // Move must be in range // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | assert column < 3 and row < 3, "Move must be in range" tictactoe/tictactoe.py:63 + int 0 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0 self.game tictactoe/tictactoe.py:64 + byte "game" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0,"game" self.game tictactoe/tictactoe.py:64 + app_global_get_ex // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.game tictactoe/tictactoe.py:64 + // virtual: store game_exists%4#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_exists%4#0,{app_global_get_ex}.0 self.game tictactoe/tictactoe.py:64 + // virtual: store game_value%3#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,game_exists%4#0 self.game tictactoe/tictactoe.py:64 + // virtual: load game_exists%4#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,game_exists%4#0 self.game tictactoe/tictactoe.py:64 + assert // check game exists // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0 self.game tictactoe/tictactoe.py:64 + frame_dig -1 // load move.1#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,move.1#0 self.game[row] tictactoe/tictactoe.py:64 + int 3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,move.1#0,3 self.game[row] tictactoe/tictactoe.py:64 + < // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,{<} self.game[row] tictactoe/tictactoe.py:64 + // virtual: store index_is_in_bounds%6#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,index_is_in_bounds%6#0 self.game[row] tictactoe/tictactoe.py:64 + // virtual: load index_is_in_bounds%6#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,index_is_in_bounds%6#0 self.game[row] tictactoe/tictactoe.py:64 + assert // Index access is out of bounds // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0 self.game[row] tictactoe/tictactoe.py:64 + frame_dig -1 // load move.1#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,move.1#0 self.game[row] tictactoe/tictactoe.py:64 + int 3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,move.1#0,3 self.game[row] tictactoe/tictactoe.py:64 + * // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,{*} self.game[row] tictactoe/tictactoe.py:64 + // virtual: store item_index%7#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,item_index%7#0 self.game[row] tictactoe/tictactoe.py:64 + // virtual: load game_value%3#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%3#0 self.game[row] tictactoe/tictactoe.py:64 + // virtual: load item_index%7#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%3#0,item_index%7#0 self.game[row] tictactoe/tictactoe.py:64 dup - cover 2 // store item_index%7#0 to l-stack (copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%3#0,item_index%7#0 self.game[row] tictactoe/tictactoe.py:62 - int 3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%3#0,item_index%7#0,3 self.game[row] tictactoe/tictactoe.py:62 - extract3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{extract3} self.game[row] tictactoe/tictactoe.py:62 - // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0 self.game[row] tictactoe/tictactoe.py:62 - frame_dig 0 // load tmp%0#0 from f-stack (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0,tmp%0#0 self.game[row][column] tictactoe/tictactoe.py:62 - assert // Index access is out of bounds // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0 self.game[row][column] tictactoe/tictactoe.py:62 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0 self.game[row][column] tictactoe/tictactoe.py:62 - frame_dig -2 // load move.0#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0,move.0#0 self.game[row][column] tictactoe/tictactoe.py:62 - int 1 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0,move.0#0,1 self.game[row][column] tictactoe/tictactoe.py:62 - extract3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{extract3} self.game[row][column] tictactoe/tictactoe.py:62 - // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%12#0 self.game[row][column] tictactoe/tictactoe.py:62 - // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%12#0 self.game[row][column] == EMPTY, "Square is already taken" tictactoe/tictactoe.py:62 - byte 0x00 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%12#0,0x00 EMPTY tictactoe/tictactoe.py:62 - b== // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{b==} self.game[row][column] == EMPTY, "Square is already taken" tictactoe/tictactoe.py:62 - // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%13#0 self.game[row][column] == EMPTY, "Square is already taken" tictactoe/tictactoe.py:62 - // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%13#0 assert self.game[row][column] == EMPTY, "Square is already taken" tictactoe/tictactoe.py:62 - assert // Square is already taken // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0 assert self.game[row][column] == EMPTY, "Square is already taken" tictactoe/tictactoe.py:62 - int 0 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,0 self.game tictactoe/tictactoe.py:63 - byte "game" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,0,"game" self.game tictactoe/tictactoe.py:63 - app_global_get_ex // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.game tictactoe/tictactoe.py:63 - // virtual: store game_exists%15#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_exists%15#0,{app_global_get_ex}.0 self.game tictactoe/tictactoe.py:63 - // virtual: store game_value%14#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0,game_exists%15#0 self.game tictactoe/tictactoe.py:63 - // virtual: load game_exists%15#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0,game_exists%15#0 self.game tictactoe/tictactoe.py:63 - assert // check game exists // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0 self.game tictactoe/tictactoe.py:63 - // virtual: load game_value%14#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0 self.game[row] tictactoe/tictactoe.py:63 - dig 1 // load item_index%7#0 from l-stack (copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0,item_index%7#0 self.game[row] tictactoe/tictactoe.py:63 - int 3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0,item_index%7#0,3 self.game[row] tictactoe/tictactoe.py:63 - extract3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{extract3} self.game[row] tictactoe/tictactoe.py:63 - // virtual: store tmp%19#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%19#0 self.game[row] tictactoe/tictactoe.py:63 - // virtual: load tmp%19#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%19#0 self.game[row][column] = player tictactoe/tictactoe.py:63 - frame_dig -2 // load move.0#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%19#0,move.0#0 self.game[row][column] = player tictactoe/tictactoe.py:63 - frame_dig -3 // load player#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%19#0,move.0#0,player#0 self.game[row][column] = player tictactoe/tictactoe.py:63 - replace3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{replace3} self.game[row][column] = player tictactoe/tictactoe.py:63 - // virtual: store updated_target%24#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0 self.game[row][column] = player tictactoe/tictactoe.py:63 - int 0 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,0 self.game tictactoe/tictactoe.py:63 - byte "game" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,0,"game" self.game tictactoe/tictactoe.py:63 - app_global_get_ex // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.game tictactoe/tictactoe.py:63 - // virtual: store game_exists%26#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,game_exists%26#0,{app_global_get_ex}.0 self.game tictactoe/tictactoe.py:63 - // virtual: store game_value%25#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,game_value%25#0,game_exists%26#0 self.game tictactoe/tictactoe.py:63 - // virtual: load game_exists%26#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,game_value%25#0,game_exists%26#0 self.game tictactoe/tictactoe.py:63 - assert // check game exists // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,game_value%25#0 self.game tictactoe/tictactoe.py:63 - // virtual: load game_value%25#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,game_value%25#0 self.game[row][column] = player tictactoe/tictactoe.py:63 - uncover 2 // load item_index%7#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | updated_target%24#0,game_value%25#0,item_index%7#0 self.game[row][column] = player tictactoe/tictactoe.py:63 - uncover 2 // load updated_target%24#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%25#0,item_index%7#0,updated_target%24#0 self.game[row][column] = player tictactoe/tictactoe.py:63 - replace3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {replace3} self.game[row][column] = player tictactoe/tictactoe.py:63 - // virtual: store updated_target%31#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | updated_target%31#0 self.game[row][column] = player tictactoe/tictactoe.py:63 - byte "game" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | updated_target%31#0,"game" self.game tictactoe/tictactoe.py:63 - swap // load updated_target%31#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "game",updated_target%31#0 self.game[row][column] = player tictactoe/tictactoe.py:63 - app_global_put // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | self.game[row][column] = player tictactoe/tictactoe.py:63 - int 0 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0 self.turns tictactoe/tictactoe.py:64 - byte "turns" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0,"turns" self.turns tictactoe/tictactoe.py:64 - app_global_get_ex // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.turns tictactoe/tictactoe.py:64 - // virtual: store turns_exists%33#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_exists%33#0,{app_global_get_ex}.0 self.turns tictactoe/tictactoe.py:64 - // virtual: store turns_value%32#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%32#0,turns_exists%33#0 self.turns tictactoe/tictactoe.py:64 - // virtual: load turns_exists%33#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%32#0,turns_exists%33#0 self.turns tictactoe/tictactoe.py:64 - assert // check turns exists // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%32#0 self.turns tictactoe/tictactoe.py:64 - // virtual: load turns_value%32#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%32#0 self.turns += 1 tictactoe/tictactoe.py:64 - int 1 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%32#0,1 1 tictactoe/tictactoe.py:64 - + // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {+} self.turns += 1 tictactoe/tictactoe.py:64 - // virtual: store new_state_value%34#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | new_state_value%34#0 self.turns += 1 tictactoe/tictactoe.py:64 - byte "turns" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | new_state_value%34#0,"turns" self.turns tictactoe/tictactoe.py:64 - swap // load new_state_value%34#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "turns",new_state_value%34#0 self.turns += 1 tictactoe/tictactoe.py:64 - app_global_put // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | self.turns += 1 tictactoe/tictactoe.py:64 - frame_dig -3 // load player#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | player#0 self.did_win(player, column=column, row=row) tictactoe/tictactoe.py:65 - frame_dig -2 // load move.0#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | player#0,move.0#0 self.did_win(player, column=column, row=row) tictactoe/tictactoe.py:65 - frame_dig -1 // load move.1#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | player#0,move.0#0,move.1#0 self.did_win(player, column=column, row=row) tictactoe/tictactoe.py:65 - callsub did_win // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {did_win} self.did_win(player, column=column, row=row) tictactoe/tictactoe.py:65 - // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%35#0 self.did_win(player, column=column, row=row) tictactoe/tictactoe.py:65 - // virtual: load tmp%35#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%35#0 if self.did_win(player, column=column, row=row): tictactoe/tictactoe.py:65 - bz make_move_else_body@6 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | if self.did_win(player, column=column, row=row): tictactoe/tictactoe.py:65 - // Implicit fall through to make_move_if_body@5 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | if self.did_win(player, column=column, row=row): tictactoe/tictactoe.py:65 + cover 2 // store item_index%7#0 to l-stack (copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%3#0,item_index%7#0 self.game[row] tictactoe/tictactoe.py:64 + int 3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%3#0,item_index%7#0,3 self.game[row] tictactoe/tictactoe.py:64 + extract3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{extract3} self.game[row] tictactoe/tictactoe.py:64 + // virtual: store tmp%8#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0 self.game[row] tictactoe/tictactoe.py:64 + frame_dig 0 // load tmp%0#0 from f-stack (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0,tmp%0#0 self.game[row][column] tictactoe/tictactoe.py:64 + assert // Index access is out of bounds // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0 self.game[row][column] tictactoe/tictactoe.py:64 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0 self.game[row][column] tictactoe/tictactoe.py:64 + frame_dig -2 // load move.0#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0,move.0#0 self.game[row][column] tictactoe/tictactoe.py:64 + int 1 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%8#0,move.0#0,1 self.game[row][column] tictactoe/tictactoe.py:64 + extract3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{extract3} self.game[row][column] tictactoe/tictactoe.py:64 + // virtual: store tmp%12#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%12#0 self.game[row][column] tictactoe/tictactoe.py:64 + // virtual: load tmp%12#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%12#0 self.game[row][column] == EMPTY, "Square is already taken" tictactoe/tictactoe.py:64 + byte 0x00 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%12#0,0x00 EMPTY tictactoe/tictactoe.py:64 + b== // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{b==} self.game[row][column] == EMPTY, "Square is already taken" tictactoe/tictactoe.py:64 + // virtual: store tmp%13#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%13#0 self.game[row][column] == EMPTY, "Square is already taken" tictactoe/tictactoe.py:64 + // virtual: load tmp%13#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%13#0 assert self.game[row][column] == EMPTY, "Square is already taken" tictactoe/tictactoe.py:64 + assert // Square is already taken // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0 assert self.game[row][column] == EMPTY, "Square is already taken" tictactoe/tictactoe.py:64 + int 0 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,0 self.game tictactoe/tictactoe.py:65 + byte "game" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,0,"game" self.game tictactoe/tictactoe.py:65 + app_global_get_ex // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.game tictactoe/tictactoe.py:65 + // virtual: store game_exists%15#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_exists%15#0,{app_global_get_ex}.0 self.game tictactoe/tictactoe.py:65 + // virtual: store game_value%14#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0,game_exists%15#0 self.game tictactoe/tictactoe.py:65 + // virtual: load game_exists%15#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0,game_exists%15#0 self.game tictactoe/tictactoe.py:65 + assert // check game exists // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0 self.game tictactoe/tictactoe.py:65 + // virtual: load game_value%14#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0 self.game[row] tictactoe/tictactoe.py:65 + dig 1 // load item_index%7#0 from l-stack (copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0,item_index%7#0 self.game[row] tictactoe/tictactoe.py:65 + int 3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,game_value%14#0,item_index%7#0,3 self.game[row] tictactoe/tictactoe.py:65 + extract3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{extract3} self.game[row] tictactoe/tictactoe.py:65 + // virtual: store tmp%19#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%19#0 self.game[row] tictactoe/tictactoe.py:65 + // virtual: load tmp%19#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%19#0 self.game[row][column] = player tictactoe/tictactoe.py:65 + frame_dig -2 // load move.0#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%19#0,move.0#0 self.game[row][column] = player tictactoe/tictactoe.py:65 + frame_dig -3 // load player#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,tmp%19#0,move.0#0,player#0 self.game[row][column] = player tictactoe/tictactoe.py:65 + replace3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,{replace3} self.game[row][column] = player tictactoe/tictactoe.py:65 + // virtual: store updated_target%24#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0 self.game[row][column] = player tictactoe/tictactoe.py:65 + int 0 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,0 self.game tictactoe/tictactoe.py:65 + byte "game" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,0,"game" self.game tictactoe/tictactoe.py:65 + app_global_get_ex // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.game tictactoe/tictactoe.py:65 + // virtual: store game_exists%26#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,game_exists%26#0,{app_global_get_ex}.0 self.game tictactoe/tictactoe.py:65 + // virtual: store game_value%25#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,game_value%25#0,game_exists%26#0 self.game tictactoe/tictactoe.py:65 + // virtual: load game_exists%26#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,game_value%25#0,game_exists%26#0 self.game tictactoe/tictactoe.py:65 + assert // check game exists // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,game_value%25#0 self.game tictactoe/tictactoe.py:65 + // virtual: load game_value%25#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | item_index%7#0,updated_target%24#0,game_value%25#0 self.game[row][column] = player tictactoe/tictactoe.py:65 + uncover 2 // load item_index%7#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | updated_target%24#0,game_value%25#0,item_index%7#0 self.game[row][column] = player tictactoe/tictactoe.py:65 + uncover 2 // load updated_target%24#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | game_value%25#0,item_index%7#0,updated_target%24#0 self.game[row][column] = player tictactoe/tictactoe.py:65 + replace3 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {replace3} self.game[row][column] = player tictactoe/tictactoe.py:65 + // virtual: store updated_target%31#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | updated_target%31#0 self.game[row][column] = player tictactoe/tictactoe.py:65 + byte "game" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | updated_target%31#0,"game" self.game tictactoe/tictactoe.py:65 + swap // load updated_target%31#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "game",updated_target%31#0 self.game[row][column] = player tictactoe/tictactoe.py:65 + app_global_put // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | self.game[row][column] = player tictactoe/tictactoe.py:65 + int 0 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0 self.turns tictactoe/tictactoe.py:66 + byte "turns" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0,"turns" self.turns tictactoe/tictactoe.py:66 + app_global_get_ex // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.turns tictactoe/tictactoe.py:66 + // virtual: store turns_exists%33#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_exists%33#0,{app_global_get_ex}.0 self.turns tictactoe/tictactoe.py:66 + // virtual: store turns_value%32#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%32#0,turns_exists%33#0 self.turns tictactoe/tictactoe.py:66 + // virtual: load turns_exists%33#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%32#0,turns_exists%33#0 self.turns tictactoe/tictactoe.py:66 + assert // check turns exists // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%32#0 self.turns tictactoe/tictactoe.py:66 + // virtual: load turns_value%32#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%32#0 self.turns += 1 tictactoe/tictactoe.py:66 + int 1 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%32#0,1 1 tictactoe/tictactoe.py:66 + + // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {+} self.turns += 1 tictactoe/tictactoe.py:66 + // virtual: store new_state_value%34#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | new_state_value%34#0 self.turns += 1 tictactoe/tictactoe.py:66 + byte "turns" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | new_state_value%34#0,"turns" self.turns tictactoe/tictactoe.py:66 + swap // load new_state_value%34#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "turns",new_state_value%34#0 self.turns += 1 tictactoe/tictactoe.py:66 + app_global_put // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | self.turns += 1 tictactoe/tictactoe.py:66 + frame_dig -3 // load player#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | player#0 self.did_win(player, column=column, row=row) tictactoe/tictactoe.py:67 + frame_dig -2 // load move.0#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | player#0,move.0#0 self.did_win(player, column=column, row=row) tictactoe/tictactoe.py:67 + frame_dig -1 // load move.1#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | player#0,move.0#0,move.1#0 self.did_win(player, column=column, row=row) tictactoe/tictactoe.py:67 + callsub did_win // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {did_win} self.did_win(player, column=column, row=row) tictactoe/tictactoe.py:67 + // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%35#0 self.did_win(player, column=column, row=row) tictactoe/tictactoe.py:67 + // virtual: load tmp%35#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%35#0 if self.did_win(player, column=column, row=row): tictactoe/tictactoe.py:67 + bz make_move_else_body@6 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | if self.did_win(player, column=column, row=row): tictactoe/tictactoe.py:67 + // Implicit fall through to make_move_if_body@5 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | if self.did_win(player, column=column, row=row): tictactoe/tictactoe.py:67 make_move_if_body@5: - byte "winner" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "winner" self.winner tictactoe/tictactoe.py:66 - frame_dig -3 // load player#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "winner",player#0 self.winner.value = player tictactoe/tictactoe.py:66 - app_global_put // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | self.winner.value = player tictactoe/tictactoe.py:66 + byte "winner" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "winner" self.winner tictactoe/tictactoe.py:68 + frame_dig -3 // load player#0 from parameters (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "winner",player#0 self.winner.value = player tictactoe/tictactoe.py:68 + app_global_put // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | self.winner.value = player tictactoe/tictactoe.py:68 b make_move_after_if_else@9 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | make_move_else_body@6: - int 0 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0 self.turns tictactoe/tictactoe.py:67 - byte "turns" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0,"turns" self.turns tictactoe/tictactoe.py:67 - app_global_get_ex // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.turns tictactoe/tictactoe.py:67 - // virtual: store turns_exists%37#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_exists%37#0,{app_global_get_ex}.0 self.turns tictactoe/tictactoe.py:67 - // virtual: store turns_value%36#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%36#0,turns_exists%37#0 self.turns tictactoe/tictactoe.py:67 - // virtual: load turns_exists%37#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%36#0,turns_exists%37#0 self.turns tictactoe/tictactoe.py:67 - assert // check turns exists // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%36#0 self.turns tictactoe/tictactoe.py:67 - // virtual: load turns_value%36#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%36#0 self.turns == 9: tictactoe/tictactoe.py:67 - int 9 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%36#0,9 9 tictactoe/tictactoe.py:67 - == // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {==} self.turns == 9: tictactoe/tictactoe.py:67 - // virtual: store tmp%38#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%38#0 self.turns == 9: tictactoe/tictactoe.py:67 - // virtual: load tmp%38#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%38#0 elif self.turns == 9: tictactoe/tictactoe.py:67 - bz make_move_after_if_else@9 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | elif self.turns == 9: tictactoe/tictactoe.py:67 - // Implicit fall through to make_move_if_body@7 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | elif self.turns == 9: tictactoe/tictactoe.py:67 + int 0 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0 self.turns tictactoe/tictactoe.py:69 + byte "turns" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | 0,"turns" self.turns tictactoe/tictactoe.py:69 + app_global_get_ex // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.turns tictactoe/tictactoe.py:69 + // virtual: store turns_exists%37#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_exists%37#0,{app_global_get_ex}.0 self.turns tictactoe/tictactoe.py:69 + // virtual: store turns_value%36#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%36#0,turns_exists%37#0 self.turns tictactoe/tictactoe.py:69 + // virtual: load turns_exists%37#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%36#0,turns_exists%37#0 self.turns tictactoe/tictactoe.py:69 + assert // check turns exists // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%36#0 self.turns tictactoe/tictactoe.py:69 + // virtual: load turns_value%36#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%36#0 self.turns == 9: tictactoe/tictactoe.py:69 + int 9 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | turns_value%36#0,9 9 tictactoe/tictactoe.py:69 + == // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | {==} self.turns == 9: tictactoe/tictactoe.py:69 + // virtual: store tmp%38#0 to l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%38#0 self.turns == 9: tictactoe/tictactoe.py:69 + // virtual: load tmp%38#0 from l-stack (no copy) (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | tmp%38#0 elif self.turns == 9: tictactoe/tictactoe.py:69 + bz make_move_after_if_else@9 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | elif self.turns == 9: tictactoe/tictactoe.py:69 + // Implicit fall through to make_move_if_body@7 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | elif self.turns == 9: tictactoe/tictactoe.py:69 make_move_if_body@7: - byte "winner" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "winner" self.winner tictactoe/tictactoe.py:68 - byte 0x03 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "winner",0x03 arc4.UInt8(DRAW) tictactoe/tictactoe.py:68 - app_global_put // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | self.winner.value = arc4.UInt8(DRAW) tictactoe/tictactoe.py:68 + byte "winner" // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "winner" self.winner tictactoe/tictactoe.py:70 + byte 0x03 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | "winner",0x03 arc4.UInt8(DRAW) tictactoe/tictactoe.py:70 + app_global_put // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | self.winner.value = arc4.UInt8(DRAW) tictactoe/tictactoe.py:70 // Implicit fall through to make_move_after_if_else@9 // (𝕡) player#0,move.0#0,move.1#0 | (𝕗) tmp%0#0 | make_move_after_if_else@9: @@ -453,205 +453,205 @@ make_move_after_if_else@9: // examples.tictactoe.tictactoe.TicTacToeContract.did_win(player: bytes, column: uint64, row: uint64) -> uint64: did_win: - proto 3 1 // (𝕡) player#0,column#0,row#0 | @subroutine\ndef did_win(self, player: arc4.UInt8, column: UInt64, row: UInt64) -> bool: tictactoe/tictactoe.py:70-71 + proto 3 1 // (𝕡) player#0,column#0,row#0 | @subroutine\ndef did_win(self, player: arc4.UInt8, column: UInt64, row: UInt64) -> bool: tictactoe/tictactoe.py:72-73 int 0 dupn 2 // allocate 3 to stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0 | did_win_block@0: - int 0 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0 | 0 self.game tictactoe/tictactoe.py:72 - byte "game" // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0 | 0,"game" self.game tictactoe/tictactoe.py:72 - app_global_get_ex // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.game tictactoe/tictactoe.py:72 - swap // store game_exists%1#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0 | game_exists%1#0,{app_global_get_ex}.0 self.game tictactoe/tictactoe.py:72 + int 0 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0 | 0 self.game tictactoe/tictactoe.py:74 + byte "game" // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0 | 0,"game" self.game tictactoe/tictactoe.py:74 + app_global_get_ex // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0 | {app_global_get_ex}.0,{app_global_get_ex}.1 self.game tictactoe/tictactoe.py:74 + swap // store game_exists%1#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0 | game_exists%1#0,{app_global_get_ex}.0 self.game tictactoe/tictactoe.py:74 dup - cover 2 // store g#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0 | g#0,game_exists%1#0,g#0 self.game tictactoe/tictactoe.py:72 - cover 2 // store g#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,game_exists%1#0 self.game tictactoe/tictactoe.py:72 - // virtual: load game_exists%1#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,game_exists%1#0 self.game tictactoe/tictactoe.py:72 - assert // check game exists // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0 self.game tictactoe/tictactoe.py:72 - frame_dig -1 // load row#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,row#0 g[row] tictactoe/tictactoe.py:74 - int 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,row#0,3 g[row] tictactoe/tictactoe.py:74 - < // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,{<} g[row] tictactoe/tictactoe.py:74 - // virtual: store index_is_in_bounds%4#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,index_is_in_bounds%4#0 g[row] tictactoe/tictactoe.py:74 - // virtual: load index_is_in_bounds%4#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,index_is_in_bounds%4#0 g[row] tictactoe/tictactoe.py:74 - assert // Index access is out of bounds // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0 g[row] tictactoe/tictactoe.py:74 - frame_dig -1 // load row#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,row#0 g[row] tictactoe/tictactoe.py:74 - int 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,row#0,3 g[row] tictactoe/tictactoe.py:74 - * // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,{*} g[row] tictactoe/tictactoe.py:74 - // virtual: store item_index%5#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,item_index%5#0 g[row] tictactoe/tictactoe.py:74 - // virtual: load g#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | item_index%5#0,g#0 g[row] tictactoe/tictactoe.py:74 - // virtual: load item_index%5#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,item_index%5#0 g[row] tictactoe/tictactoe.py:74 - int 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,item_index%5#0,3 g[row] tictactoe/tictactoe.py:74 - extract3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | {extract3} g[row] tictactoe/tictactoe.py:74 - dup // store tmp%6#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | tmp%6#0,tmp%6#0 g[row] tictactoe/tictactoe.py:74 - swap // store tmp%6#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%6#0 g[row] tictactoe/tictactoe.py:74 - dup // load tmp%6#0 from l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%6#0,tmp%6#0 g[row][0] tictactoe/tictactoe.py:74 - extract 0 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%6#0,{extract} g[row][0] tictactoe/tictactoe.py:74 - swap // store tmp%8#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%8#0,tmp%6#0 g[row][0] tictactoe/tictactoe.py:74 - // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%8#0,tmp%6#0 g[row][1] tictactoe/tictactoe.py:74 - extract 1 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%8#0,{extract} g[row][1] tictactoe/tictactoe.py:74 - dup // store awst_tmp%14#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%8#0,awst_tmp%14#0,awst_tmp%14#0 g[row][1] tictactoe/tictactoe.py:74 - cover 2 // store awst_tmp%14#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%8#0,awst_tmp%14#0 g[row][1] tictactoe/tictactoe.py:74 - // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | awst_tmp%14#0,tmp%8#0 g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - // virtual: load awst_tmp%14#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%8#0,awst_tmp%14#0 g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%15#0 g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%15#0 g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - bz did_win_after_if_else@3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - // Implicit fall through to did_win_and_contd@1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 + cover 2 // store g#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0 | g#0,game_exists%1#0,g#0 self.game tictactoe/tictactoe.py:74 + cover 2 // store g#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,game_exists%1#0 self.game tictactoe/tictactoe.py:74 + // virtual: load game_exists%1#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,game_exists%1#0 self.game tictactoe/tictactoe.py:74 + assert // check game exists // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0 self.game tictactoe/tictactoe.py:74 + frame_dig -1 // load row#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,row#0 g[row] tictactoe/tictactoe.py:76 + int 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,row#0,3 g[row] tictactoe/tictactoe.py:76 + < // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,{<} g[row] tictactoe/tictactoe.py:76 + // virtual: store index_is_in_bounds%4#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,index_is_in_bounds%4#0 g[row] tictactoe/tictactoe.py:76 + // virtual: load index_is_in_bounds%4#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,index_is_in_bounds%4#0 g[row] tictactoe/tictactoe.py:76 + assert // Index access is out of bounds // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0 g[row] tictactoe/tictactoe.py:76 + frame_dig -1 // load row#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,row#0 g[row] tictactoe/tictactoe.py:76 + int 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,row#0,3 g[row] tictactoe/tictactoe.py:76 + * // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,{*} g[row] tictactoe/tictactoe.py:76 + // virtual: store item_index%5#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,item_index%5#0 g[row] tictactoe/tictactoe.py:76 + // virtual: load g#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | item_index%5#0,g#0 g[row] tictactoe/tictactoe.py:76 + // virtual: load item_index%5#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,item_index%5#0 g[row] tictactoe/tictactoe.py:76 + int 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | g#0,item_index%5#0,3 g[row] tictactoe/tictactoe.py:76 + extract3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | {extract3} g[row] tictactoe/tictactoe.py:76 + dup // store tmp%6#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0 | tmp%6#0,tmp%6#0 g[row] tictactoe/tictactoe.py:76 + swap // store tmp%6#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%6#0 g[row] tictactoe/tictactoe.py:76 + dup // load tmp%6#0 from l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%6#0,tmp%6#0 g[row][0] tictactoe/tictactoe.py:76 + extract 0 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%6#0,{extract} g[row][0] tictactoe/tictactoe.py:76 + swap // store tmp%8#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%8#0,tmp%6#0 g[row][0] tictactoe/tictactoe.py:76 + // virtual: load tmp%6#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%8#0,tmp%6#0 g[row][1] tictactoe/tictactoe.py:76 + extract 1 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%8#0,{extract} g[row][1] tictactoe/tictactoe.py:76 + dup // store awst_tmp%14#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0 | tmp%8#0,awst_tmp%14#0,awst_tmp%14#0 g[row][1] tictactoe/tictactoe.py:76 + cover 2 // store awst_tmp%14#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%8#0,awst_tmp%14#0 g[row][1] tictactoe/tictactoe.py:76 + // virtual: load tmp%8#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | awst_tmp%14#0,tmp%8#0 g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + // virtual: load awst_tmp%14#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%8#0,awst_tmp%14#0 g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%15#0 g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%15#0 g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + bz did_win_after_if_else@3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + // Implicit fall through to did_win_and_contd@1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 did_win_and_contd@1: - frame_dig 4 // load tmp%6#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%6#0 g[row][2] tictactoe/tictactoe.py:74 - extract 2 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[row][2] tictactoe/tictactoe.py:74 - // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%21#0 g[row][2] tictactoe/tictactoe.py:74 - frame_dig 5 // load awst_tmp%14#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%21#0,awst_tmp%14#0 g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - swap // load tmp%21#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | awst_tmp%14#0,tmp%21#0 g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - // virtual: store tmp%22#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%22#0 g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - // virtual: load tmp%22#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%22#0 g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - bz did_win_after_if_else@3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 - // Implicit fall through to did_win_if_body@2 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:74 + frame_dig 4 // load tmp%6#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%6#0 g[row][2] tictactoe/tictactoe.py:76 + extract 2 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[row][2] tictactoe/tictactoe.py:76 + // virtual: store tmp%21#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%21#0 g[row][2] tictactoe/tictactoe.py:76 + frame_dig 5 // load awst_tmp%14#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%21#0,awst_tmp%14#0 g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + swap // load tmp%21#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | awst_tmp%14#0,tmp%21#0 g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + // virtual: store tmp%22#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%22#0 g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + // virtual: load tmp%22#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%22#0 g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + bz did_win_after_if_else@3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 + // Implicit fall through to did_win_if_body@2 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[row][0] == g[row][1] == g[row][2]: tictactoe/tictactoe.py:76 did_win_if_body@2: - int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | 1 True tictactoe/tictactoe.py:75 + int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | 1 True tictactoe/tictactoe.py:77 frame_bury 0 - retsub // 1 return True tictactoe/tictactoe.py:75 + retsub // 1 return True tictactoe/tictactoe.py:77 did_win_after_if_else@3: - frame_dig 3 // load g#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0 g[0] tictactoe/tictactoe.py:77 - dup // store g#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,g#0 g[0] tictactoe/tictactoe.py:77 - extract 0 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,{extract} g[0] tictactoe/tictactoe.py:77 - dup // store tmp%24#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,tmp%24#0 g[0] tictactoe/tictactoe.py:77 - frame_bury 1 // store tmp%24#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0 g[0] tictactoe/tictactoe.py:77 - frame_dig -2 // load column#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,column#0 g[0][column] tictactoe/tictactoe.py:77 - int 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,column#0,3 g[0][column] tictactoe/tictactoe.py:77 - < // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,{<} g[0][column] tictactoe/tictactoe.py:77 - // virtual: store index_is_in_bounds%26#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,index_is_in_bounds%26#0 g[0][column] tictactoe/tictactoe.py:77 - // virtual: load index_is_in_bounds%26#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,index_is_in_bounds%26#0 g[0][column] tictactoe/tictactoe.py:77 - assert // Index access is out of bounds // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0 g[0][column] tictactoe/tictactoe.py:77 - // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0 g[0][column] tictactoe/tictactoe.py:77 - frame_dig -2 // load column#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,column#0 g[0][column] tictactoe/tictactoe.py:77 - int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,column#0,1 g[0][column] tictactoe/tictactoe.py:77 - extract3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,{extract3} g[0][column] tictactoe/tictactoe.py:77 - // virtual: store tmp%28#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%28#0 g[0][column] tictactoe/tictactoe.py:77 - swap // load g#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,g#0 g[1] tictactoe/tictactoe.py:77 - extract 3 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,{extract} g[1] tictactoe/tictactoe.py:77 - dup // store tmp%30#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,tmp%30#0,tmp%30#0 g[1] tictactoe/tictactoe.py:77 - frame_bury 2 // store tmp%30#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,tmp%30#0 g[1] tictactoe/tictactoe.py:77 - // virtual: load tmp%30#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,tmp%30#0 g[1][column] tictactoe/tictactoe.py:77 - frame_dig -2 // load column#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,tmp%30#0,column#0 g[1][column] tictactoe/tictactoe.py:77 - int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,tmp%30#0,column#0,1 g[1][column] tictactoe/tictactoe.py:77 - extract3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,{extract3} g[1][column] tictactoe/tictactoe.py:77 - dup // store awst_tmp%34#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,awst_tmp%34#0,awst_tmp%34#0 g[1][column] tictactoe/tictactoe.py:77 - frame_bury 0 // store awst_tmp%34#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,awst_tmp%34#0 g[1][column] tictactoe/tictactoe.py:77 - // virtual: load tmp%28#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | awst_tmp%34#0,tmp%28#0 g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - // virtual: load awst_tmp%34#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,awst_tmp%34#0 g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%35#0 g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - // virtual: load tmp%35#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%35#0 g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - bz did_win_after_if_else@6 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - // Implicit fall through to did_win_and_contd@4 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 + frame_dig 3 // load g#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0 g[0] tictactoe/tictactoe.py:79 + dup // store g#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,g#0 g[0] tictactoe/tictactoe.py:79 + extract 0 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,{extract} g[0] tictactoe/tictactoe.py:79 + dup // store tmp%24#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,tmp%24#0 g[0] tictactoe/tictactoe.py:79 + frame_bury 1 // store tmp%24#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0 g[0] tictactoe/tictactoe.py:79 + frame_dig -2 // load column#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,column#0 g[0][column] tictactoe/tictactoe.py:79 + int 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,column#0,3 g[0][column] tictactoe/tictactoe.py:79 + < // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,{<} g[0][column] tictactoe/tictactoe.py:79 + // virtual: store index_is_in_bounds%26#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,index_is_in_bounds%26#0 g[0][column] tictactoe/tictactoe.py:79 + // virtual: load index_is_in_bounds%26#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,index_is_in_bounds%26#0 g[0][column] tictactoe/tictactoe.py:79 + assert // Index access is out of bounds // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0 g[0][column] tictactoe/tictactoe.py:79 + // virtual: load tmp%24#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0 g[0][column] tictactoe/tictactoe.py:79 + frame_dig -2 // load column#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,column#0 g[0][column] tictactoe/tictactoe.py:79 + int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%24#0,column#0,1 g[0][column] tictactoe/tictactoe.py:79 + extract3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,{extract3} g[0][column] tictactoe/tictactoe.py:79 + // virtual: store tmp%28#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0,tmp%28#0 g[0][column] tictactoe/tictactoe.py:79 + swap // load g#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,g#0 g[1] tictactoe/tictactoe.py:79 + extract 3 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,{extract} g[1] tictactoe/tictactoe.py:79 + dup // store tmp%30#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,tmp%30#0,tmp%30#0 g[1] tictactoe/tictactoe.py:79 + frame_bury 2 // store tmp%30#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,tmp%30#0 g[1] tictactoe/tictactoe.py:79 + // virtual: load tmp%30#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,tmp%30#0 g[1][column] tictactoe/tictactoe.py:79 + frame_dig -2 // load column#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,tmp%30#0,column#0 g[1][column] tictactoe/tictactoe.py:79 + int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,tmp%30#0,column#0,1 g[1][column] tictactoe/tictactoe.py:79 + extract3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,{extract3} g[1][column] tictactoe/tictactoe.py:79 + dup // store awst_tmp%34#0 to l-stack (copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,awst_tmp%34#0,awst_tmp%34#0 g[1][column] tictactoe/tictactoe.py:79 + frame_bury 0 // store awst_tmp%34#0 to f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,awst_tmp%34#0 g[1][column] tictactoe/tictactoe.py:79 + // virtual: load tmp%28#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | awst_tmp%34#0,tmp%28#0 g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + // virtual: load awst_tmp%34#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%28#0,awst_tmp%34#0 g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + // virtual: store tmp%35#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%35#0 g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + // virtual: load tmp%35#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%35#0 g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + bz did_win_after_if_else@6 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + // Implicit fall through to did_win_and_contd@4 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 did_win_and_contd@4: - frame_dig 3 // load g#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0 g[2] tictactoe/tictactoe.py:77 - extract 6 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[2] tictactoe/tictactoe.py:77 - // virtual: store tmp%37#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%37#0 g[2] tictactoe/tictactoe.py:77 - // virtual: load tmp%37#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%37#0 g[2][column] tictactoe/tictactoe.py:77 - frame_dig -2 // load column#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%37#0,column#0 g[2][column] tictactoe/tictactoe.py:77 - int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%37#0,column#0,1 g[2][column] tictactoe/tictactoe.py:77 - extract3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract3} g[2][column] tictactoe/tictactoe.py:77 - // virtual: store tmp%41#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%41#0 g[2][column] tictactoe/tictactoe.py:77 - frame_dig 0 // load awst_tmp%34#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%41#0,awst_tmp%34#0 g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - swap // load tmp%41#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | awst_tmp%34#0,tmp%41#0 g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - // virtual: store tmp%42#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%42#0 g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - // virtual: load tmp%42#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%42#0 g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - bz did_win_after_if_else@6 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 - // Implicit fall through to did_win_if_body@5 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:77 + frame_dig 3 // load g#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0 g[2] tictactoe/tictactoe.py:79 + extract 6 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[2] tictactoe/tictactoe.py:79 + // virtual: store tmp%37#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%37#0 g[2] tictactoe/tictactoe.py:79 + // virtual: load tmp%37#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%37#0 g[2][column] tictactoe/tictactoe.py:79 + frame_dig -2 // load column#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%37#0,column#0 g[2][column] tictactoe/tictactoe.py:79 + int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%37#0,column#0,1 g[2][column] tictactoe/tictactoe.py:79 + extract3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract3} g[2][column] tictactoe/tictactoe.py:79 + // virtual: store tmp%41#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%41#0 g[2][column] tictactoe/tictactoe.py:79 + frame_dig 0 // load awst_tmp%34#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%41#0,awst_tmp%34#0 g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + swap // load tmp%41#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | awst_tmp%34#0,tmp%41#0 g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + // virtual: store tmp%42#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%42#0 g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + // virtual: load tmp%42#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%42#0 g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + bz did_win_after_if_else@6 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 + // Implicit fall through to did_win_if_body@5 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][column] == g[1][column] == g[2][column]: tictactoe/tictactoe.py:79 did_win_if_body@5: - int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | 1 True tictactoe/tictactoe.py:78 + int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | 1 True tictactoe/tictactoe.py:80 frame_bury 0 - retsub // 1 return True tictactoe/tictactoe.py:78 + retsub // 1 return True tictactoe/tictactoe.py:80 did_win_after_if_else@6: - frame_dig 2 // load tmp%30#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%30#0 wns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:80-81 - extract 1 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} wns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:80-81 - // virtual: store tmp%46#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%46#0 wns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:80-81 - frame_dig -3 // load player#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%46#0,player#0 f player owns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:80-81 - swap // load tmp%46#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | player#0,tmp%46#0 f player owns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:80-81 - b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} f player owns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:80-81 - // virtual: store tmp%47#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%47#0 f player owns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:80-81 - // virtual: load tmp%47#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%47#0 # if player owns center, check diagonals\nif player == g[1][1]: tictactoe/tictactoe.py:80-81 - bz did_win_after_if_else@14 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | # if player owns center, check diagonals\nif player == g[1][1]: tictactoe/tictactoe.py:80-81 - // Implicit fall through to did_win_if_body@7 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | # if player owns center, check diagonals\nif player == g[1][1]: tictactoe/tictactoe.py:80-81 + frame_dig 2 // load tmp%30#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%30#0 wns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:82-83 + extract 1 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} wns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:82-83 + // virtual: store tmp%46#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%46#0 wns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:82-83 + frame_dig -3 // load player#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%46#0,player#0 f player owns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:82-83 + swap // load tmp%46#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | player#0,tmp%46#0 f player owns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:82-83 + b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} f player owns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:82-83 + // virtual: store tmp%47#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%47#0 f player owns center, check diagonals\nif player == g[1][1] tictactoe/tictactoe.py:82-83 + // virtual: load tmp%47#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%47#0 # if player owns center, check diagonals\nif player == g[1][1]: tictactoe/tictactoe.py:82-83 + bz did_win_after_if_else@14 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | # if player owns center, check diagonals\nif player == g[1][1]: tictactoe/tictactoe.py:82-83 + // Implicit fall through to did_win_if_body@7 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | # if player owns center, check diagonals\nif player == g[1][1]: tictactoe/tictactoe.py:82-83 did_win_if_body@7: - frame_dig 1 // load tmp%24#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%24#0 g[0][0] tictactoe/tictactoe.py:82 - extract 0 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[0][0] tictactoe/tictactoe.py:82 - // virtual: store tmp%51#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%51#0 g[0][0] tictactoe/tictactoe.py:82 - // virtual: load tmp%51#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%51#0 g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:82 - frame_dig -3 // load player#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%51#0,player#0 g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:82 - b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:82 - // virtual: store tmp%52#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%52#0 g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:82 - // virtual: load tmp%52#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%52#0 g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:82 - bz did_win_after_if_else@10 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:82 - // Implicit fall through to did_win_and_contd@8 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:82 + frame_dig 1 // load tmp%24#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%24#0 g[0][0] tictactoe/tictactoe.py:84 + extract 0 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[0][0] tictactoe/tictactoe.py:84 + // virtual: store tmp%51#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%51#0 g[0][0] tictactoe/tictactoe.py:84 + // virtual: load tmp%51#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%51#0 g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:84 + frame_dig -3 // load player#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%51#0,player#0 g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:84 + b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:84 + // virtual: store tmp%52#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%52#0 g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:84 + // virtual: load tmp%52#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%52#0 g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:84 + bz did_win_after_if_else@10 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:84 + // Implicit fall through to did_win_and_contd@8 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:84 did_win_and_contd@8: - frame_dig 3 // load g#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0 g[2] tictactoe/tictactoe.py:82 - extract 6 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[2] tictactoe/tictactoe.py:82 - // virtual: store tmp%54#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%54#0 g[2] tictactoe/tictactoe.py:82 - // virtual: load tmp%54#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%54#0 g[2][2] tictactoe/tictactoe.py:82 - extract 2 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[2][2] tictactoe/tictactoe.py:82 - // virtual: store tmp%56#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%56#0 g[2][2] tictactoe/tictactoe.py:82 - frame_dig -3 // load player#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%56#0,player#0 player == g[2][2]: tictactoe/tictactoe.py:82 - swap // load tmp%56#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | player#0,tmp%56#0 player == g[2][2]: tictactoe/tictactoe.py:82 - b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} player == g[2][2]: tictactoe/tictactoe.py:82 - // virtual: store tmp%57#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%57#0 player == g[2][2]: tictactoe/tictactoe.py:82 - // virtual: load tmp%57#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%57#0 g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:82 - bz did_win_after_if_else@10 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:82 - // Implicit fall through to did_win_if_body@9 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:82 + frame_dig 3 // load g#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0 g[2] tictactoe/tictactoe.py:84 + extract 6 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[2] tictactoe/tictactoe.py:84 + // virtual: store tmp%54#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%54#0 g[2] tictactoe/tictactoe.py:84 + // virtual: load tmp%54#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%54#0 g[2][2] tictactoe/tictactoe.py:84 + extract 2 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[2][2] tictactoe/tictactoe.py:84 + // virtual: store tmp%56#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%56#0 g[2][2] tictactoe/tictactoe.py:84 + frame_dig -3 // load player#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%56#0,player#0 player == g[2][2]: tictactoe/tictactoe.py:84 + swap // load tmp%56#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | player#0,tmp%56#0 player == g[2][2]: tictactoe/tictactoe.py:84 + b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} player == g[2][2]: tictactoe/tictactoe.py:84 + // virtual: store tmp%57#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%57#0 player == g[2][2]: tictactoe/tictactoe.py:84 + // virtual: load tmp%57#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%57#0 g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:84 + bz did_win_after_if_else@10 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:84 + // Implicit fall through to did_win_if_body@9 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][0] == player == g[2][2]: tictactoe/tictactoe.py:84 did_win_if_body@9: - int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | 1 True tictactoe/tictactoe.py:83 + int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | 1 True tictactoe/tictactoe.py:85 frame_bury 0 - retsub // 1 return True tictactoe/tictactoe.py:83 + retsub // 1 return True tictactoe/tictactoe.py:85 did_win_after_if_else@10: - frame_dig 1 // load tmp%24#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%24#0 g[0][2] tictactoe/tictactoe.py:84 - extract 2 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[0][2] tictactoe/tictactoe.py:84 - // virtual: store tmp%61#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%61#0 g[0][2] tictactoe/tictactoe.py:84 - // virtual: load tmp%61#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%61#0 g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:84 - frame_dig -3 // load player#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%61#0,player#0 g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:84 - b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:84 - // virtual: store tmp%62#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%62#0 g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:84 - // virtual: load tmp%62#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%62#0 g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:84 - bz did_win_after_if_else@14 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:84 - // Implicit fall through to did_win_and_contd@11 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:84 + frame_dig 1 // load tmp%24#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%24#0 g[0][2] tictactoe/tictactoe.py:86 + extract 2 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[0][2] tictactoe/tictactoe.py:86 + // virtual: store tmp%61#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%61#0 g[0][2] tictactoe/tictactoe.py:86 + // virtual: load tmp%61#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%61#0 g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:86 + frame_dig -3 // load player#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%61#0,player#0 g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:86 + b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:86 + // virtual: store tmp%62#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%62#0 g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:86 + // virtual: load tmp%62#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%62#0 g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:86 + bz did_win_after_if_else@14 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:86 + // Implicit fall through to did_win_and_contd@11 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:86 did_win_and_contd@11: - frame_dig 3 // load g#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0 g[2] tictactoe/tictactoe.py:84 - extract 6 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[2] tictactoe/tictactoe.py:84 - // virtual: store tmp%64#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%64#0 g[2] tictactoe/tictactoe.py:84 - // virtual: load tmp%64#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%64#0 g[2][0] tictactoe/tictactoe.py:84 - extract 0 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[2][0] tictactoe/tictactoe.py:84 - // virtual: store tmp%66#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%66#0 g[2][0] tictactoe/tictactoe.py:84 - frame_dig -3 // load player#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%66#0,player#0 player == g[2][0]: tictactoe/tictactoe.py:84 - swap // load tmp%66#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | player#0,tmp%66#0 player == g[2][0]: tictactoe/tictactoe.py:84 - b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} player == g[2][0]: tictactoe/tictactoe.py:84 - // virtual: store tmp%67#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%67#0 player == g[2][0]: tictactoe/tictactoe.py:84 - // virtual: load tmp%67#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%67#0 g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:84 - bz did_win_after_if_else@14 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:84 - // Implicit fall through to did_win_if_body@12 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:84 + frame_dig 3 // load g#0 from f-stack (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g#0 g[2] tictactoe/tictactoe.py:86 + extract 6 3 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[2] tictactoe/tictactoe.py:86 + // virtual: store tmp%64#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%64#0 g[2] tictactoe/tictactoe.py:86 + // virtual: load tmp%64#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%64#0 g[2][0] tictactoe/tictactoe.py:86 + extract 0 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {extract} g[2][0] tictactoe/tictactoe.py:86 + // virtual: store tmp%66#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%66#0 g[2][0] tictactoe/tictactoe.py:86 + frame_dig -3 // load player#0 from parameters (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%66#0,player#0 player == g[2][0]: tictactoe/tictactoe.py:86 + swap // load tmp%66#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | player#0,tmp%66#0 player == g[2][0]: tictactoe/tictactoe.py:86 + b== // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | {b==} player == g[2][0]: tictactoe/tictactoe.py:86 + // virtual: store tmp%67#0 to l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%67#0 player == g[2][0]: tictactoe/tictactoe.py:86 + // virtual: load tmp%67#0 from l-stack (no copy) (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | tmp%67#0 g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:86 + bz did_win_after_if_else@14 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:86 + // Implicit fall through to did_win_if_body@12 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | g[0][2] == player == g[2][0]: tictactoe/tictactoe.py:86 did_win_if_body@12: - int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | 1 True tictactoe/tictactoe.py:85 + int 1 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | 1 True tictactoe/tictactoe.py:87 frame_bury 0 - retsub // 1 return True tictactoe/tictactoe.py:85 + retsub // 1 return True tictactoe/tictactoe.py:87 did_win_after_if_else@14: - int 0 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | 0 False tictactoe/tictactoe.py:86 + int 0 // (𝕡) player#0,column#0,row#0 | (𝕗) awst_tmp%34#0,tmp%24#0,tmp%30#0,g#0,tmp%6#0,awst_tmp%14#0 | 0 False tictactoe/tictactoe.py:88 frame_bury 0 - retsub // 0 return False tictactoe/tictactoe.py:86 + retsub // 0 return False tictactoe/tictactoe.py:88 // examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() -> bytes: @@ -742,32 +742,32 @@ play_if_body@1: play_else_body@2: txn Sender // (𝕡) move.0#0,move.1#0 | {txn} Txn.sender tictactoe/tictactoe.py:54 // virtual: store tmp%10#0 to l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0 Txn.sender tictactoe/tictactoe.py:54 - global ZeroAddress // (𝕡) move.0#0,move.1#0 | tmp%10#0,{global} Account() tictactoe/tictactoe.py:54 - // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0 Account() tictactoe/tictactoe.py:54 + global ZeroAddress // (𝕡) move.0#0,move.1#0 | tmp%10#0,{global} Account() tictactoe/tictactoe.py:55 + // virtual: store tmp%11#0 to l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0 Account() tictactoe/tictactoe.py:55 int 0 // (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0,0 self.challenger tictactoe/tictactoe.py:54 byte "challenger" // (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0,0,"challenger" self.challenger tictactoe/tictactoe.py:54 - app_global_get_ex // (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.challenger.get(Account()) tictactoe/tictactoe.py:54 - swap // store challenger_get_ex%13#0 to l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0,challenger_get_ex%13#0,{app_global_get_ex}.0 self.challenger.get(Account()) tictactoe/tictactoe.py:54 - // virtual: store challenger_get_ex%12#0 to l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0,challenger_get_ex%13#0,challenger_get_ex%12#0 self.challenger.get(Account()) tictactoe/tictactoe.py:54 - uncover 2 // load tmp%11#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,challenger_get_ex%13#0,challenger_get_ex%12#0,tmp%11#0 self.challenger.get(Account()) tictactoe/tictactoe.py:54 - swap // load challenger_get_ex%12#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,challenger_get_ex%13#0,tmp%11#0,challenger_get_ex%12#0 self.challenger.get(Account()) tictactoe/tictactoe.py:54 - uncover 2 // load challenger_get_ex%13#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0,challenger_get_ex%12#0,challenger_get_ex%13#0 self.challenger.get(Account()) tictactoe/tictactoe.py:54 - select // (𝕡) move.0#0,move.1#0 | tmp%10#0,{select} self.challenger.get(Account()) tictactoe/tictactoe.py:54 - // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%14#0 self.challenger.get(Account()) tictactoe/tictactoe.py:54 - // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%14#0,tmp%10#0 Txn.sender == self.challenger.get(Account()), "It is the challenger's turn" tictactoe/tictactoe.py:54 - // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%14#0 Txn.sender == self.challenger.get(Account()), "It is the challenger's turn" tictactoe/tictactoe.py:54 - == // (𝕡) move.0#0,move.1#0 | {==} Txn.sender == self.challenger.get(Account()), "It is the challenger's turn" tictactoe/tictactoe.py:54 - // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%15#0 Txn.sender == self.challenger.get(Account()), "It is the challenger's turn" tictactoe/tictactoe.py:54 - // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%15#0 assert Txn.sender == self.challenger.get(Account()), "It is the challenger's turn" tictactoe/tictactoe.py:54 - assert // It is the challenger's turn // (𝕡) move.0#0,move.1#0 | assert Txn.sender == self.challenger.get(Account()), "It is the challenger's turn" tictactoe/tictactoe.py:54 - byte 0x02 // (𝕡) move.0#0,move.1#0 | 0x02 arc4.UInt8(CHALLENGER) tictactoe/tictactoe.py:55 - // virtual: store player#0 to x-stack (no copy) (𝕡) move.0#0,move.1#0 | (𝕏) player#0 | player = arc4.UInt8(CHALLENGER) tictactoe/tictactoe.py:55 + app_global_get_ex // (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0,{app_global_get_ex}.0,{app_global_get_ex}.1 self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + swap // store challenger_get_ex%13#0 to l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0,challenger_get_ex%13#0,{app_global_get_ex}.0 self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + // virtual: store challenger_get_ex%12#0 to l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0,challenger_get_ex%13#0,challenger_get_ex%12#0 self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + uncover 2 // load tmp%11#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,challenger_get_ex%13#0,challenger_get_ex%12#0,tmp%11#0 self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + swap // load challenger_get_ex%12#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,challenger_get_ex%13#0,tmp%11#0,challenger_get_ex%12#0 self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + uncover 2 // load challenger_get_ex%13#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%11#0,challenger_get_ex%12#0,challenger_get_ex%13#0 self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + select // (𝕡) move.0#0,move.1#0 | tmp%10#0,{select} self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + // virtual: store tmp%14#0 to l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%14#0 self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + // virtual: load tmp%10#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%14#0,tmp%10#0 Txn.sender == self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + // virtual: load tmp%14#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%10#0,tmp%14#0 Txn.sender == self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + == // (𝕡) move.0#0,move.1#0 | {==} Txn.sender == self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + // virtual: store tmp%15#0 to l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%15#0 Txn.sender == self.challenger.get(\ndefault=Account()\n) tictactoe/tictactoe.py:54-56 + // virtual: load tmp%15#0 from l-stack (no copy) (𝕡) move.0#0,move.1#0 | tmp%15#0 assert Txn.sender == self.challenger.get(\ndefault=Account()\n), "It is the challenger's turn" tictactoe/tictactoe.py:54-56 + assert // It is the challenger's turn // (𝕡) move.0#0,move.1#0 | assert Txn.sender == self.challenger.get(\ndefault=Account()\n), "It is the challenger's turn" tictactoe/tictactoe.py:54-56 + byte 0x02 // (𝕡) move.0#0,move.1#0 | 0x02 arc4.UInt8(CHALLENGER) tictactoe/tictactoe.py:57 + // virtual: store player#0 to x-stack (no copy) (𝕡) move.0#0,move.1#0 | (𝕏) player#0 | player = arc4.UInt8(CHALLENGER) tictactoe/tictactoe.py:57 // Implicit fall through to play_after_if_else@3 // (𝕡) move.0#0,move.1#0 | (𝕏) player#0 | player#0 play_after_if_else@3: - // virtual: load player#0 from x-stack (𝕡) move.0#0,move.1#0 | player#0 player#0 self.make_move(player, move) tictactoe/tictactoe.py:56 - frame_dig -2 // load move.0#0 from parameters (𝕡) move.0#0,move.1#0 | player#0,move.0#0 self.make_move(player, move) tictactoe/tictactoe.py:56 - frame_dig -1 // load move.1#0 from parameters (𝕡) move.0#0,move.1#0 | player#0,move.0#0,move.1#0 self.make_move(player, move) tictactoe/tictactoe.py:56 - callsub make_move // (𝕡) move.0#0,move.1#0 | self.make_move(player, move) tictactoe/tictactoe.py:56 + // virtual: load player#0 from x-stack (𝕡) move.0#0,move.1#0 | player#0 player#0 self.make_move(player, move) tictactoe/tictactoe.py:58 + frame_dig -2 // load move.0#0 from parameters (𝕡) move.0#0,move.1#0 | player#0,move.0#0 self.make_move(player, move) tictactoe/tictactoe.py:58 + frame_dig -1 // load move.1#0 from parameters (𝕡) move.0#0,move.1#0 | player#0,move.0#0,move.1#0 self.make_move(player, move) tictactoe/tictactoe.py:58 + callsub make_move // (𝕡) move.0#0,move.1#0 | self.make_move(player, move) tictactoe/tictactoe.py:58 retsub // diff --git a/examples/tictactoe/out/TicTacToeContract.approval.teal b/examples/tictactoe/out/TicTacToeContract.approval.teal index fb70d2f812..3eabfef590 100644 --- a/examples/tictactoe/out/TicTacToeContract.approval.teal +++ b/examples/tictactoe/out/TicTacToeContract.approval.teal @@ -244,11 +244,11 @@ join_game: // examples.tictactoe.tictactoe.TicTacToeContract.make_move(player: bytes, move.0: uint64, move.1: uint64) -> void: make_move: - // tictactoe/tictactoe.py:58-59 + // tictactoe/tictactoe.py:60-61 // @subroutine // def make_move(self, player: arc4.UInt8, move: Move) -> None: proto 3 0 - // tictactoe/tictactoe.py:61 + // tictactoe/tictactoe.py:63 // assert column < 3 and row < 3, "Move must be in range" frame_dig -2 int 3 @@ -266,10 +266,10 @@ make_move_bool_false@3: int 0 make_move_bool_merge@4: - // tictactoe/tictactoe.py:61 + // tictactoe/tictactoe.py:63 // assert column < 3 and row < 3, "Move must be in range" assert // Move must be in range - // tictactoe/tictactoe.py:62 + // tictactoe/tictactoe.py:64 // assert self.game[row][column] == EMPTY, "Square is already taken" int 0 byte "game" @@ -294,7 +294,7 @@ make_move_bool_merge@4: byte 0x00 b== assert // Square is already taken - // tictactoe/tictactoe.py:63 + // tictactoe/tictactoe.py:65 // self.game[row][column] = player int 0 byte "game" @@ -315,7 +315,7 @@ make_move_bool_merge@4: byte "game" swap app_global_put - // tictactoe/tictactoe.py:64 + // tictactoe/tictactoe.py:66 // self.turns += 1 int 0 byte "turns" @@ -326,14 +326,14 @@ make_move_bool_merge@4: byte "turns" swap app_global_put - // tictactoe/tictactoe.py:65 + // tictactoe/tictactoe.py:67 // if self.did_win(player, column=column, row=row): frame_dig -3 frame_dig -2 frame_dig -1 callsub did_win bz make_move_else_body@6 - // tictactoe/tictactoe.py:66 + // tictactoe/tictactoe.py:68 // self.winner.value = player byte "winner" frame_dig -3 @@ -341,7 +341,7 @@ make_move_bool_merge@4: b make_move_after_if_else@9 make_move_else_body@6: - // tictactoe/tictactoe.py:67 + // tictactoe/tictactoe.py:69 // elif self.turns == 9: int 0 byte "turns" @@ -350,7 +350,7 @@ make_move_else_body@6: int 9 == bz make_move_after_if_else@9 - // tictactoe/tictactoe.py:68 + // tictactoe/tictactoe.py:70 // self.winner.value = arc4.UInt8(DRAW) byte "winner" byte 0x03 @@ -362,12 +362,12 @@ make_move_after_if_else@9: // examples.tictactoe.tictactoe.TicTacToeContract.did_win(player: bytes, column: uint64, row: uint64) -> uint64: did_win: - // tictactoe/tictactoe.py:70-71 + // tictactoe/tictactoe.py:72-73 // @subroutine // def did_win(self, player: arc4.UInt8, column: UInt64, row: UInt64) -> bool: proto 3 1 int 0 - // tictactoe/tictactoe.py:72 + // tictactoe/tictactoe.py:74 // g = self.game.copy() dupn 3 byte "game" @@ -376,7 +376,7 @@ did_win: dup uncover 2 assert // check game exists - // tictactoe/tictactoe.py:74 + // tictactoe/tictactoe.py:76 // if g[row][0] == g[row][1] == g[row][2]: frame_dig -1 int 3 @@ -400,14 +400,14 @@ did_win: frame_dig 5 b== bz did_win_after_if_else@3 - // tictactoe/tictactoe.py:75 + // tictactoe/tictactoe.py:77 // return True int 1 frame_bury 0 retsub did_win_after_if_else@3: - // tictactoe/tictactoe.py:77 + // tictactoe/tictactoe.py:79 // if g[0][column] == g[1][column] == g[2][column]: frame_dig 3 dup @@ -440,14 +440,14 @@ did_win_after_if_else@3: frame_dig 0 b== bz did_win_after_if_else@6 - // tictactoe/tictactoe.py:78 + // tictactoe/tictactoe.py:80 // return True int 1 frame_bury 0 retsub did_win_after_if_else@6: - // tictactoe/tictactoe.py:80-81 + // tictactoe/tictactoe.py:82-83 // # if player owns center, check diagonals // if player == g[1][1]: frame_dig 2 @@ -455,7 +455,7 @@ did_win_after_if_else@6: frame_dig -3 b== bz did_win_after_if_else@14 - // tictactoe/tictactoe.py:82 + // tictactoe/tictactoe.py:84 // if g[0][0] == player == g[2][2]: frame_dig 1 extract 0 1 @@ -468,14 +468,14 @@ did_win_after_if_else@6: frame_dig -3 b== bz did_win_after_if_else@10 - // tictactoe/tictactoe.py:83 + // tictactoe/tictactoe.py:85 // return True int 1 frame_bury 0 retsub did_win_after_if_else@10: - // tictactoe/tictactoe.py:84 + // tictactoe/tictactoe.py:86 // if g[0][2] == player == g[2][0]: frame_dig 1 extract 2 1 @@ -488,14 +488,14 @@ did_win_after_if_else@10: frame_dig -3 b== bz did_win_after_if_else@14 - // tictactoe/tictactoe.py:85 + // tictactoe/tictactoe.py:87 // return True int 1 frame_bury 0 retsub did_win_after_if_else@14: - // tictactoe/tictactoe.py:86 + // tictactoe/tictactoe.py:88 // return False int 0 frame_bury 0 @@ -570,21 +570,29 @@ play: play_else_body@2: // tictactoe/tictactoe.py:54 - // assert Txn.sender == self.challenger.get(Account()), "It is the challenger's turn" + // assert Txn.sender == self.challenger.get( txn Sender + // tictactoe/tictactoe.py:55 + // default=Account() global ZeroAddress + // tictactoe/tictactoe.py:54 + // assert Txn.sender == self.challenger.get( int 0 byte "challenger" + // tictactoe/tictactoe.py:54-56 + // assert Txn.sender == self.challenger.get( + // default=Account() + // ), "It is the challenger's turn" app_global_get_ex select == assert // It is the challenger's turn - // tictactoe/tictactoe.py:55 + // tictactoe/tictactoe.py:57 // player = arc4.UInt8(CHALLENGER) byte 0x02 play_after_if_else@3: - // tictactoe/tictactoe.py:56 + // tictactoe/tictactoe.py:58 // self.make_move(player, move) frame_dig -2 frame_dig -1 diff --git a/examples/tictactoe/out/TicTacToeContract.arc32.json b/examples/tictactoe/out/TicTacToeContract.arc32.json index c607da0c1d..b9d7c1cd13 100644 --- a/examples/tictactoe/out/TicTacToeContract.arc32.json +++ b/examples/tictactoe/out/TicTacToeContract.arc32.json @@ -22,7 +22,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBtZXRob2QgIm5ld19nYW1lKCh1aW50NjQsdWludDY0KSl2b2lkIgogICAgbWV0aG9kICJqb2luX2dhbWUoKHVpbnQ2NCx1aW50NjQpKXZvaWQiCiAgICBtZXRob2QgIndob3NlX3R1cm4oKXVpbnQ4IgogICAgbWV0aG9kICJwbGF5KCh1aW50NjQsdWludDY0KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9uZXdfZ2FtZV9yb3V0ZUAxIG1haW5fam9pbl9nYW1lX3JvdXRlQDIgbWFpbl93aG9zZV90dXJuX3JvdXRlQDMgbWFpbl9wbGF5X3JvdXRlQDQKICAgIGVyciAvLyByZWplY3QgdHJhbnNhY3Rpb24KCm1haW5fbmV3X2dhbWVfcm91dGVAMToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9ImFsbG93IikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIHN3YXAKICAgIGJ0b2kKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9ImFsbG93IikKICAgIGNhbGxzdWIgbmV3X2dhbWUKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fam9pbl9nYW1lX3JvdXRlQDI6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MTUKICAgIC8vIGNsYXNzIFRpY1RhY1RvZUNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBidG9pCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgam9pbl9nYW1lCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3dob3NlX3R1cm5fcm91dGVAMzoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB3aG9zZV90dXJuCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3BsYXlfcm91dGVANDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIHN3YXAKICAgIGJ0b2kKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwbGF5CiAgICBpbnQgMQogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5uZXdfZ2FtZShtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6Cm5ld19nYW1lOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMC0yMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgLy8gZGVmIG5ld19nYW1lKHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGJ5dGUgIiIKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjIKICAgIC8vIGlmIFR4bi5hcHBsaWNhdGlvbl9pZDoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBuZXdfZ2FtZV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjMtMjUKICAgIC8vICMgaWYgYSBjaGFsbGVuZ2VyIGhhcyBqb2luZWQsIGRvbid0IGFsbG93IHN0YXJ0aW5nIGEgbmV3IGdhbWUKICAgIC8vICMgdW50aWwgdGhpcyBvbmUgaXMgY29tcGxldGUKICAgIC8vIGlmIHNlbGYuY2hhbGxlbmdlcjoKICAgIGludCAwCiAgICBieXRlICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYnogbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjI2CiAgICAvLyBhc3NlcnQgc2VsZi53aW5uZXIsICJHYW1lIGlzbid0IG92ZXIiCiAgICBpbnQgMAogICAgYnl0ZSAid2lubmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEdhbWUgaXNuJ3Qgb3ZlcgoKbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyNy0yOAogICAgLy8gIyByZXNldCBjaGFsbGVuZ2VyIGFuZCB3aW5uZXIKICAgIC8vIGRlbCBzZWxmLmNoYWxsZW5nZXIudmFsdWUKICAgIGJ5dGUgImNoYWxsZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyOQogICAgLy8gZGVsIHNlbGYud2lubmVyLnZhbHVlCiAgICBieXRlICJ3aW5uZXIiCiAgICBhcHBfZ2xvYmFsX2RlbAoKbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMAogICAgLy8gc2VsZi5ob3N0ID0gVHhuLnNlbmRlcgogICAgYnl0ZSAiaG9zdCIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjMxCiAgICAvLyBzZWxmLmdhbWUgPSBHYW1lLmZyb21fYnl0ZXMob3AuYnplcm8oOSkpCiAgICBpbnQgOQogICAgYnplcm8KICAgIGJ5dGUgImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMwogICAgLy8gYXNzZXJ0IGNvbHVtbiA8IDMgYW5kIHJvdyA8IDMsICJNb3ZlIG11c3QgYmUgaW4gcmFuZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGludCAzCiAgICA8CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYnogbmV3X2dhbWVfYm9vbF9mYWxzZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGludCAzCiAgICA8CiAgICBieiBuZXdfZ2FtZV9ib29sX2ZhbHNlQDcKICAgIGludCAxCiAgICBiIG5ld19nYW1lX2Jvb2xfbWVyZ2VAOAoKbmV3X2dhbWVfYm9vbF9mYWxzZUA3OgogICAgaW50IDAKCm5ld19nYW1lX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgYXNzZXJ0IC8vIE1vdmUgbXVzdCBiZSBpbiByYW5nZQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNAogICAgLy8gc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9IGFyYzQuVUludDgoSE9TVCkKICAgIGludCAwCiAgICBieXRlICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBnYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnQgMwogICAgPAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludCAzCiAgICAqCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludCAzCiAgICBleHRyYWN0MwogICAgZnJhbWVfZGlnIDAKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0yCiAgICBieXRlIDB4MDEKICAgIHJlcGxhY2UzCiAgICBpbnQgMAogICAgYnl0ZSAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgZ2FtZSBleGlzdHMKICAgIGNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBieXRlICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzUKICAgIC8vIHNlbGYudHVybnMgPSBVSW50NjQoMCkKICAgIGJ5dGUgInR1cm5zIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmpvaW5fZ2FtZShtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6CmpvaW5fZ2FtZToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzctMzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGpvaW5fZ2FtZShzZWxmLCBtb3ZlOiBNb3ZlKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuY2hhbGxlbmdlciwgIkhvc3QgYWxyZWFkeSBoYXMgYSBjaGFsbGVuZ2VyIgogICAgaW50IDAKICAgIGJ5dGUgImNoYWxsZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSG9zdCBhbHJlYWR5IGhhcyBhIGNoYWxsZW5nZXIKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDAKICAgIC8vIHNlbGYuY2hhbGxlbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGUgImNoYWxsZW5nZXIiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MQogICAgLy8gc2VsZi5tYWtlX21vdmUoYXJjNC5VSW50OChDSEFMTEVOR0VSKSwgbW92ZSkKICAgIGJ5dGUgMHgwMgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgbWFrZV9tb3ZlCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0Lm1ha2VfbW92ZShwbGF5ZXI6IGJ5dGVzLCBtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6Cm1ha2VfbW92ZToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTgtNTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbWFrZV9tb3ZlKHNlbGYsIHBsYXllcjogYXJjNC5VSW50OCwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2MQogICAgLy8gYXNzZXJ0IGNvbHVtbiA8IDMgYW5kIHJvdyA8IDMsICJNb3ZlIG11c3QgYmUgaW4gcmFuZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGludCAzCiAgICA8CiAgICBkdXAKICAgIGJ6IG1ha2VfbW92ZV9ib29sX2ZhbHNlQDMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50IDMKICAgIDwKICAgIGJ6IG1ha2VfbW92ZV9ib29sX2ZhbHNlQDMKICAgIGludCAxCiAgICBiIG1ha2VfbW92ZV9ib29sX21lcmdlQDQKCm1ha2VfbW92ZV9ib29sX2ZhbHNlQDM6CiAgICBpbnQgMAoKbWFrZV9tb3ZlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjEKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgYXNzZXJ0IC8vIE1vdmUgbXVzdCBiZSBpbiByYW5nZQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2MgogICAgLy8gYXNzZXJ0IHNlbGYuZ2FtZVtyb3ddW2NvbHVtbl0gPT0gRU1QVFksICJTcXVhcmUgaXMgYWxyZWFkeSB0YWtlbiIKICAgIGludCAwCiAgICBieXRlICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBnYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnQgMwogICAgPAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludCAzCiAgICAqCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludCAzCiAgICBleHRyYWN0MwogICAgZnJhbWVfZGlnIDAKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnQgMQogICAgZXh0cmFjdDMKICAgIGJ5dGUgMHgwMAogICAgYj09CiAgICBhc3NlcnQgLy8gU3F1YXJlIGlzIGFscmVhZHkgdGFrZW4KICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjMKICAgIC8vIHNlbGYuZ2FtZVtyb3ddW2NvbHVtbl0gPSBwbGF5ZXIKICAgIGludCAwCiAgICBieXRlICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBnYW1lIGV4aXN0cwogICAgZGlnIDEKICAgIGludCAzCiAgICBleHRyYWN0MwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTMKICAgIHJlcGxhY2UzCiAgICBpbnQgMAogICAgYnl0ZSAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgZ2FtZSBleGlzdHMKICAgIGNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBieXRlICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjQKICAgIC8vIHNlbGYudHVybnMgKz0gMQogICAgaW50IDAKICAgIGJ5dGUgInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB0dXJucyBleGlzdHMKICAgIGludCAxCiAgICArCiAgICBieXRlICJ0dXJucyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY1CiAgICAvLyBpZiBzZWxmLmRpZF93aW4ocGxheWVyLCBjb2x1bW49Y29sdW1uLCByb3c9cm93KToKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZGlkX3dpbgogICAgYnogbWFrZV9tb3ZlX2Vsc2VfYm9keUA2CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY2CiAgICAvLyBzZWxmLndpbm5lci52YWx1ZSA9IHBsYXllcgogICAgYnl0ZSAid2lubmVyIgogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBtYWtlX21vdmVfYWZ0ZXJfaWZfZWxzZUA5CgptYWtlX21vdmVfZWxzZV9ib2R5QDY6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY3CiAgICAvLyBlbGlmIHNlbGYudHVybnMgPT0gOToKICAgIGludCAwCiAgICBieXRlICJ0dXJucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdHVybnMgZXhpc3RzCiAgICBpbnQgOQogICAgPT0KICAgIGJ6IG1ha2VfbW92ZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjgKICAgIC8vIHNlbGYud2lubmVyLnZhbHVlID0gYXJjNC5VSW50OChEUkFXKQogICAgYnl0ZSAid2lubmVyIgogICAgYnl0ZSAweDAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFrZV9tb3ZlX2FmdGVyX2lmX2Vsc2VAOToKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QuZGlkX3dpbihwbGF5ZXI6IGJ5dGVzLCBjb2x1bW46IHVpbnQ2NCwgcm93OiB1aW50NjQpIC0+IHVpbnQ2NDoKZGlkX3dpbjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzAtNzEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGlkX3dpbihzZWxmLCBwbGF5ZXI6IGFyYzQuVUludDgsIGNvbHVtbjogVUludDY0LCByb3c6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDMgMQogICAgaW50IDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzIKICAgIC8vIGcgPSBzZWxmLmdhbWUuY29weSgpCiAgICBkdXBuIDMKICAgIGJ5dGUgImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBnYW1lIGV4aXN0cwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3NAogICAgLy8gaWYgZ1tyb3ddWzBdID09IGdbcm93XVsxXSA9PSBnW3Jvd11bMl06CiAgICBmcmFtZV9kaWcgLTEKICAgIGludCAzCiAgICA8CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50IDMKICAgICoKICAgIGludCAzCiAgICBleHRyYWN0MwogICAgZHVwbiAyCiAgICBleHRyYWN0IDAgMQogICAgc3dhcAogICAgZXh0cmFjdCAxIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDQKICAgIGV4dHJhY3QgMiAxCiAgICBmcmFtZV9kaWcgNQogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3NQogICAgLy8gcmV0dXJuIFRydWUKICAgIGludCAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojc3CiAgICAvLyBpZiBnWzBdW2NvbHVtbl0gPT0gZ1sxXVtjb2x1bW5dID09IGdbMl1bY29sdW1uXToKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnQgMwogICAgPAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGludCAxCiAgICBleHRyYWN0MwogICAgc3dhcAogICAgZXh0cmFjdCAzIDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGludCAxCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDYKICAgIGZyYW1lX2RpZyAzCiAgICBleHRyYWN0IDYgMwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnQgMQogICAgZXh0cmFjdDMKICAgIGZyYW1lX2RpZyAwCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojc4CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODAtODEKICAgIC8vICMgaWYgcGxheWVyIG93bnMgY2VudGVyLCBjaGVjayBkaWFnb25hbHMKICAgIC8vIGlmIHBsYXllciA9PSBnWzFdWzFdOgogICAgZnJhbWVfZGlnIDIKICAgIGV4dHJhY3QgMSAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjgyCiAgICAvLyBpZiBnWzBdWzBdID09IHBsYXllciA9PSBnWzJdWzJdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMCAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA2IDMKICAgIGV4dHJhY3QgMiAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjgzCiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg0CiAgICAvLyBpZiBnWzBdWzJdID09IHBsYXllciA9PSBnWzJdWzBdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA2IDMKICAgIGV4dHJhY3QgMCAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg1CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg2CiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludCAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3Qud2hvc2VfdHVybigpIC0+IGJ5dGVzOgp3aG9zZV90dXJuOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgd2hvc2VfdHVybihzZWxmKSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMCAxCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChIT1NUKSBpZiBzZWxmLnR1cm5zICUgMiBlbHNlIGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGludCAwCiAgICBieXRlICJ0dXJucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdHVybnMgZXhpc3RzCiAgICBpbnQgMgogICAgJQogICAgYnogd2hvc2VfdHVybl90ZXJuYXJ5X2ZhbHNlQDIKICAgIGJ5dGUgMHgwMQogICAgYiB3aG9zZV90dXJuX3Rlcm5hcnlfbWVyZ2VAMwoKd2hvc2VfdHVybl90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChIT1NUKSBpZiBzZWxmLnR1cm5zICUgMiBlbHNlIGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGJ5dGUgMHgwMgoKd2hvc2VfdHVybl90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChIT1NUKSBpZiBzZWxmLnR1cm5zICUgMiBlbHNlIGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QucGxheShtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6CnBsYXk6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3LTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwbGF5KHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi53aW5uZXIsICJHYW1lIGlzIGFscmVhZHkgZmluaXNoZWQiCiAgICBpbnQgMAogICAgYnl0ZSAid2lubmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEdhbWUgaXMgYWxyZWFkeSBmaW5pc2hlZAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1MAogICAgLy8gaWYgc2VsZi50dXJucyAlIDI6CiAgICBpbnQgMAogICAgYnl0ZSAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHR1cm5zIGV4aXN0cwogICAgaW50IDIKICAgICUKICAgIGJ6IHBsYXlfZWxzZV9ib2R5QDIKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTEKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuaG9zdCwgIkl0IGlzIHRoZSBob3N0J3MgdHVybiIKICAgIHR4biBTZW5kZXIKICAgIGludCAwCiAgICBieXRlICJob3N0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBob3N0IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJdCBpcyB0aGUgaG9zdCdzIHR1cm4KICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTIKICAgIC8vIHBsYXllciA9IGFyYzQuVUludDgoSE9TVCkKICAgIGJ5dGUgMHgwMQogICAgYiBwbGF5X2FmdGVyX2lmX2Vsc2VAMwoKcGxheV9lbHNlX2JvZHlAMjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTQKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuY2hhbGxlbmdlci5nZXQoQWNjb3VudCgpKSwgIkl0IGlzIHRoZSBjaGFsbGVuZ2VyJ3MgdHVybiIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgaW50IDAKICAgIGJ5dGUgImNoYWxsZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc2VsZWN0CiAgICA9PQogICAgYXNzZXJ0IC8vIEl0IGlzIHRoZSBjaGFsbGVuZ2VyJ3MgdHVybgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1NQogICAgLy8gcGxheWVyID0gYXJjNC5VSW50OChDSEFMTEVOR0VSKQogICAgYnl0ZSAweDAyCgpwbGF5X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTYKICAgIC8vIHNlbGYubWFrZV9tb3ZlKHBsYXllciwgbW92ZSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG1ha2VfbW92ZQogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBtZXRob2QgIm5ld19nYW1lKCh1aW50NjQsdWludDY0KSl2b2lkIgogICAgbWV0aG9kICJqb2luX2dhbWUoKHVpbnQ2NCx1aW50NjQpKXZvaWQiCiAgICBtZXRob2QgIndob3NlX3R1cm4oKXVpbnQ4IgogICAgbWV0aG9kICJwbGF5KCh1aW50NjQsdWludDY0KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9uZXdfZ2FtZV9yb3V0ZUAxIG1haW5fam9pbl9nYW1lX3JvdXRlQDIgbWFpbl93aG9zZV90dXJuX3JvdXRlQDMgbWFpbl9wbGF5X3JvdXRlQDQKICAgIGVyciAvLyByZWplY3QgdHJhbnNhY3Rpb24KCm1haW5fbmV3X2dhbWVfcm91dGVAMToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9ImFsbG93IikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIHN3YXAKICAgIGJ0b2kKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9ImFsbG93IikKICAgIGNhbGxzdWIgbmV3X2dhbWUKICAgIGludCAxCiAgICByZXR1cm4KCm1haW5fam9pbl9nYW1lX3JvdXRlQDI6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MTUKICAgIC8vIGNsYXNzIFRpY1RhY1RvZUNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgZXh0cmFjdCAwIDgKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBidG9pCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgam9pbl9nYW1lCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3dob3NlX3R1cm5fcm91dGVAMzoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB3aG9zZV90dXJuCiAgICBieXRlIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnQgMQogICAgcmV0dXJuCgptYWluX3BsYXlfcm91dGVANDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOAogICAgc3dhcAogICAgZXh0cmFjdCA4IDgKICAgIHN3YXAKICAgIGJ0b2kKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBwbGF5CiAgICBpbnQgMQogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5uZXdfZ2FtZShtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6Cm5ld19nYW1lOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMC0yMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgLy8gZGVmIG5ld19nYW1lKHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIGJ5dGUgIiIKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjIKICAgIC8vIGlmIFR4bi5hcHBsaWNhdGlvbl9pZDoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBuZXdfZ2FtZV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjMtMjUKICAgIC8vICMgaWYgYSBjaGFsbGVuZ2VyIGhhcyBqb2luZWQsIGRvbid0IGFsbG93IHN0YXJ0aW5nIGEgbmV3IGdhbWUKICAgIC8vICMgdW50aWwgdGhpcyBvbmUgaXMgY29tcGxldGUKICAgIC8vIGlmIHNlbGYuY2hhbGxlbmdlcjoKICAgIGludCAwCiAgICBieXRlICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYnogbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjI2CiAgICAvLyBhc3NlcnQgc2VsZi53aW5uZXIsICJHYW1lIGlzbid0IG92ZXIiCiAgICBpbnQgMAogICAgYnl0ZSAid2lubmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEdhbWUgaXNuJ3Qgb3ZlcgoKbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyNy0yOAogICAgLy8gIyByZXNldCBjaGFsbGVuZ2VyIGFuZCB3aW5uZXIKICAgIC8vIGRlbCBzZWxmLmNoYWxsZW5nZXIudmFsdWUKICAgIGJ5dGUgImNoYWxsZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyOQogICAgLy8gZGVsIHNlbGYud2lubmVyLnZhbHVlCiAgICBieXRlICJ3aW5uZXIiCiAgICBhcHBfZ2xvYmFsX2RlbAoKbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMAogICAgLy8gc2VsZi5ob3N0ID0gVHhuLnNlbmRlcgogICAgYnl0ZSAiaG9zdCIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjMxCiAgICAvLyBzZWxmLmdhbWUgPSBHYW1lLmZyb21fYnl0ZXMob3AuYnplcm8oOSkpCiAgICBpbnQgOQogICAgYnplcm8KICAgIGJ5dGUgImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMwogICAgLy8gYXNzZXJ0IGNvbHVtbiA8IDMgYW5kIHJvdyA8IDMsICJNb3ZlIG11c3QgYmUgaW4gcmFuZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGludCAzCiAgICA8CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYnogbmV3X2dhbWVfYm9vbF9mYWxzZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGludCAzCiAgICA8CiAgICBieiBuZXdfZ2FtZV9ib29sX2ZhbHNlQDcKICAgIGludCAxCiAgICBiIG5ld19nYW1lX2Jvb2xfbWVyZ2VAOAoKbmV3X2dhbWVfYm9vbF9mYWxzZUA3OgogICAgaW50IDAKCm5ld19nYW1lX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgYXNzZXJ0IC8vIE1vdmUgbXVzdCBiZSBpbiByYW5nZQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNAogICAgLy8gc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9IGFyYzQuVUludDgoSE9TVCkKICAgIGludCAwCiAgICBieXRlICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBnYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnQgMwogICAgPAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludCAzCiAgICAqCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludCAzCiAgICBleHRyYWN0MwogICAgZnJhbWVfZGlnIDAKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0yCiAgICBieXRlIDB4MDEKICAgIHJlcGxhY2UzCiAgICBpbnQgMAogICAgYnl0ZSAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgZ2FtZSBleGlzdHMKICAgIGNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBieXRlICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzUKICAgIC8vIHNlbGYudHVybnMgPSBVSW50NjQoMCkKICAgIGJ5dGUgInR1cm5zIgogICAgaW50IDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmpvaW5fZ2FtZShtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6CmpvaW5fZ2FtZToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzctMzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGpvaW5fZ2FtZShzZWxmLCBtb3ZlOiBNb3ZlKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM5CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuY2hhbGxlbmdlciwgIkhvc3QgYWxyZWFkeSBoYXMgYSBjaGFsbGVuZ2VyIgogICAgaW50IDAKICAgIGJ5dGUgImNoYWxsZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSG9zdCBhbHJlYWR5IGhhcyBhIGNoYWxsZW5nZXIKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDAKICAgIC8vIHNlbGYuY2hhbGxlbmdlci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIGJ5dGUgImNoYWxsZW5nZXIiCiAgICB0eG4gU2VuZGVyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MQogICAgLy8gc2VsZi5tYWtlX21vdmUoYXJjNC5VSW50OChDSEFMTEVOR0VSKSwgbW92ZSkKICAgIGJ5dGUgMHgwMgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgbWFrZV9tb3ZlCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0Lm1ha2VfbW92ZShwbGF5ZXI6IGJ5dGVzLCBtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6Cm1ha2VfbW92ZToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjAtNjEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbWFrZV9tb3ZlKHNlbGYsIHBsYXllcjogYXJjNC5VSW50OCwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2MwogICAgLy8gYXNzZXJ0IGNvbHVtbiA8IDMgYW5kIHJvdyA8IDMsICJNb3ZlIG11c3QgYmUgaW4gcmFuZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGludCAzCiAgICA8CiAgICBkdXAKICAgIGJ6IG1ha2VfbW92ZV9ib29sX2ZhbHNlQDMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50IDMKICAgIDwKICAgIGJ6IG1ha2VfbW92ZV9ib29sX2ZhbHNlQDMKICAgIGludCAxCiAgICBiIG1ha2VfbW92ZV9ib29sX21lcmdlQDQKCm1ha2VfbW92ZV9ib29sX2ZhbHNlQDM6CiAgICBpbnQgMAoKbWFrZV9tb3ZlX2Jvb2xfbWVyZ2VANDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgYXNzZXJ0IC8vIE1vdmUgbXVzdCBiZSBpbiByYW5nZQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2NAogICAgLy8gYXNzZXJ0IHNlbGYuZ2FtZVtyb3ddW2NvbHVtbl0gPT0gRU1QVFksICJTcXVhcmUgaXMgYWxyZWFkeSB0YWtlbiIKICAgIGludCAwCiAgICBieXRlICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBnYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnQgMwogICAgPAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludCAzCiAgICAqCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludCAzCiAgICBleHRyYWN0MwogICAgZnJhbWVfZGlnIDAKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnQgMQogICAgZXh0cmFjdDMKICAgIGJ5dGUgMHgwMAogICAgYj09CiAgICBhc3NlcnQgLy8gU3F1YXJlIGlzIGFscmVhZHkgdGFrZW4KICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjUKICAgIC8vIHNlbGYuZ2FtZVtyb3ddW2NvbHVtbl0gPSBwbGF5ZXIKICAgIGludCAwCiAgICBieXRlICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBnYW1lIGV4aXN0cwogICAgZGlnIDEKICAgIGludCAzCiAgICBleHRyYWN0MwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTMKICAgIHJlcGxhY2UzCiAgICBpbnQgMAogICAgYnl0ZSAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgZ2FtZSBleGlzdHMKICAgIGNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICBieXRlICJnYW1lIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjYKICAgIC8vIHNlbGYudHVybnMgKz0gMQogICAgaW50IDAKICAgIGJ5dGUgInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayB0dXJucyBleGlzdHMKICAgIGludCAxCiAgICArCiAgICBieXRlICJ0dXJucyIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY3CiAgICAvLyBpZiBzZWxmLmRpZF93aW4ocGxheWVyLCBjb2x1bW49Y29sdW1uLCByb3c9cm93KToKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZGlkX3dpbgogICAgYnogbWFrZV9tb3ZlX2Vsc2VfYm9keUA2CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY4CiAgICAvLyBzZWxmLndpbm5lci52YWx1ZSA9IHBsYXllcgogICAgYnl0ZSAid2lubmVyIgogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBtYWtlX21vdmVfYWZ0ZXJfaWZfZWxzZUA5CgptYWtlX21vdmVfZWxzZV9ib2R5QDY6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY5CiAgICAvLyBlbGlmIHNlbGYudHVybnMgPT0gOToKICAgIGludCAwCiAgICBieXRlICJ0dXJucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdHVybnMgZXhpc3RzCiAgICBpbnQgOQogICAgPT0KICAgIGJ6IG1ha2VfbW92ZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzAKICAgIC8vIHNlbGYud2lubmVyLnZhbHVlID0gYXJjNC5VSW50OChEUkFXKQogICAgYnl0ZSAid2lubmVyIgogICAgYnl0ZSAweDAzCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFrZV9tb3ZlX2FmdGVyX2lmX2Vsc2VAOToKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QuZGlkX3dpbihwbGF5ZXI6IGJ5dGVzLCBjb2x1bW46IHVpbnQ2NCwgcm93OiB1aW50NjQpIC0+IHVpbnQ2NDoKZGlkX3dpbjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzItNzMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZGlkX3dpbihzZWxmLCBwbGF5ZXI6IGFyYzQuVUludDgsIGNvbHVtbjogVUludDY0LCByb3c6IFVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDMgMQogICAgaW50IDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzQKICAgIC8vIGcgPSBzZWxmLmdhbWUuY29weSgpCiAgICBkdXBuIDMKICAgIGJ5dGUgImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBnYW1lIGV4aXN0cwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3NgogICAgLy8gaWYgZ1tyb3ddWzBdID09IGdbcm93XVsxXSA9PSBnW3Jvd11bMl06CiAgICBmcmFtZV9kaWcgLTEKICAgIGludCAzCiAgICA8CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50IDMKICAgICoKICAgIGludCAzCiAgICBleHRyYWN0MwogICAgZHVwbiAyCiAgICBleHRyYWN0IDAgMQogICAgc3dhcAogICAgZXh0cmFjdCAxIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMwogICAgZnJhbWVfZGlnIDQKICAgIGV4dHJhY3QgMiAxCiAgICBmcmFtZV9kaWcgNQogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3NwogICAgLy8gcmV0dXJuIFRydWUKICAgIGludCAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojc5CiAgICAvLyBpZiBnWzBdW2NvbHVtbl0gPT0gZ1sxXVtjb2x1bW5dID09IGdbMl1bY29sdW1uXToKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnQgMwogICAgPAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTIKICAgIGludCAxCiAgICBleHRyYWN0MwogICAgc3dhcAogICAgZXh0cmFjdCAzIDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGludCAxCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDYKICAgIGZyYW1lX2RpZyAzCiAgICBleHRyYWN0IDYgMwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnQgMQogICAgZXh0cmFjdDMKICAgIGZyYW1lX2RpZyAwCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjgwCiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODItODMKICAgIC8vICMgaWYgcGxheWVyIG93bnMgY2VudGVyLCBjaGVjayBkaWFnb25hbHMKICAgIC8vIGlmIHBsYXllciA9PSBnWzFdWzFdOgogICAgZnJhbWVfZGlnIDIKICAgIGV4dHJhY3QgMSAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg0CiAgICAvLyBpZiBnWzBdWzBdID09IHBsYXllciA9PSBnWzJdWzJdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMCAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA2IDMKICAgIGV4dHJhY3QgMiAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg1CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg2CiAgICAvLyBpZiBnWzBdWzJdID09IHBsYXllciA9PSBnWzJdWzBdOgogICAgZnJhbWVfZGlnIDEKICAgIGV4dHJhY3QgMiAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA2IDMKICAgIGV4dHJhY3QgMCAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg3CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgaW50IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojg4CiAgICAvLyByZXR1cm4gRmFsc2UKICAgIGludCAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3Qud2hvc2VfdHVybigpIC0+IGJ5dGVzOgp3aG9zZV90dXJuOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgd2hvc2VfdHVybihzZWxmKSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMCAxCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChIT1NUKSBpZiBzZWxmLnR1cm5zICUgMiBlbHNlIGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGludCAwCiAgICBieXRlICJ0dXJucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgdHVybnMgZXhpc3RzCiAgICBpbnQgMgogICAgJQogICAgYnogd2hvc2VfdHVybl90ZXJuYXJ5X2ZhbHNlQDIKICAgIGJ5dGUgMHgwMQogICAgYiB3aG9zZV90dXJuX3Rlcm5hcnlfbWVyZ2VAMwoKd2hvc2VfdHVybl90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChIT1NUKSBpZiBzZWxmLnR1cm5zICUgMiBlbHNlIGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGJ5dGUgMHgwMgoKd2hvc2VfdHVybl90ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ1CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChIT1NUKSBpZiBzZWxmLnR1cm5zICUgMiBlbHNlIGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QucGxheShtb3ZlLjA6IHVpbnQ2NCwgbW92ZS4xOiB1aW50NjQpIC0+IHZvaWQ6CnBsYXk6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3LTQ4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBwbGF5KHNlbGYsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDkKICAgIC8vIGFzc2VydCBub3Qgc2VsZi53aW5uZXIsICJHYW1lIGlzIGFscmVhZHkgZmluaXNoZWQiCiAgICBpbnQgMAogICAgYnl0ZSAid2lubmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEdhbWUgaXMgYWxyZWFkeSBmaW5pc2hlZAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo1MAogICAgLy8gaWYgc2VsZi50dXJucyAlIDI6CiAgICBpbnQgMAogICAgYnl0ZSAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHR1cm5zIGV4aXN0cwogICAgaW50IDIKICAgICUKICAgIGJ6IHBsYXlfZWxzZV9ib2R5QDIKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTEKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuaG9zdCwgIkl0IGlzIHRoZSBob3N0J3MgdHVybiIKICAgIHR4biBTZW5kZXIKICAgIGludCAwCiAgICBieXRlICJob3N0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBob3N0IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJdCBpcyB0aGUgaG9zdCdzIHR1cm4KICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTIKICAgIC8vIHBsYXllciA9IGFyYzQuVUludDgoSE9TVCkKICAgIGJ5dGUgMHgwMQogICAgYiBwbGF5X2FmdGVyX2lmX2Vsc2VAMwoKcGxheV9lbHNlX2JvZHlAMjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTQKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuY2hhbGxlbmdlci5nZXQoCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU1CiAgICAvLyBkZWZhdWx0PUFjY291bnQoKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgaW50IDAKICAgIGJ5dGUgImNoYWxsZW5nZXIiCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0LTU2CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgLy8gICAgIGRlZmF1bHQ9QWNjb3VudCgpCiAgICAvLyApLCAiSXQgaXMgdGhlIGNoYWxsZW5nZXIncyB0dXJuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHNlbGVjdAogICAgPT0KICAgIGFzc2VydCAvLyBJdCBpcyB0aGUgY2hhbGxlbmdlcidzIHR1cm4KICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTcKICAgIC8vIHBsYXllciA9IGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGJ5dGUgMHgwMgoKcGxheV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU4CiAgICAvLyBzZWxmLm1ha2VfbW92ZShwbGF5ZXIsIG1vdmUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBtYWtlX21vdmUKICAgIHJldHN1Ygo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBpbnQgMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/examples/tictactoe/out/TicTacToeContract.destructured.ir b/examples/tictactoe/out/TicTacToeContract.destructured.ir index 70ffaf2ebc..3f70880747 100644 --- a/examples/tictactoe/out/TicTacToeContract.destructured.ir +++ b/examples/tictactoe/out/TicTacToeContract.destructured.ir @@ -111,19 +111,19 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: return subroutine examples.tictactoe.tictactoe.TicTacToeContract.make_move(player: bytes, move.0: uint64, move.1: uint64) -> void: - block@0: // L58 + block@0: // L60 let tmp%0#0: uint64 = (< move.0#0 3u) goto tmp%0#0 ? block@1 : block@3 - block@1: // and_contd_L61 + block@1: // and_contd_L63 let tmp%1#0: uint64 = (< move.1#0 3u) goto tmp%1#0 ? block@2 : block@3 - block@2: // bool_true_L61 + block@2: // bool_true_L63 let and_result%2#0: uint64 = 1u goto block@4 - block@3: // bool_false_L61 + block@3: // bool_false_L63 let and_result%2#0: uint64 = 0u goto block@4 - block@4: // bool_merge_L61 + block@4: // bool_merge_L63 (assert and_result%2#0) // Move must be in range let (game_value%3#0: bytes, game_exists%4#0: uint64) = (app_global_get_ex 0u "game") (assert game_exists%4#0) // check game exists @@ -149,22 +149,22 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: (app_global_put "turns" new_state_value%34#0) let tmp%35#0: uint64 = examples.tictactoe.tictactoe.TicTacToeContract.did_win(player#0, move.0#0, move.1#0) goto tmp%35#0 ? block@5 : block@6 - block@5: // if_body_L65 + block@5: // if_body_L67 (app_global_put "winner" player#0) goto block@9 - block@6: // else_body_L65 + block@6: // else_body_L67 let (turns_value%36#0: uint64, turns_exists%37#0: uint64) = (app_global_get_ex 0u "turns") (assert turns_exists%37#0) // check turns exists let tmp%38#0: uint64 = (== turns_value%36#0 9u) goto tmp%38#0 ? block@7 : block@9 - block@7: // if_body_L67 + block@7: // if_body_L69 (app_global_put "winner" 0x03) goto block@9 - block@9: // after_if_else_L65 + block@9: // after_if_else_L67 return subroutine examples.tictactoe.tictactoe.TicTacToeContract.did_win(player: bytes, column: uint64, row: uint64) -> uint64: - block@0: // L70 + block@0: // L72 let (g#0: bytes, game_exists%1#0: uint64) = (app_global_get_ex 0u "game") (assert game_exists%1#0) // check game exists let index_is_in_bounds%4#0: uint64 = (< row#0 3u) @@ -175,13 +175,13 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%14#0: bytes = ((extract 1 1) tmp%6#0) let tmp%15#0: uint64 = (b== tmp%8#0 awst_tmp%14#0) goto tmp%15#0 ? block@1 : block@3 - block@1: // and_contd_L74 + block@1: // and_contd_L76 let tmp%21#0: bytes = ((extract 2 1) tmp%6#0) let tmp%22#0: uint64 = (b== awst_tmp%14#0 tmp%21#0) goto tmp%22#0 ? block@2 : block@3 - block@2: // if_body_L74 + block@2: // if_body_L76 return 1u - block@3: // after_if_else_L74 + block@3: // after_if_else_L76 let tmp%24#0: bytes = ((extract 0 3) g#0) let index_is_in_bounds%26#0: uint64 = (< column#0 3u) (assert index_is_in_bounds%26#0) // Index access is out of bounds @@ -190,40 +190,40 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%34#0: bytes = (extract3 tmp%30#0 column#0 1u) let tmp%35#0: uint64 = (b== tmp%28#0 awst_tmp%34#0) goto tmp%35#0 ? block@4 : block@6 - block@4: // and_contd_L77 + block@4: // and_contd_L79 let tmp%37#0: bytes = ((extract 6 3) g#0) let tmp%41#0: bytes = (extract3 tmp%37#0 column#0 1u) let tmp%42#0: uint64 = (b== awst_tmp%34#0 tmp%41#0) goto tmp%42#0 ? block@5 : block@6 - block@5: // if_body_L77 + block@5: // if_body_L79 return 1u - block@6: // after_if_else_L77 + block@6: // after_if_else_L79 let tmp%46#0: bytes = ((extract 1 1) tmp%30#0) let tmp%47#0: uint64 = (b== player#0 tmp%46#0) goto tmp%47#0 ? block@7 : block@14 - block@7: // if_body_L80 + block@7: // if_body_L82 let tmp%51#0: bytes = ((extract 0 1) tmp%24#0) let tmp%52#0: uint64 = (b== tmp%51#0 player#0) goto tmp%52#0 ? block@8 : block@10 - block@8: // and_contd_L82 + block@8: // and_contd_L84 let tmp%54#0: bytes = ((extract 6 3) g#0) let tmp%56#0: bytes = ((extract 2 1) tmp%54#0) let tmp%57#0: uint64 = (b== player#0 tmp%56#0) goto tmp%57#0 ? block@9 : block@10 - block@9: // if_body_L82 + block@9: // if_body_L84 return 1u - block@10: // after_if_else_L82 + block@10: // after_if_else_L84 let tmp%61#0: bytes = ((extract 2 1) tmp%24#0) let tmp%62#0: uint64 = (b== tmp%61#0 player#0) goto tmp%62#0 ? block@11 : block@14 - block@11: // and_contd_L84 + block@11: // and_contd_L86 let tmp%64#0: bytes = ((extract 6 3) g#0) let tmp%66#0: bytes = ((extract 0 1) tmp%64#0) let tmp%67#0: uint64 = (b== player#0 tmp%66#0) goto tmp%67#0 ? block@12 : block@14 - block@12: // if_body_L84 + block@12: // if_body_L86 return 1u - block@14: // after_if_else_L80 + block@14: // after_if_else_L82 return 0u subroutine examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() -> bytes: diff --git a/examples/tictactoe/out/TicTacToeContract.ssa.ir b/examples/tictactoe/out/TicTacToeContract.ssa.ir index 5bba627c2c..ec9bf851d9 100644 --- a/examples/tictactoe/out/TicTacToeContract.ssa.ir +++ b/examples/tictactoe/out/TicTacToeContract.ssa.ir @@ -131,21 +131,21 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: return subroutine examples.tictactoe.tictactoe.TicTacToeContract.make_move(player: bytes, move.0: uint64, move.1: uint64) -> void: - block@0: // L58 + block@0: // L60 let column#0: uint64 = move.0#0 let row#0: uint64 = move.1#0 let tmp%0#0: uint64 = (< column#0 3u) goto tmp%0#0 ? block@1 : block@3 - block@1: // and_contd_L61 + block@1: // and_contd_L63 let tmp%1#0: uint64 = (< row#0 3u) goto tmp%1#0 ? block@2 : block@3 - block@2: // bool_true_L61 + block@2: // bool_true_L63 let and_result%2#0: uint64 = 1u goto block@4 - block@3: // bool_false_L61 + block@3: // bool_false_L63 let and_result%2#1: uint64 = 0u goto block@4 - block@4: // bool_merge_L61 + block@4: // bool_merge_L63 let and_result%2#2: uint64 = φ(and_result%2#0 <- block@2, and_result%2#1 <- block@3) (assert and_result%2#2) // Move must be in range let (game_value%3#0: bytes, game_exists%4#0: uint64) = (app_global_get_ex 0u "game") @@ -190,24 +190,24 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: (app_global_put "turns" new_state_value%34#0) let tmp%35#0: uint64 = examples.tictactoe.tictactoe.TicTacToeContract.did_win(player#0, column#0, row#0) goto tmp%35#0 ? block@5 : block@6 - block@5: // if_body_L65 + block@5: // if_body_L67 (app_global_put "winner" player#0) goto block@9 - block@6: // else_body_L65 + block@6: // else_body_L67 let (turns_value%36#0: uint64, turns_exists%37#0: uint64) = (app_global_get_ex 0u "turns") (assert turns_exists%37#0) // check turns exists let tmp%38#0: uint64 = (== turns_value%36#0 9u) goto tmp%38#0 ? block@7 : block@8 - block@7: // if_body_L67 + block@7: // if_body_L69 (app_global_put "winner" 0x03) goto block@8 - block@8: // after_if_else_L67 + block@8: // after_if_else_L69 goto block@9 - block@9: // after_if_else_L65 + block@9: // after_if_else_L67 return subroutine examples.tictactoe.tictactoe.TicTacToeContract.did_win(player: bytes, column: uint64, row: uint64) -> uint64: - block@0: // L70 + block@0: // L72 let (game_value%0#0: bytes, game_exists%1#0: uint64) = (app_global_get_ex 0u "game") (assert game_exists%1#0) // check game exists let copy%2#0: bytes = game_value%0#0 @@ -228,7 +228,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%14#0: bytes = (extract3 tmp%12#0 item_index%13#0 1u) let tmp%15#0: uint64 = (b== tmp%8#0 awst_tmp%14#0) goto tmp%15#0 ? block@1 : block@3 - block@1: // and_contd_L74 + block@1: // and_contd_L76 let array_length%16#0: uint64 = 3u let index_is_in_bounds%17#0: uint64 = (< row#0 array_length%16#0) (assert index_is_in_bounds%17#0) // Index access is out of bounds @@ -238,9 +238,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let tmp%21#0: bytes = (extract3 tmp%19#0 item_index%20#0 1u) let tmp%22#0: uint64 = (b== awst_tmp%14#0 tmp%21#0) goto tmp%22#0 ? block@2 : block@3 - block@2: // if_body_L74 + block@2: // if_body_L76 return 1u - block@3: // after_if_else_L74 + block@3: // after_if_else_L76 let item_index%23#0: uint64 = (* 0u 3u) let tmp%24#0: bytes = (extract3 g#0 item_index%23#0 3u) let array_length%25#0: uint64 = 3u @@ -257,7 +257,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%34#0: bytes = (extract3 tmp%30#0 item_index%33#0 1u) let tmp%35#0: uint64 = (b== tmp%28#0 awst_tmp%34#0) goto tmp%35#0 ? block@4 : block@6 - block@4: // and_contd_L77 + block@4: // and_contd_L79 let item_index%36#0: uint64 = (* 2u 3u) let tmp%37#0: bytes = (extract3 g#0 item_index%36#0 3u) let array_length%38#0: uint64 = 3u @@ -267,50 +267,50 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let tmp%41#0: bytes = (extract3 tmp%37#0 item_index%40#0 1u) let tmp%42#0: uint64 = (b== awst_tmp%34#0 tmp%41#0) goto tmp%42#0 ? block@5 : block@6 - block@5: // if_body_L77 + block@5: // if_body_L79 return 1u - block@6: // after_if_else_L77 + block@6: // after_if_else_L79 let item_index%43#0: uint64 = (* 1u 3u) let tmp%44#0: bytes = (extract3 g#0 item_index%43#0 3u) let item_index%45#0: uint64 = (* 1u 1u) let tmp%46#0: bytes = (extract3 tmp%44#0 item_index%45#0 1u) let tmp%47#0: uint64 = (b== player#0 tmp%46#0) goto tmp%47#0 ? block@7 : block@14 - block@7: // if_body_L80 + block@7: // if_body_L82 let item_index%48#0: uint64 = (* 0u 3u) let tmp%49#0: bytes = (extract3 g#0 item_index%48#0 3u) let item_index%50#0: uint64 = (* 0u 1u) let tmp%51#0: bytes = (extract3 tmp%49#0 item_index%50#0 1u) let tmp%52#0: uint64 = (b== tmp%51#0 player#0) goto tmp%52#0 ? block@8 : block@10 - block@8: // and_contd_L82 + block@8: // and_contd_L84 let item_index%53#0: uint64 = (* 2u 3u) let tmp%54#0: bytes = (extract3 g#0 item_index%53#0 3u) let item_index%55#0: uint64 = (* 2u 1u) let tmp%56#0: bytes = (extract3 tmp%54#0 item_index%55#0 1u) let tmp%57#0: uint64 = (b== player#0 tmp%56#0) goto tmp%57#0 ? block@9 : block@10 - block@9: // if_body_L82 + block@9: // if_body_L84 return 1u - block@10: // after_if_else_L82 + block@10: // after_if_else_L84 let item_index%58#0: uint64 = (* 0u 3u) let tmp%59#0: bytes = (extract3 g#0 item_index%58#0 3u) let item_index%60#0: uint64 = (* 2u 1u) let tmp%61#0: bytes = (extract3 tmp%59#0 item_index%60#0 1u) let tmp%62#0: uint64 = (b== tmp%61#0 player#0) goto tmp%62#0 ? block@11 : block@13 - block@11: // and_contd_L84 + block@11: // and_contd_L86 let item_index%63#0: uint64 = (* 2u 3u) let tmp%64#0: bytes = (extract3 g#0 item_index%63#0 3u) let item_index%65#0: uint64 = (* 0u 1u) let tmp%66#0: bytes = (extract3 tmp%64#0 item_index%65#0 1u) let tmp%67#0: uint64 = (b== player#0 tmp%66#0) goto tmp%67#0 ? block@12 : block@13 - block@12: // if_body_L84 + block@12: // if_body_L86 return 1u - block@13: // after_if_else_L84 + block@13: // after_if_else_L86 goto block@14 - block@14: // after_if_else_L80 + block@14: // after_if_else_L82 return 0u subroutine examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() -> bytes: diff --git a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir index 240caf1dd1..66f6e25c46 100644 --- a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir +++ b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_1.ir @@ -112,19 +112,19 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: return subroutine examples.tictactoe.tictactoe.TicTacToeContract.make_move(player: bytes, move.0: uint64, move.1: uint64) -> void: - block@0: // L58 + block@0: // L60 let tmp%0#0: uint64 = (< move.0#0 3u) goto tmp%0#0 ? block@1 : block@3 - block@1: // and_contd_L61 + block@1: // and_contd_L63 let tmp%1#0: uint64 = (< move.1#0 3u) goto tmp%1#0 ? block@2 : block@3 - block@2: // bool_true_L61 + block@2: // bool_true_L63 let and_result%2#0: uint64 = 1u goto block@4 - block@3: // bool_false_L61 + block@3: // bool_false_L63 let and_result%2#1: uint64 = 0u goto block@4 - block@4: // bool_merge_L61 + block@4: // bool_merge_L63 let and_result%2#2: uint64 = φ(and_result%2#0 <- block@2, and_result%2#1 <- block@3) (assert and_result%2#2) // Move must be in range let (game_value%3#0: bytes, game_exists%4#0: uint64) = (app_global_get_ex 0u "game") @@ -151,22 +151,22 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: (app_global_put "turns" new_state_value%34#0) let tmp%35#0: uint64 = examples.tictactoe.tictactoe.TicTacToeContract.did_win(player#0, move.0#0, move.1#0) goto tmp%35#0 ? block@5 : block@6 - block@5: // if_body_L65 + block@5: // if_body_L67 (app_global_put "winner" player#0) goto block@9 - block@6: // else_body_L65 + block@6: // else_body_L67 let (turns_value%36#0: uint64, turns_exists%37#0: uint64) = (app_global_get_ex 0u "turns") (assert turns_exists%37#0) // check turns exists let tmp%38#0: uint64 = (== turns_value%36#0 9u) goto tmp%38#0 ? block@7 : block@9 - block@7: // if_body_L67 + block@7: // if_body_L69 (app_global_put "winner" 0x03) goto block@9 - block@9: // after_if_else_L65 + block@9: // after_if_else_L67 return subroutine examples.tictactoe.tictactoe.TicTacToeContract.did_win(player: bytes, column: uint64, row: uint64) -> uint64: - block@0: // L70 + block@0: // L72 let (g#0: bytes, game_exists%1#0: uint64) = (app_global_get_ex 0u "game") (assert game_exists%1#0) // check game exists let index_is_in_bounds%4#0: uint64 = (< row#0 3u) @@ -179,14 +179,14 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%14#0: bytes = (extract3 tmp%6#0 item_index%13#0 1u) let tmp%15#0: uint64 = (b== tmp%8#0 awst_tmp%14#0) goto tmp%15#0 ? block@1 : block@3 - block@1: // and_contd_L74 + block@1: // and_contd_L76 let item_index%20#0: uint64 = 2u let tmp%21#0: bytes = (extract3 tmp%6#0 item_index%20#0 1u) let tmp%22#0: uint64 = (b== awst_tmp%14#0 tmp%21#0) goto tmp%22#0 ? block@2 : block@3 - block@2: // if_body_L74 + block@2: // if_body_L76 return 1u - block@3: // after_if_else_L74 + block@3: // after_if_else_L76 let item_index%23#0: uint64 = 0u let tmp%24#0: bytes = (extract3 g#0 item_index%23#0 3u) let index_is_in_bounds%26#0: uint64 = (< column#0 3u) @@ -197,54 +197,54 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%34#0: bytes = (extract3 tmp%30#0 column#0 1u) let tmp%35#0: uint64 = (b== tmp%28#0 awst_tmp%34#0) goto tmp%35#0 ? block@4 : block@6 - block@4: // and_contd_L77 + block@4: // and_contd_L79 let item_index%36#0: uint64 = 6u let tmp%37#0: bytes = (extract3 g#0 item_index%36#0 3u) let tmp%41#0: bytes = (extract3 tmp%37#0 column#0 1u) let tmp%42#0: uint64 = (b== awst_tmp%34#0 tmp%41#0) goto tmp%42#0 ? block@5 : block@6 - block@5: // if_body_L77 + block@5: // if_body_L79 return 1u - block@6: // after_if_else_L77 + block@6: // after_if_else_L79 let item_index%43#0: uint64 = 3u let tmp%44#0: bytes = (extract3 g#0 item_index%43#0 3u) let item_index%45#0: uint64 = 1u let tmp%46#0: bytes = (extract3 tmp%44#0 item_index%45#0 1u) let tmp%47#0: uint64 = (b== player#0 tmp%46#0) goto tmp%47#0 ? block@7 : block@14 - block@7: // if_body_L80 + block@7: // if_body_L82 let item_index%48#0: uint64 = 0u let tmp%49#0: bytes = (extract3 g#0 item_index%48#0 3u) let item_index%50#0: uint64 = 0u let tmp%51#0: bytes = (extract3 tmp%49#0 item_index%50#0 1u) let tmp%52#0: uint64 = (b== tmp%51#0 player#0) goto tmp%52#0 ? block@8 : block@10 - block@8: // and_contd_L82 + block@8: // and_contd_L84 let item_index%53#0: uint64 = 6u let tmp%54#0: bytes = (extract3 g#0 item_index%53#0 3u) let item_index%55#0: uint64 = 2u let tmp%56#0: bytes = (extract3 tmp%54#0 item_index%55#0 1u) let tmp%57#0: uint64 = (b== player#0 tmp%56#0) goto tmp%57#0 ? block@9 : block@10 - block@9: // if_body_L82 + block@9: // if_body_L84 return 1u - block@10: // after_if_else_L82 + block@10: // after_if_else_L84 let item_index%58#0: uint64 = 0u let tmp%59#0: bytes = (extract3 g#0 item_index%58#0 3u) let item_index%60#0: uint64 = 2u let tmp%61#0: bytes = (extract3 tmp%59#0 item_index%60#0 1u) let tmp%62#0: uint64 = (b== tmp%61#0 player#0) goto tmp%62#0 ? block@11 : block@14 - block@11: // and_contd_L84 + block@11: // and_contd_L86 let item_index%63#0: uint64 = 6u let tmp%64#0: bytes = (extract3 g#0 item_index%63#0 3u) let item_index%65#0: uint64 = 0u let tmp%66#0: bytes = (extract3 tmp%64#0 item_index%65#0 1u) let tmp%67#0: uint64 = (b== player#0 tmp%66#0) goto tmp%67#0 ? block@12 : block@14 - block@12: // if_body_L84 + block@12: // if_body_L86 return 1u - block@14: // after_if_else_L80 + block@14: // after_if_else_L82 return 0u subroutine examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() -> bytes: diff --git a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir index e7c8309d38..480f658d84 100644 --- a/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir +++ b/examples/tictactoe/out/TicTacToeContract.ssa.opt_pass_2.ir @@ -112,19 +112,19 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: return subroutine examples.tictactoe.tictactoe.TicTacToeContract.make_move(player: bytes, move.0: uint64, move.1: uint64) -> void: - block@0: // L58 + block@0: // L60 let tmp%0#0: uint64 = (< move.0#0 3u) goto tmp%0#0 ? block@1 : block@3 - block@1: // and_contd_L61 + block@1: // and_contd_L63 let tmp%1#0: uint64 = (< move.1#0 3u) goto tmp%1#0 ? block@2 : block@3 - block@2: // bool_true_L61 + block@2: // bool_true_L63 let and_result%2#0: uint64 = 1u goto block@4 - block@3: // bool_false_L61 + block@3: // bool_false_L63 let and_result%2#1: uint64 = 0u goto block@4 - block@4: // bool_merge_L61 + block@4: // bool_merge_L63 let and_result%2#2: uint64 = φ(and_result%2#0 <- block@2, and_result%2#1 <- block@3) (assert and_result%2#2) // Move must be in range let (game_value%3#0: bytes, game_exists%4#0: uint64) = (app_global_get_ex 0u "game") @@ -151,22 +151,22 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: (app_global_put "turns" new_state_value%34#0) let tmp%35#0: uint64 = examples.tictactoe.tictactoe.TicTacToeContract.did_win(player#0, move.0#0, move.1#0) goto tmp%35#0 ? block@5 : block@6 - block@5: // if_body_L65 + block@5: // if_body_L67 (app_global_put "winner" player#0) goto block@9 - block@6: // else_body_L65 + block@6: // else_body_L67 let (turns_value%36#0: uint64, turns_exists%37#0: uint64) = (app_global_get_ex 0u "turns") (assert turns_exists%37#0) // check turns exists let tmp%38#0: uint64 = (== turns_value%36#0 9u) goto tmp%38#0 ? block@7 : block@9 - block@7: // if_body_L67 + block@7: // if_body_L69 (app_global_put "winner" 0x03) goto block@9 - block@9: // after_if_else_L65 + block@9: // after_if_else_L67 return subroutine examples.tictactoe.tictactoe.TicTacToeContract.did_win(player: bytes, column: uint64, row: uint64) -> uint64: - block@0: // L70 + block@0: // L72 let (g#0: bytes, game_exists%1#0: uint64) = (app_global_get_ex 0u "game") (assert game_exists%1#0) // check game exists let index_is_in_bounds%4#0: uint64 = (< row#0 3u) @@ -177,13 +177,13 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%14#0: bytes = ((extract 1 1) tmp%6#0) let tmp%15#0: uint64 = (b== tmp%8#0 awst_tmp%14#0) goto tmp%15#0 ? block@1 : block@3 - block@1: // and_contd_L74 + block@1: // and_contd_L76 let tmp%21#0: bytes = ((extract 2 1) tmp%6#0) let tmp%22#0: uint64 = (b== awst_tmp%14#0 tmp%21#0) goto tmp%22#0 ? block@2 : block@3 - block@2: // if_body_L74 + block@2: // if_body_L76 return 1u - block@3: // after_if_else_L74 + block@3: // after_if_else_L76 let tmp%24#0: bytes = ((extract 0 3) g#0) let index_is_in_bounds%26#0: uint64 = (< column#0 3u) (assert index_is_in_bounds%26#0) // Index access is out of bounds @@ -192,40 +192,40 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%34#0: bytes = (extract3 tmp%30#0 column#0 1u) let tmp%35#0: uint64 = (b== tmp%28#0 awst_tmp%34#0) goto tmp%35#0 ? block@4 : block@6 - block@4: // and_contd_L77 + block@4: // and_contd_L79 let tmp%37#0: bytes = ((extract 6 3) g#0) let tmp%41#0: bytes = (extract3 tmp%37#0 column#0 1u) let tmp%42#0: uint64 = (b== awst_tmp%34#0 tmp%41#0) goto tmp%42#0 ? block@5 : block@6 - block@5: // if_body_L77 + block@5: // if_body_L79 return 1u - block@6: // after_if_else_L77 + block@6: // after_if_else_L79 let tmp%46#0: bytes = ((extract 1 1) tmp%30#0) let tmp%47#0: uint64 = (b== player#0 tmp%46#0) goto tmp%47#0 ? block@7 : block@14 - block@7: // if_body_L80 + block@7: // if_body_L82 let tmp%51#0: bytes = ((extract 0 1) tmp%24#0) let tmp%52#0: uint64 = (b== tmp%51#0 player#0) goto tmp%52#0 ? block@8 : block@10 - block@8: // and_contd_L82 + block@8: // and_contd_L84 let tmp%54#0: bytes = ((extract 6 3) g#0) let tmp%56#0: bytes = ((extract 2 1) tmp%54#0) let tmp%57#0: uint64 = (b== player#0 tmp%56#0) goto tmp%57#0 ? block@9 : block@10 - block@9: // if_body_L82 + block@9: // if_body_L84 return 1u - block@10: // after_if_else_L82 + block@10: // after_if_else_L84 let tmp%61#0: bytes = ((extract 2 1) tmp%24#0) let tmp%62#0: uint64 = (b== tmp%61#0 player#0) goto tmp%62#0 ? block@11 : block@14 - block@11: // and_contd_L84 + block@11: // and_contd_L86 let tmp%64#0: bytes = ((extract 6 3) g#0) let tmp%66#0: bytes = ((extract 0 1) tmp%64#0) let tmp%67#0: uint64 = (b== player#0 tmp%66#0) goto tmp%67#0 ? block@12 : block@14 - block@12: // if_body_L84 + block@12: // if_body_L86 return 1u - block@14: // after_if_else_L80 + block@14: // after_if_else_L82 return 0u subroutine examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() -> bytes: diff --git a/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir b/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir index f26bd7013e..7883debe63 100644 --- a/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir +++ b/examples/tictactoe/out_O2/TicTacToeContract.destructured.ir @@ -111,19 +111,19 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: return subroutine examples.tictactoe.tictactoe.TicTacToeContract.make_move(player: bytes, move.0: uint64, move.1: uint64) -> void: - block@0: // L58 + block@0: // L60 let tmp%0#0: uint64 = (< move.0#0 3u) goto tmp%0#0 ? block@1 : block@3 - block@1: // and_contd_L61 + block@1: // and_contd_L63 let tmp%1#0: uint64 = (< move.1#0 3u) goto tmp%1#0 ? block@2 : block@3 - block@2: // bool_true_L61 + block@2: // bool_true_L63 let and_result%2#0: uint64 = 1u goto block@4 - block@3: // bool_false_L61 + block@3: // bool_false_L63 let and_result%2#0: uint64 = 0u goto block@4 - block@4: // bool_merge_L61 + block@4: // bool_merge_L63 (assert and_result%2#0) // Move must be in range let (game_value%3#0: bytes, game_exists%4#0: uint64) = (app_global_get_ex 0u "game") (assert game_exists%4#0) // check game exists @@ -149,22 +149,22 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: (app_global_put "turns" new_state_value%34#0) let tmp%35#0: uint64 = examples.tictactoe.tictactoe.TicTacToeContract.did_win(player#0, move.0#0, move.1#0) goto tmp%35#0 ? block@5 : block@6 - block@5: // if_body_L65 + block@5: // if_body_L67 (app_global_put "winner" player#0) goto block@9 - block@6: // else_body_L65 + block@6: // else_body_L67 let (turns_value%36#0: uint64, turns_exists%37#0: uint64) = (app_global_get_ex 0u "turns") (assert turns_exists%37#0) // check turns exists let tmp%38#0: uint64 = (== turns_value%36#0 9u) goto tmp%38#0 ? block@7 : block@9 - block@7: // if_body_L67 + block@7: // if_body_L69 (app_global_put "winner" 0x03) goto block@9 - block@9: // after_if_else_L65 + block@9: // after_if_else_L67 return subroutine examples.tictactoe.tictactoe.TicTacToeContract.did_win(player: bytes, column: uint64, row: uint64) -> uint64: - block@0: // L70 + block@0: // L72 let (g#0: bytes, game_exists%1#0: uint64) = (app_global_get_ex 0u "game") (assert game_exists%1#0) // check game exists let index_is_in_bounds%4#0: uint64 = (< row#0 3u) @@ -175,13 +175,13 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%14#0: bytes = ((extract 1 1) tmp%6#0) let tmp%15#0: uint64 = (b== tmp%8#0 awst_tmp%14#0) goto tmp%15#0 ? block@1 : block@3 - block@1: // and_contd_L74 + block@1: // and_contd_L76 let tmp%21#0: bytes = ((extract 2 1) tmp%6#0) let tmp%22#0: uint64 = (b== awst_tmp%14#0 tmp%21#0) goto tmp%22#0 ? block@2 : block@3 - block@2: // if_body_L74 + block@2: // if_body_L76 return 1u - block@3: // after_if_else_L74 + block@3: // after_if_else_L76 let tmp%24#0: bytes = ((extract 0 3) g#0) let index_is_in_bounds%26#0: uint64 = (< column#0 3u) (assert index_is_in_bounds%26#0) // Index access is out of bounds @@ -190,34 +190,34 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%34#0: bytes = (extract3 tmp%30#0 column#0 1u) let tmp%35#0: uint64 = (b== tmp%28#0 awst_tmp%34#0) goto tmp%35#0 ? block@4 : block@6 - block@4: // and_contd_L77 + block@4: // and_contd_L79 let tmp%37#0: bytes = ((extract 6 3) g#0) let tmp%41#0: bytes = (extract3 tmp%37#0 column#0 1u) let tmp%42#0: uint64 = (b== awst_tmp%34#0 tmp%41#0) goto tmp%42#0 ? block@2 : block@6 - block@6: // after_if_else_L77 + block@6: // after_if_else_L79 let tmp%46#0: bytes = ((extract 1 1) tmp%30#0) let tmp%47#0: uint64 = (b== player#0 tmp%46#0) goto tmp%47#0 ? block@7 : block@14 - block@7: // if_body_L80 + block@7: // if_body_L82 let tmp%51#0: bytes = ((extract 0 1) tmp%24#0) let tmp%52#0: uint64 = (b== tmp%51#0 player#0) goto tmp%52#0 ? block@8 : block@10 - block@8: // and_contd_L82 + block@8: // and_contd_L84 let tmp%54#0: bytes = ((extract 6 3) g#0) let tmp%56#0: bytes = ((extract 2 1) tmp%54#0) let tmp%57#0: uint64 = (b== player#0 tmp%56#0) goto tmp%57#0 ? block@2 : block@10 - block@10: // after_if_else_L82 + block@10: // after_if_else_L84 let tmp%61#0: bytes = ((extract 2 1) tmp%24#0) let tmp%62#0: uint64 = (b== tmp%61#0 player#0) goto tmp%62#0 ? block@11 : block@14 - block@11: // and_contd_L84 + block@11: // and_contd_L86 let tmp%64#0: bytes = ((extract 6 3) g#0) let tmp%66#0: bytes = ((extract 0 1) tmp%64#0) let tmp%67#0: uint64 = (b== player#0 tmp%66#0) goto tmp%67#0 ? block@2 : block@14 - block@14: // after_if_else_L80 + block@14: // after_if_else_L82 return 0u subroutine examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() -> bytes: diff --git a/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal b/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal index 329537ca83..bf42b55827 100644 --- a/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal +++ b/examples/tictactoe/out_unoptimized/TicTacToeContract.approval.teal @@ -299,18 +299,18 @@ join_game: // examples.tictactoe.tictactoe.TicTacToeContract.make_move(player: bytes, move.0: uint64, move.1: uint64) -> void: make_move: - // tictactoe/tictactoe.py:58-59 + // tictactoe/tictactoe.py:60-61 // @subroutine // def make_move(self, player: arc4.UInt8, move: Move) -> None: proto 3 0 - // tictactoe/tictactoe.py:60 + // tictactoe/tictactoe.py:62 // column, row = move frame_dig -2 dup swap frame_dig -1 swap - // tictactoe/tictactoe.py:61 + // tictactoe/tictactoe.py:63 // assert column < 3 and row < 3, "Move must be in range" int 3 < @@ -326,10 +326,10 @@ make_move_bool_false@3: int 0 make_move_bool_merge@4: - // tictactoe/tictactoe.py:61 + // tictactoe/tictactoe.py:63 // assert column < 3 and row < 3, "Move must be in range" assert // Move must be in range - // tictactoe/tictactoe.py:62 + // tictactoe/tictactoe.py:64 // assert self.game[row][column] == EMPTY, "Square is already taken" int 0 byte "game" @@ -366,7 +366,7 @@ make_move_bool_merge@4: byte 0x00 b== assert // Square is already taken - // tictactoe/tictactoe.py:63 + // tictactoe/tictactoe.py:65 // self.game[row][column] = player int 0 byte "game" @@ -415,7 +415,7 @@ make_move_bool_merge@4: byte "game" swap app_global_put - // tictactoe/tictactoe.py:64 + // tictactoe/tictactoe.py:66 // self.turns += 1 int 0 byte "turns" @@ -426,14 +426,14 @@ make_move_bool_merge@4: byte "turns" swap app_global_put - // tictactoe/tictactoe.py:65 + // tictactoe/tictactoe.py:67 // if self.did_win(player, column=column, row=row): frame_dig -3 swap uncover 2 callsub did_win bz make_move_else_body@6 - // tictactoe/tictactoe.py:66 + // tictactoe/tictactoe.py:68 // self.winner.value = player byte "winner" frame_dig -3 @@ -441,7 +441,7 @@ make_move_bool_merge@4: b make_move_after_if_else@9 make_move_else_body@6: - // tictactoe/tictactoe.py:67 + // tictactoe/tictactoe.py:69 // elif self.turns == 9: int 0 byte "turns" @@ -450,7 +450,7 @@ make_move_else_body@6: int 9 == bz make_move_after_if_else@8 - // tictactoe/tictactoe.py:68 + // tictactoe/tictactoe.py:70 // self.winner.value = arc4.UInt8(DRAW) byte "winner" byte 0x03 @@ -464,12 +464,12 @@ make_move_after_if_else@9: // examples.tictactoe.tictactoe.TicTacToeContract.did_win(player: bytes, column: uint64, row: uint64) -> uint64: did_win: - // tictactoe/tictactoe.py:70-71 + // tictactoe/tictactoe.py:72-73 // @subroutine // def did_win(self, player: arc4.UInt8, column: UInt64, row: UInt64) -> bool: proto 3 1 int 0 - // tictactoe/tictactoe.py:72 + // tictactoe/tictactoe.py:74 // g = self.game.copy() int 0 byte "game" @@ -477,7 +477,7 @@ did_win: assert // check game exists dup swap - // tictactoe/tictactoe.py:74 + // tictactoe/tictactoe.py:76 // if g[row][0] == g[row][1] == g[row][2]: int 3 frame_dig -1 @@ -537,14 +537,14 @@ did_win: swap b== bz did_win_after_if_else@3 - // tictactoe/tictactoe.py:75 + // tictactoe/tictactoe.py:77 // return True int 1 frame_bury 0 retsub did_win_after_if_else@3: - // tictactoe/tictactoe.py:77 + // tictactoe/tictactoe.py:79 // if g[0][column] == g[1][column] == g[2][column]: int 0 int 3 @@ -606,14 +606,14 @@ did_win_after_if_else@3: swap b== bz did_win_after_if_else@6 - // tictactoe/tictactoe.py:78 + // tictactoe/tictactoe.py:80 // return True int 1 frame_bury 0 retsub did_win_after_if_else@6: - // tictactoe/tictactoe.py:80-81 + // tictactoe/tictactoe.py:82-83 // # if player owns center, check diagonals // if player == g[1][1]: int 1 @@ -632,7 +632,7 @@ did_win_after_if_else@6: swap b== bz did_win_after_if_else@14 - // tictactoe/tictactoe.py:82 + // tictactoe/tictactoe.py:84 // if g[0][0] == player == g[2][2]: int 0 int 3 @@ -665,14 +665,14 @@ did_win_after_if_else@6: swap b== bz did_win_after_if_else@10 - // tictactoe/tictactoe.py:83 + // tictactoe/tictactoe.py:85 // return True int 1 frame_bury 0 retsub did_win_after_if_else@10: - // tictactoe/tictactoe.py:84 + // tictactoe/tictactoe.py:86 // if g[0][2] == player == g[2][0]: int 0 int 3 @@ -705,7 +705,7 @@ did_win_after_if_else@10: swap b== bz did_win_after_if_else@13 - // tictactoe/tictactoe.py:85 + // tictactoe/tictactoe.py:87 // return True int 1 frame_bury 0 @@ -714,7 +714,7 @@ did_win_after_if_else@10: did_win_after_if_else@13: did_win_after_if_else@14: - // tictactoe/tictactoe.py:86 + // tictactoe/tictactoe.py:88 // return False int 0 frame_bury 0 @@ -790,11 +790,19 @@ play: play_else_body@2: // tictactoe/tictactoe.py:54 - // assert Txn.sender == self.challenger.get(Account()), "It is the challenger's turn" + // assert Txn.sender == self.challenger.get( txn Sender + // tictactoe/tictactoe.py:55 + // default=Account() global ZeroAddress + // tictactoe/tictactoe.py:54 + // assert Txn.sender == self.challenger.get( int 0 byte "challenger" + // tictactoe/tictactoe.py:54-56 + // assert Txn.sender == self.challenger.get( + // default=Account() + // ), "It is the challenger's turn" app_global_get_ex swap uncover 2 @@ -803,12 +811,12 @@ play_else_body@2: select == assert // It is the challenger's turn - // tictactoe/tictactoe.py:55 + // tictactoe/tictactoe.py:57 // player = arc4.UInt8(CHALLENGER) byte 0x02 play_after_if_else@3: - // tictactoe/tictactoe.py:56 + // tictactoe/tictactoe.py:58 // self.make_move(player, move) frame_dig -2 frame_dig -1 diff --git a/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir b/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir index add17d3735..8bdd117213 100644 --- a/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir +++ b/examples/tictactoe/out_unoptimized/TicTacToeContract.destructured.ir @@ -133,21 +133,21 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: return subroutine examples.tictactoe.tictactoe.TicTacToeContract.make_move(player: bytes, move.0: uint64, move.1: uint64) -> void: - block@0: // L58 + block@0: // L60 let column#0: uint64 = move.0#0 let row#0: uint64 = move.1#0 let tmp%0#0: uint64 = (< column#0 3u) goto tmp%0#0 ? block@1 : block@3 - block@1: // and_contd_L61 + block@1: // and_contd_L63 let tmp%1#0: uint64 = (< row#0 3u) goto tmp%1#0 ? block@2 : block@3 - block@2: // bool_true_L61 + block@2: // bool_true_L63 let and_result%2#0: uint64 = 1u goto block@4 - block@3: // bool_false_L61 + block@3: // bool_false_L63 let and_result%2#0: uint64 = 0u goto block@4 - block@4: // bool_merge_L61 + block@4: // bool_merge_L63 (assert and_result%2#0) // Move must be in range let (game_value%3#0: bytes, game_exists%4#0: uint64) = (app_global_get_ex 0u "game") (assert game_exists%4#0) // check game exists @@ -191,24 +191,24 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: (app_global_put "turns" new_state_value%34#0) let tmp%35#0: uint64 = examples.tictactoe.tictactoe.TicTacToeContract.did_win(player#0, column#0, row#0) goto tmp%35#0 ? block@5 : block@6 - block@5: // if_body_L65 + block@5: // if_body_L67 (app_global_put "winner" player#0) goto block@9 - block@6: // else_body_L65 + block@6: // else_body_L67 let (turns_value%36#0: uint64, turns_exists%37#0: uint64) = (app_global_get_ex 0u "turns") (assert turns_exists%37#0) // check turns exists let tmp%38#0: uint64 = (== turns_value%36#0 9u) goto tmp%38#0 ? block@7 : block@8 - block@7: // if_body_L67 + block@7: // if_body_L69 (app_global_put "winner" 0x03) goto block@8 - block@8: // after_if_else_L67 + block@8: // after_if_else_L69 goto block@9 - block@9: // after_if_else_L65 + block@9: // after_if_else_L67 return subroutine examples.tictactoe.tictactoe.TicTacToeContract.did_win(player: bytes, column: uint64, row: uint64) -> uint64: - block@0: // L70 + block@0: // L72 let (game_value%0#0: bytes, game_exists%1#0: uint64) = (app_global_get_ex 0u "game") (assert game_exists%1#0) // check game exists let copy%2#0: bytes = game_value%0#0 @@ -229,7 +229,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%14#0: bytes = (extract3 tmp%12#0 item_index%13#0 1u) let tmp%15#0: uint64 = (b== tmp%8#0 awst_tmp%14#0) goto tmp%15#0 ? block@1 : block@3 - block@1: // and_contd_L74 + block@1: // and_contd_L76 let array_length%16#0: uint64 = 3u let index_is_in_bounds%17#0: uint64 = (< row#0 array_length%16#0) (assert index_is_in_bounds%17#0) // Index access is out of bounds @@ -239,9 +239,9 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let tmp%21#0: bytes = (extract3 tmp%19#0 item_index%20#0 1u) let tmp%22#0: uint64 = (b== awst_tmp%14#0 tmp%21#0) goto tmp%22#0 ? block@2 : block@3 - block@2: // if_body_L74 + block@2: // if_body_L76 return 1u - block@3: // after_if_else_L74 + block@3: // after_if_else_L76 let item_index%23#0: uint64 = (* 0u 3u) let tmp%24#0: bytes = (extract3 g#0 item_index%23#0 3u) let array_length%25#0: uint64 = 3u @@ -258,7 +258,7 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let awst_tmp%34#0: bytes = (extract3 tmp%30#0 item_index%33#0 1u) let tmp%35#0: uint64 = (b== tmp%28#0 awst_tmp%34#0) goto tmp%35#0 ? block@4 : block@6 - block@4: // and_contd_L77 + block@4: // and_contd_L79 let item_index%36#0: uint64 = (* 2u 3u) let tmp%37#0: bytes = (extract3 g#0 item_index%36#0 3u) let array_length%38#0: uint64 = 3u @@ -268,50 +268,50 @@ contract examples.tictactoe.tictactoe.TicTacToeContract: let tmp%41#0: bytes = (extract3 tmp%37#0 item_index%40#0 1u) let tmp%42#0: uint64 = (b== awst_tmp%34#0 tmp%41#0) goto tmp%42#0 ? block@5 : block@6 - block@5: // if_body_L77 + block@5: // if_body_L79 return 1u - block@6: // after_if_else_L77 + block@6: // after_if_else_L79 let item_index%43#0: uint64 = (* 1u 3u) let tmp%44#0: bytes = (extract3 g#0 item_index%43#0 3u) let item_index%45#0: uint64 = (* 1u 1u) let tmp%46#0: bytes = (extract3 tmp%44#0 item_index%45#0 1u) let tmp%47#0: uint64 = (b== player#0 tmp%46#0) goto tmp%47#0 ? block@7 : block@14 - block@7: // if_body_L80 + block@7: // if_body_L82 let item_index%48#0: uint64 = (* 0u 3u) let tmp%49#0: bytes = (extract3 g#0 item_index%48#0 3u) let item_index%50#0: uint64 = (* 0u 1u) let tmp%51#0: bytes = (extract3 tmp%49#0 item_index%50#0 1u) let tmp%52#0: uint64 = (b== tmp%51#0 player#0) goto tmp%52#0 ? block@8 : block@10 - block@8: // and_contd_L82 + block@8: // and_contd_L84 let item_index%53#0: uint64 = (* 2u 3u) let tmp%54#0: bytes = (extract3 g#0 item_index%53#0 3u) let item_index%55#0: uint64 = (* 2u 1u) let tmp%56#0: bytes = (extract3 tmp%54#0 item_index%55#0 1u) let tmp%57#0: uint64 = (b== player#0 tmp%56#0) goto tmp%57#0 ? block@9 : block@10 - block@9: // if_body_L82 + block@9: // if_body_L84 return 1u - block@10: // after_if_else_L82 + block@10: // after_if_else_L84 let item_index%58#0: uint64 = (* 0u 3u) let tmp%59#0: bytes = (extract3 g#0 item_index%58#0 3u) let item_index%60#0: uint64 = (* 2u 1u) let tmp%61#0: bytes = (extract3 tmp%59#0 item_index%60#0 1u) let tmp%62#0: uint64 = (b== tmp%61#0 player#0) goto tmp%62#0 ? block@11 : block@13 - block@11: // and_contd_L84 + block@11: // and_contd_L86 let item_index%63#0: uint64 = (* 2u 3u) let tmp%64#0: bytes = (extract3 g#0 item_index%63#0 3u) let item_index%65#0: uint64 = (* 0u 1u) let tmp%66#0: bytes = (extract3 tmp%64#0 item_index%65#0 1u) let tmp%67#0: uint64 = (b== player#0 tmp%66#0) goto tmp%67#0 ? block@12 : block@13 - block@12: // if_body_L84 + block@12: // if_body_L86 return 1u - block@13: // after_if_else_L84 + block@13: // after_if_else_L86 goto block@14 - block@14: // after_if_else_L80 + block@14: // after_if_else_L82 return 0u subroutine examples.tictactoe.tictactoe.TicTacToeContract.whose_turn() -> bytes: diff --git a/examples/tictactoe/puya.log b/examples/tictactoe/puya.log index c091ed9ee3..ea4c50f52d 100644 --- a/examples/tictactoe/puya.log +++ b/examples/tictactoe/puya.log @@ -358,143 +358,143 @@ debug: Replaced trivial Phi node: let column#1: uint64 = φ(column#0 <- block@6, debug: Terminated block@8: // bool_merge_L33 debug: Sealing block@0: // L37 debug: Terminated block@0: // L37 -debug: Sealing block@0: // L58 -debug: Terminated block@0: // L58 -debug: Sealing block@None: // and_contd_L61 -debug: Terminated block@1: // and_contd_L61 -debug: Sealing block@None: // bool_true_L61 -debug: Sealing block@None: // bool_false_L61 -debug: Terminated block@2: // bool_true_L61 -debug: Terminated block@3: // bool_false_L61 -debug: Sealing block@4: // bool_merge_L61 -debug: Created Phi assignment: let and_result%2#2: uint64 = undefined while trying to resolve 'and_result%2' in block@4: // bool_merge_L61 -debug: Added and_result%2#0 to Phi node: let and_result%2#2: uint64 = φ(and_result%2#0 <- block@2) in block@2: // bool_true_L61 -debug: Added and_result%2#1 to Phi node: let and_result%2#2: uint64 = φ(and_result%2#0 <- block@2, and_result%2#1 <- block@3) in block@3: // bool_false_L61 -debug: Created Phi assignment: let column#1: uint64 = undefined while trying to resolve 'column' in block@4: // bool_merge_L61 -debug: Added column#0 to Phi node: let column#1: uint64 = φ(column#0 <- block@2) in block@2: // bool_true_L61 -debug: Created Phi assignment: let column#2: uint64 = undefined while trying to resolve 'column' in block@3: // bool_false_L61 -debug: Added column#0 to Phi node: let column#2: uint64 = φ(column#0 <- block@0) in block@0: // L58 -debug: Added column#0 to Phi node: let column#2: uint64 = φ(column#0 <- block@0, column#0 <- block@1) in block@1: // and_contd_L61 +debug: Sealing block@0: // L60 +debug: Terminated block@0: // L60 +debug: Sealing block@None: // and_contd_L63 +debug: Terminated block@1: // and_contd_L63 +debug: Sealing block@None: // bool_true_L63 +debug: Sealing block@None: // bool_false_L63 +debug: Terminated block@2: // bool_true_L63 +debug: Terminated block@3: // bool_false_L63 +debug: Sealing block@4: // bool_merge_L63 +debug: Created Phi assignment: let and_result%2#2: uint64 = undefined while trying to resolve 'and_result%2' in block@4: // bool_merge_L63 +debug: Added and_result%2#0 to Phi node: let and_result%2#2: uint64 = φ(and_result%2#0 <- block@2) in block@2: // bool_true_L63 +debug: Added and_result%2#1 to Phi node: let and_result%2#2: uint64 = φ(and_result%2#0 <- block@2, and_result%2#1 <- block@3) in block@3: // bool_false_L63 +debug: Created Phi assignment: let column#1: uint64 = undefined while trying to resolve 'column' in block@4: // bool_merge_L63 +debug: Added column#0 to Phi node: let column#1: uint64 = φ(column#0 <- block@2) in block@2: // bool_true_L63 +debug: Created Phi assignment: let column#2: uint64 = undefined while trying to resolve 'column' in block@3: // bool_false_L63 +debug: Added column#0 to Phi node: let column#2: uint64 = φ(column#0 <- block@0) in block@0: // L60 +debug: Added column#0 to Phi node: let column#2: uint64 = φ(column#0 <- block@0, column#0 <- block@1) in block@1: // and_contd_L63 debug: Replacing trivial Phi node: let column#2: uint64 = φ(column#0 <- block@0, column#0 <- block@1) (column#2) with column#0 debug: Deleting Phi assignment: let column#2: uint64 = φ(column#0 <- block@0, column#0 <- block@1) debug: Replaced trivial Phi node: let column#2: uint64 = φ(column#0 <- block@0, column#0 <- block@1) (column#2) with column#0 in current definition for 1 blocks -debug: Added column#0 to Phi node: let column#1: uint64 = φ(column#0 <- block@2, column#0 <- block@3) in block@3: // bool_false_L61 +debug: Added column#0 to Phi node: let column#1: uint64 = φ(column#0 <- block@2, column#0 <- block@3) in block@3: // bool_false_L63 debug: Replacing trivial Phi node: let column#1: uint64 = φ(column#0 <- block@2, column#0 <- block@3) (column#1) with column#0 debug: Deleting Phi assignment: let column#1: uint64 = φ(column#0 <- block@2, column#0 <- block@3) debug: Replaced trivial Phi node: let column#1: uint64 = φ(column#0 <- block@2, column#0 <- block@3) (column#1) with column#0 in current definition for 1 blocks -debug: Created Phi assignment: let row#1: uint64 = undefined while trying to resolve 'row' in block@4: // bool_merge_L61 -debug: Added row#0 to Phi node: let row#1: uint64 = φ(row#0 <- block@2) in block@2: // bool_true_L61 -debug: Created Phi assignment: let row#2: uint64 = undefined while trying to resolve 'row' in block@3: // bool_false_L61 -debug: Added row#0 to Phi node: let row#2: uint64 = φ(row#0 <- block@0) in block@0: // L58 -debug: Added row#0 to Phi node: let row#2: uint64 = φ(row#0 <- block@0, row#0 <- block@1) in block@1: // and_contd_L61 +debug: Created Phi assignment: let row#1: uint64 = undefined while trying to resolve 'row' in block@4: // bool_merge_L63 +debug: Added row#0 to Phi node: let row#1: uint64 = φ(row#0 <- block@2) in block@2: // bool_true_L63 +debug: Created Phi assignment: let row#2: uint64 = undefined while trying to resolve 'row' in block@3: // bool_false_L63 +debug: Added row#0 to Phi node: let row#2: uint64 = φ(row#0 <- block@0) in block@0: // L60 +debug: Added row#0 to Phi node: let row#2: uint64 = φ(row#0 <- block@0, row#0 <- block@1) in block@1: // and_contd_L63 debug: Replacing trivial Phi node: let row#2: uint64 = φ(row#0 <- block@0, row#0 <- block@1) (row#2) with row#0 debug: Deleting Phi assignment: let row#2: uint64 = φ(row#0 <- block@0, row#0 <- block@1) debug: Replaced trivial Phi node: let row#2: uint64 = φ(row#0 <- block@0, row#0 <- block@1) (row#2) with row#0 in current definition for 1 blocks -debug: Added row#0 to Phi node: let row#1: uint64 = φ(row#0 <- block@2, row#0 <- block@3) in block@3: // bool_false_L61 +debug: Added row#0 to Phi node: let row#1: uint64 = φ(row#0 <- block@2, row#0 <- block@3) in block@3: // bool_false_L63 debug: Replacing trivial Phi node: let row#1: uint64 = φ(row#0 <- block@2, row#0 <- block@3) (row#1) with row#0 debug: Deleting Phi assignment: let row#1: uint64 = φ(row#0 <- block@2, row#0 <- block@3) debug: Replaced trivial Phi node: let row#1: uint64 = φ(row#0 <- block@2, row#0 <- block@3) (row#1) with row#0 in current definition for 1 blocks -debug: Created Phi assignment: let player#1: bytes = undefined while trying to resolve 'player' in block@4: // bool_merge_L61 -debug: Added player#0 to Phi node: let player#1: bytes = φ(player#0 <- block@2) in block@2: // bool_true_L61 -debug: Created Phi assignment: let player#2: bytes = undefined while trying to resolve 'player' in block@3: // bool_false_L61 -debug: Added player#0 to Phi node: let player#2: bytes = φ(player#0 <- block@0) in block@0: // L58 -debug: Added player#0 to Phi node: let player#2: bytes = φ(player#0 <- block@0, player#0 <- block@1) in block@1: // and_contd_L61 +debug: Created Phi assignment: let player#1: bytes = undefined while trying to resolve 'player' in block@4: // bool_merge_L63 +debug: Added player#0 to Phi node: let player#1: bytes = φ(player#0 <- block@2) in block@2: // bool_true_L63 +debug: Created Phi assignment: let player#2: bytes = undefined while trying to resolve 'player' in block@3: // bool_false_L63 +debug: Added player#0 to Phi node: let player#2: bytes = φ(player#0 <- block@0) in block@0: // L60 +debug: Added player#0 to Phi node: let player#2: bytes = φ(player#0 <- block@0, player#0 <- block@1) in block@1: // and_contd_L63 debug: Replacing trivial Phi node: let player#2: bytes = φ(player#0 <- block@0, player#0 <- block@1) (player#2) with player#0 debug: Deleting Phi assignment: let player#2: bytes = φ(player#0 <- block@0, player#0 <- block@1) debug: Replaced trivial Phi node: let player#2: bytes = φ(player#0 <- block@0, player#0 <- block@1) (player#2) with player#0 in current definition for 1 blocks -debug: Added player#0 to Phi node: let player#1: bytes = φ(player#0 <- block@2, player#0 <- block@3) in block@3: // bool_false_L61 +debug: Added player#0 to Phi node: let player#1: bytes = φ(player#0 <- block@2, player#0 <- block@3) in block@3: // bool_false_L63 debug: Replacing trivial Phi node: let player#1: bytes = φ(player#0 <- block@2, player#0 <- block@3) (player#1) with player#0 debug: Deleting Phi assignment: let player#1: bytes = φ(player#0 <- block@2, player#0 <- block@3) debug: Replaced trivial Phi node: let player#1: bytes = φ(player#0 <- block@2, player#0 <- block@3) (player#1) with player#0 in current definition for 1 blocks -debug: Terminated block@4: // bool_merge_L61 -debug: Sealing block@None: // if_body_L65 -debug: Sealing block@None: // else_body_L65 -debug: Terminated block@5: // if_body_L65 -debug: Terminated block@6: // else_body_L65 +debug: Terminated block@4: // bool_merge_L63 debug: Sealing block@None: // if_body_L67 debug: Sealing block@None: // else_body_L67 -debug: Terminated block@7: // if_body_L67 -debug: Sealing block@8: // after_if_else_L67 -debug: Terminated block@8: // after_if_else_L67 -debug: Sealing block@9: // after_if_else_L65 -debug: Terminated block@9: // after_if_else_L65 -debug: Sealing block@0: // L70 -debug: Terminated block@0: // L70 -debug: Sealing block@None: // and_contd_L74 -debug: Terminated block@1: // and_contd_L74 -debug: Sealing block@None: // if_body_L74 -debug: Sealing block@None: // else_body_L74 -debug: Terminated block@2: // if_body_L74 -debug: Sealing block@3: // after_if_else_L74 -debug: Created Phi assignment: let column#1: uint64 = undefined while trying to resolve 'column' in block@3: // after_if_else_L74 -debug: Added column#0 to Phi node: let column#1: uint64 = φ(column#0 <- block@0) in block@0: // L70 -debug: Added column#0 to Phi node: let column#1: uint64 = φ(column#0 <- block@0, column#0 <- block@1) in block@1: // and_contd_L74 +debug: Terminated block@5: // if_body_L67 +debug: Terminated block@6: // else_body_L67 +debug: Sealing block@None: // if_body_L69 +debug: Sealing block@None: // else_body_L69 +debug: Terminated block@7: // if_body_L69 +debug: Sealing block@8: // after_if_else_L69 +debug: Terminated block@8: // after_if_else_L69 +debug: Sealing block@9: // after_if_else_L67 +debug: Terminated block@9: // after_if_else_L67 +debug: Sealing block@0: // L72 +debug: Terminated block@0: // L72 +debug: Sealing block@None: // and_contd_L76 +debug: Terminated block@1: // and_contd_L76 +debug: Sealing block@None: // if_body_L76 +debug: Sealing block@None: // else_body_L76 +debug: Terminated block@2: // if_body_L76 +debug: Sealing block@3: // after_if_else_L76 +debug: Created Phi assignment: let column#1: uint64 = undefined while trying to resolve 'column' in block@3: // after_if_else_L76 +debug: Added column#0 to Phi node: let column#1: uint64 = φ(column#0 <- block@0) in block@0: // L72 +debug: Added column#0 to Phi node: let column#1: uint64 = φ(column#0 <- block@0, column#0 <- block@1) in block@1: // and_contd_L76 debug: Replacing trivial Phi node: let column#1: uint64 = φ(column#0 <- block@0, column#0 <- block@1) (column#1) with column#0 debug: Deleting Phi assignment: let column#1: uint64 = φ(column#0 <- block@0, column#0 <- block@1) debug: Replaced trivial Phi node: let column#1: uint64 = φ(column#0 <- block@0, column#0 <- block@1) (column#1) with column#0 in current definition for 1 blocks -debug: Created Phi assignment: let g#1: bytes = undefined while trying to resolve 'g' in block@3: // after_if_else_L74 -debug: Added g#0 to Phi node: let g#1: bytes = φ(g#0 <- block@0) in block@0: // L70 -debug: Added g#0 to Phi node: let g#1: bytes = φ(g#0 <- block@0, g#0 <- block@1) in block@1: // and_contd_L74 +debug: Created Phi assignment: let g#1: bytes = undefined while trying to resolve 'g' in block@3: // after_if_else_L76 +debug: Added g#0 to Phi node: let g#1: bytes = φ(g#0 <- block@0) in block@0: // L72 +debug: Added g#0 to Phi node: let g#1: bytes = φ(g#0 <- block@0, g#0 <- block@1) in block@1: // and_contd_L76 debug: Replacing trivial Phi node: let g#1: bytes = φ(g#0 <- block@0, g#0 <- block@1) (g#1) with g#0 debug: Deleting Phi assignment: let g#1: bytes = φ(g#0 <- block@0, g#0 <- block@1) debug: Replaced trivial Phi node: let g#1: bytes = φ(g#0 <- block@0, g#0 <- block@1) (g#1) with g#0 in current definition for 1 blocks -debug: Terminated block@3: // after_if_else_L74 -debug: Sealing block@None: // and_contd_L77 -debug: Terminated block@4: // and_contd_L77 -debug: Sealing block@None: // if_body_L77 -debug: Sealing block@None: // else_body_L77 -debug: Terminated block@5: // if_body_L77 -debug: Sealing block@6: // after_if_else_L77 -debug: Created Phi assignment: let player#1: bytes = undefined while trying to resolve 'player' in block@6: // after_if_else_L77 -debug: Created Phi assignment: let player#2: bytes = undefined while trying to resolve 'player' in block@3: // after_if_else_L74 -debug: Added player#0 to Phi node: let player#2: bytes = φ(player#0 <- block@0) in block@0: // L70 -debug: Added player#0 to Phi node: let player#2: bytes = φ(player#0 <- block@0, player#0 <- block@1) in block@1: // and_contd_L74 +debug: Terminated block@3: // after_if_else_L76 +debug: Sealing block@None: // and_contd_L79 +debug: Terminated block@4: // and_contd_L79 +debug: Sealing block@None: // if_body_L79 +debug: Sealing block@None: // else_body_L79 +debug: Terminated block@5: // if_body_L79 +debug: Sealing block@6: // after_if_else_L79 +debug: Created Phi assignment: let player#1: bytes = undefined while trying to resolve 'player' in block@6: // after_if_else_L79 +debug: Created Phi assignment: let player#2: bytes = undefined while trying to resolve 'player' in block@3: // after_if_else_L76 +debug: Added player#0 to Phi node: let player#2: bytes = φ(player#0 <- block@0) in block@0: // L72 +debug: Added player#0 to Phi node: let player#2: bytes = φ(player#0 <- block@0, player#0 <- block@1) in block@1: // and_contd_L76 debug: Replacing trivial Phi node: let player#2: bytes = φ(player#0 <- block@0, player#0 <- block@1) (player#2) with player#0 debug: Deleting Phi assignment: let player#2: bytes = φ(player#0 <- block@0, player#0 <- block@1) debug: Replaced trivial Phi node: let player#2: bytes = φ(player#0 <- block@0, player#0 <- block@1) (player#2) with player#0 in current definition for 1 blocks -debug: Added player#0 to Phi node: let player#1: bytes = φ(player#0 <- block@3) in block@3: // after_if_else_L74 -debug: Added player#0 to Phi node: let player#1: bytes = φ(player#0 <- block@3, player#0 <- block@4) in block@4: // and_contd_L77 +debug: Added player#0 to Phi node: let player#1: bytes = φ(player#0 <- block@3) in block@3: // after_if_else_L76 +debug: Added player#0 to Phi node: let player#1: bytes = φ(player#0 <- block@3, player#0 <- block@4) in block@4: // and_contd_L79 debug: Replacing trivial Phi node: let player#1: bytes = φ(player#0 <- block@3, player#0 <- block@4) (player#1) with player#0 debug: Deleting Phi assignment: let player#1: bytes = φ(player#0 <- block@3, player#0 <- block@4) debug: Replaced trivial Phi node: let player#1: bytes = φ(player#0 <- block@3, player#0 <- block@4) (player#1) with player#0 in current definition for 1 blocks -debug: Created Phi assignment: let g#2: bytes = undefined while trying to resolve 'g' in block@6: // after_if_else_L77 -debug: Added g#0 to Phi node: let g#2: bytes = φ(g#0 <- block@3) in block@3: // after_if_else_L74 -debug: Added g#0 to Phi node: let g#2: bytes = φ(g#0 <- block@3, g#0 <- block@4) in block@4: // and_contd_L77 +debug: Created Phi assignment: let g#2: bytes = undefined while trying to resolve 'g' in block@6: // after_if_else_L79 +debug: Added g#0 to Phi node: let g#2: bytes = φ(g#0 <- block@3) in block@3: // after_if_else_L76 +debug: Added g#0 to Phi node: let g#2: bytes = φ(g#0 <- block@3, g#0 <- block@4) in block@4: // and_contd_L79 debug: Replacing trivial Phi node: let g#2: bytes = φ(g#0 <- block@3, g#0 <- block@4) (g#2) with g#0 debug: Deleting Phi assignment: let g#2: bytes = φ(g#0 <- block@3, g#0 <- block@4) debug: Replaced trivial Phi node: let g#2: bytes = φ(g#0 <- block@3, g#0 <- block@4) (g#2) with g#0 in current definition for 1 blocks -debug: Terminated block@6: // after_if_else_L77 -debug: Sealing block@None: // if_body_L80 -debug: Sealing block@None: // else_body_L80 -debug: Terminated block@7: // if_body_L80 -debug: Sealing block@None: // and_contd_L82 -debug: Terminated block@8: // and_contd_L82 +debug: Terminated block@6: // after_if_else_L79 debug: Sealing block@None: // if_body_L82 debug: Sealing block@None: // else_body_L82 -debug: Terminated block@9: // if_body_L82 -debug: Sealing block@10: // after_if_else_L82 -debug: Created Phi assignment: let g#3: bytes = undefined while trying to resolve 'g' in block@10: // after_if_else_L82 -debug: Added g#0 to Phi node: let g#3: bytes = φ(g#0 <- block@7) in block@7: // if_body_L80 -debug: Added g#0 to Phi node: let g#3: bytes = φ(g#0 <- block@7, g#0 <- block@8) in block@8: // and_contd_L82 +debug: Terminated block@7: // if_body_L82 +debug: Sealing block@None: // and_contd_L84 +debug: Terminated block@8: // and_contd_L84 +debug: Sealing block@None: // if_body_L84 +debug: Sealing block@None: // else_body_L84 +debug: Terminated block@9: // if_body_L84 +debug: Sealing block@10: // after_if_else_L84 +debug: Created Phi assignment: let g#3: bytes = undefined while trying to resolve 'g' in block@10: // after_if_else_L84 +debug: Added g#0 to Phi node: let g#3: bytes = φ(g#0 <- block@7) in block@7: // if_body_L82 +debug: Added g#0 to Phi node: let g#3: bytes = φ(g#0 <- block@7, g#0 <- block@8) in block@8: // and_contd_L84 debug: Replacing trivial Phi node: let g#3: bytes = φ(g#0 <- block@7, g#0 <- block@8) (g#3) with g#0 debug: Deleting Phi assignment: let g#3: bytes = φ(g#0 <- block@7, g#0 <- block@8) debug: Replaced trivial Phi node: let g#3: bytes = φ(g#0 <- block@7, g#0 <- block@8) (g#3) with g#0 in current definition for 1 blocks -debug: Created Phi assignment: let player#3: bytes = undefined while trying to resolve 'player' in block@10: // after_if_else_L82 -debug: Added player#0 to Phi node: let player#3: bytes = φ(player#0 <- block@7) in block@7: // if_body_L80 -debug: Added player#0 to Phi node: let player#3: bytes = φ(player#0 <- block@7, player#0 <- block@8) in block@8: // and_contd_L82 +debug: Created Phi assignment: let player#3: bytes = undefined while trying to resolve 'player' in block@10: // after_if_else_L84 +debug: Added player#0 to Phi node: let player#3: bytes = φ(player#0 <- block@7) in block@7: // if_body_L82 +debug: Added player#0 to Phi node: let player#3: bytes = φ(player#0 <- block@7, player#0 <- block@8) in block@8: // and_contd_L84 debug: Replacing trivial Phi node: let player#3: bytes = φ(player#0 <- block@7, player#0 <- block@8) (player#3) with player#0 debug: Deleting Phi assignment: let player#3: bytes = φ(player#0 <- block@7, player#0 <- block@8) debug: Replaced trivial Phi node: let player#3: bytes = φ(player#0 <- block@7, player#0 <- block@8) (player#3) with player#0 in current definition for 1 blocks -debug: Terminated block@10: // after_if_else_L82 -debug: Sealing block@None: // and_contd_L84 -debug: Terminated block@11: // and_contd_L84 -debug: Sealing block@None: // if_body_L84 -debug: Sealing block@None: // else_body_L84 -debug: Terminated block@12: // if_body_L84 -debug: Sealing block@13: // after_if_else_L84 -debug: Terminated block@13: // after_if_else_L84 -debug: Sealing block@14: // after_if_else_L80 -debug: Terminated block@14: // after_if_else_L80 +debug: Terminated block@10: // after_if_else_L84 +debug: Sealing block@None: // and_contd_L86 +debug: Terminated block@11: // and_contd_L86 +debug: Sealing block@None: // if_body_L86 +debug: Sealing block@None: // else_body_L86 +debug: Terminated block@12: // if_body_L86 +debug: Sealing block@13: // after_if_else_L86 +debug: Terminated block@13: // after_if_else_L86 +debug: Sealing block@14: // after_if_else_L82 +debug: Terminated block@14: // after_if_else_L82 debug: Sealing block@0: // L43 debug: Terminated block@0: // L43 debug: Sealing block@None: // ternary_true_L45 @@ -657,15 +657,15 @@ debug: Removing unused variable array_length%28#0 debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks -debug: Removed empty block: block@8: // after_if_else_L67 +debug: Removed empty block: block@8: // after_if_else_L69 debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Replacing redundant declaration let index_is_in_bounds%17#0: uint64 = (< move.1#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%6', version=0, source_location=tictactoe/tictactoe.py:62:15-29)] -debug: Replacing redundant declaration let item_index%18#0: uint64 = (* move.1#0 3u) with copy of existing registers [Register(atype=uint64, name='item_index%7', version=0, source_location=tictactoe/tictactoe.py:62:15-29)] -debug: Replacing redundant declaration let index_is_in_bounds%22#0: uint64 = (< move.0#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%10', version=0, source_location=tictactoe/tictactoe.py:62:15-37)] -debug: Replacing redundant declaration let index_is_in_bounds%29#0: uint64 = (< move.1#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%6', version=0, source_location=tictactoe/tictactoe.py:62:15-29)] -debug: Replacing redundant declaration let write_offset%30#0: uint64 = (* move.1#0 3u) with copy of existing registers [Register(atype=uint64, name='item_index%7', version=0, source_location=tictactoe/tictactoe.py:62:15-29)] -debug: Replacing redundant declaration let index_is_in_bounds%10#0: uint64 = (< move.0#0 3u) with copy of existing registers [Register(atype=uint64, name='tmp%0', version=0, source_location=tictactoe/tictactoe.py:61:15)] +debug: Replacing redundant declaration let index_is_in_bounds%17#0: uint64 = (< move.1#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%6', version=0, source_location=tictactoe/tictactoe.py:64:15-29)] +debug: Replacing redundant declaration let item_index%18#0: uint64 = (* move.1#0 3u) with copy of existing registers [Register(atype=uint64, name='item_index%7', version=0, source_location=tictactoe/tictactoe.py:64:15-29)] +debug: Replacing redundant declaration let index_is_in_bounds%22#0: uint64 = (< move.0#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%10', version=0, source_location=tictactoe/tictactoe.py:64:15-37)] +debug: Replacing redundant declaration let index_is_in_bounds%29#0: uint64 = (< move.1#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%6', version=0, source_location=tictactoe/tictactoe.py:64:15-29)] +debug: Replacing redundant declaration let write_offset%30#0: uint64 = (* move.1#0 3u) with copy of existing registers [Register(atype=uint64, name='item_index%7', version=0, source_location=tictactoe/tictactoe.py:64:15-29)] +debug: Replacing redundant declaration let index_is_in_bounds%10#0: uint64 = (< move.0#0 3u) with copy of existing registers [Register(atype=uint64, name='tmp%0', version=0, source_location=tictactoe/tictactoe.py:63:15)] debug: Found equivalence set: tmp%0#0, index_is_in_bounds%10#0, index_is_in_bounds%22#0 debug: Replacing {index_is_in_bounds%10#0, index_is_in_bounds%22#0} with tmp%0#0 made 2 modifications debug: Found equivalence set: move.0#0, item_index%11#0, write_offset%23#0 @@ -713,15 +713,15 @@ debug: Removing unused variable array_length%38#0 debug: Optimizer: Simplify Control Ops debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks -debug: Removed empty block: block@13: // after_if_else_L84 +debug: Removed empty block: block@13: // after_if_else_L86 debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Replacing redundant declaration let index_is_in_bounds%10#0: uint64 = (< row#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%4', version=0, source_location=tictactoe/tictactoe.py:74:11-17)] -debug: Replacing redundant declaration let item_index%11#0: uint64 = (* row#0 3u) with copy of existing registers [Register(atype=uint64, name='item_index%5', version=0, source_location=tictactoe/tictactoe.py:74:11-17)] -debug: Replacing redundant declaration let index_is_in_bounds%32#0: uint64 = (< column#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%26', version=0, source_location=tictactoe/tictactoe.py:77:11-23)] -debug: Replacing redundant declaration let index_is_in_bounds%17#0: uint64 = (< row#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%4', version=0, source_location=tictactoe/tictactoe.py:74:11-17)] -debug: Replacing redundant declaration let item_index%18#0: uint64 = (* row#0 3u) with copy of existing registers [Register(atype=uint64, name='item_index%5', version=0, source_location=tictactoe/tictactoe.py:74:11-17)] -debug: Replacing redundant declaration let index_is_in_bounds%39#0: uint64 = (< column#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%26', version=0, source_location=tictactoe/tictactoe.py:77:11-23)] +debug: Replacing redundant declaration let index_is_in_bounds%10#0: uint64 = (< row#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%4', version=0, source_location=tictactoe/tictactoe.py:76:11-17)] +debug: Replacing redundant declaration let item_index%11#0: uint64 = (* row#0 3u) with copy of existing registers [Register(atype=uint64, name='item_index%5', version=0, source_location=tictactoe/tictactoe.py:76:11-17)] +debug: Replacing redundant declaration let index_is_in_bounds%32#0: uint64 = (< column#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%26', version=0, source_location=tictactoe/tictactoe.py:79:11-23)] +debug: Replacing redundant declaration let index_is_in_bounds%17#0: uint64 = (< row#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%4', version=0, source_location=tictactoe/tictactoe.py:76:11-17)] +debug: Replacing redundant declaration let item_index%18#0: uint64 = (* row#0 3u) with copy of existing registers [Register(atype=uint64, name='item_index%5', version=0, source_location=tictactoe/tictactoe.py:76:11-17)] +debug: Replacing redundant declaration let index_is_in_bounds%39#0: uint64 = (< column#0 3u) with copy of existing registers [Register(atype=uint64, name='index_is_in_bounds%26', version=0, source_location=tictactoe/tictactoe.py:79:11-23)] debug: Found equivalence set: index_is_in_bounds%4#0, index_is_in_bounds%10#0, index_is_in_bounds%17#0 debug: Replacing {index_is_in_bounds%10#0, index_is_in_bounds%17#0} with index_is_in_bounds%4#0 made 2 modifications debug: Found equivalence set: item_index%5#0, item_index%11#0, item_index%18#0 @@ -731,10 +731,10 @@ debug: Replacing {item_index%27#0, item_index%33#0, item_index%40#0} with column debug: Found equivalence set: index_is_in_bounds%26#0, index_is_in_bounds%32#0, index_is_in_bounds%39#0 debug: Replacing {index_is_in_bounds%32#0, index_is_in_bounds%39#0} with index_is_in_bounds%26#0 made 2 modifications debug: Removing redundant assert of index_is_in_bounds%4#0 -debug: Replacing redundant declaration let tmp%12#0: bytes = (extract3 g#0 item_index%5#0 3u) with copy of existing registers [Register(atype=bytes, name='tmp%6', version=0, source_location=tictactoe/tictactoe.py:74:11-17)] +debug: Replacing redundant declaration let tmp%12#0: bytes = (extract3 g#0 item_index%5#0 3u) with copy of existing registers [Register(atype=bytes, name='tmp%6', version=0, source_location=tictactoe/tictactoe.py:76:11-17)] debug: Removing redundant assert of index_is_in_bounds%26#0 debug: Removing redundant assert of index_is_in_bounds%4#0 -debug: Replacing redundant declaration let tmp%19#0: bytes = (extract3 g#0 item_index%5#0 3u) with copy of existing registers [Register(atype=bytes, name='tmp%6', version=0, source_location=tictactoe/tictactoe.py:74:11-17)] +debug: Replacing redundant declaration let tmp%19#0: bytes = (extract3 g#0 item_index%5#0 3u) with copy of existing registers [Register(atype=bytes, name='tmp%6', version=0, source_location=tictactoe/tictactoe.py:76:11-17)] debug: Removing redundant assert of index_is_in_bounds%26#0 debug: Found equivalence set: tmp%6#0, tmp%12#0, tmp%19#0 debug: Replacing {tmp%12#0, tmp%19#0} with tmp%6#0 made 2 modifications @@ -855,9 +855,9 @@ debug: Optimizer: Remove Linear Jump debug: Optimizer: Remove Empty Blocks debug: Optimizer: Remove Unreachable Blocks debug: Optimizer: Repeated Expression Elimination -debug: Replacing redundant declaration let tmp%44#0: bytes = ((extract 3 3) g#0) with copy of existing registers [Register(atype=bytes, name='tmp%30', version=0, source_location=tictactoe/tictactoe.py:77:27-31)] -debug: Replacing redundant declaration let tmp%49#0: bytes = ((extract 0 3) g#0) with copy of existing registers [Register(atype=bytes, name='tmp%24', version=0, source_location=tictactoe/tictactoe.py:77:11-15)] -debug: Replacing redundant declaration let tmp%59#0: bytes = ((extract 0 3) g#0) with copy of existing registers [Register(atype=bytes, name='tmp%49', version=0, source_location=tictactoe/tictactoe.py:82:15-19)] +debug: Replacing redundant declaration let tmp%44#0: bytes = ((extract 3 3) g#0) with copy of existing registers [Register(atype=bytes, name='tmp%30', version=0, source_location=tictactoe/tictactoe.py:79:27-31)] +debug: Replacing redundant declaration let tmp%49#0: bytes = ((extract 0 3) g#0) with copy of existing registers [Register(atype=bytes, name='tmp%24', version=0, source_location=tictactoe/tictactoe.py:79:11-15)] +debug: Replacing redundant declaration let tmp%59#0: bytes = ((extract 0 3) g#0) with copy of existing registers [Register(atype=bytes, name='tmp%49', version=0, source_location=tictactoe/tictactoe.py:84:15-19)] debug: Found equivalence set: tmp%30#0, tmp%44#0 debug: Replacing {tmp%44#0} with tmp%30#0 made 1 modifications debug: Found equivalence set: tmp%24#0, tmp%49#0, tmp%59#0 diff --git a/examples/tictactoe/tictactoe.py b/examples/tictactoe/tictactoe.py index 5165680902..1c13ec0c65 100644 --- a/examples/tictactoe/tictactoe.py +++ b/examples/tictactoe/tictactoe.py @@ -51,7 +51,9 @@ def play(self, move: Move) -> None: assert Txn.sender == self.host, "It is the host's turn" player = arc4.UInt8(HOST) else: - assert Txn.sender == self.challenger.get(Account()), "It is the challenger's turn" + assert Txn.sender == self.challenger.get( + default=Account() + ), "It is the challenger's turn" player = arc4.UInt8(CHALLENGER) self.make_move(player, move)