diff --git a/src/awst_build/ast-visitors/function-visitor.ts b/src/awst_build/ast-visitors/function-visitor.ts index 2d67eede5..077e07ef2 100644 --- a/src/awst_build/ast-visitors/function-visitor.ts +++ b/src/awst_build/ast-visitors/function-visitor.ts @@ -24,6 +24,7 @@ import { FunctionPType, ObjectPType } from '../ptypes' import { getSequenceItemType } from '../ptypes/util' import { typeRegistry } from '../type-registry' import { BaseVisitor } from './base-visitor' +import { maybeNodes } from './util' // noinspection JSUnusedGlobalSymbols export class FunctionVisitor @@ -220,11 +221,11 @@ export class FunctionVisitor sourceLocation, }, this.accept(node.statement), - ctx.continueTarget, + ...maybeNodes(ctx.hasContinues, ctx.continueTarget), incrementor, ), }), - ctx.breakTarget, + ...maybeNodes(ctx.hasBreaks, ctx.breakTarget), ] } @@ -250,9 +251,9 @@ export class FunctionVisitor sourceLocation, sequence: requireInstanceBuilder(this.accept(node.expression)).iterate(sourceLocation), items, - loopBody: nodeFactory.block({ sourceLocation }, this.accept(node.statement), ctx.continueTarget), + loopBody: nodeFactory.block({ sourceLocation }, this.accept(node.statement), ...maybeNodes(ctx.hasContinues, ctx.continueTarget)), }), - ctx.breakTarget, + ...maybeNodes(ctx.hasBreaks, ctx.breakTarget), ) } visitForInStatement(node: ts.ForInStatement): awst.Statement | awst.Statement[] { @@ -306,16 +307,19 @@ export class FunctionVisitor loopBody: nodeFactory.block( { sourceLocation }, this.accept(node.statement), - ctx.continueTarget, + ...maybeNodes(ctx.hasContinues, ctx.continueTarget), nodeFactory.ifElse({ condition: this.evaluateCondition(node.expression, true), sourceLocation, - ifBranch: nodeFactory.block({ sourceLocation }, nodeFactory.goto({ sourceLocation, target: ctx.breakTarget.label })), + ifBranch: nodeFactory.block( + { sourceLocation }, + nodeFactory.goto({ sourceLocation, target: this.context.switchLoopCtx.getBreakTarget(undefined, sourceLocation) }), + ), elseBranch: null, }), ), }), - ctx.breakTarget, + ...maybeNodes(ctx.hasBreaks, ctx.breakTarget), ) } visitWhileStatement(node: ts.WhileStatement): awst.Statement | awst.Statement[] { @@ -327,9 +331,9 @@ export class FunctionVisitor nodeFactory.whileLoop({ sourceLocation, condition: this.evaluateCondition(node.expression), - loopBody: nodeFactory.block({ sourceLocation }, this.accept(node.statement), ctx.continueTarget), + loopBody: nodeFactory.block({ sourceLocation }, this.accept(node.statement), ...maybeNodes(ctx.hasContinues, ctx.continueTarget)), }), - ctx.breakTarget, + ...maybeNodes(ctx.hasBreaks, ctx.breakTarget), ) } visitContinueStatement(node: ts.ContinueStatement): awst.Statement | awst.Statement[] { diff --git a/src/awst_build/ast-visitors/util.ts b/src/awst_build/ast-visitors/util.ts new file mode 100644 index 000000000..1dea2ec0c --- /dev/null +++ b/src/awst_build/ast-visitors/util.ts @@ -0,0 +1,3 @@ +export function maybeNodes(condition: boolean, ...nodes: T[]): T[] { + return condition ? nodes : [] +} diff --git a/src/awst_build/context/switch-loop-context.ts b/src/awst_build/context/switch-loop-context.ts index 3d75ef698..b5954d453 100644 --- a/src/awst_build/context/switch-loop-context.ts +++ b/src/awst_build/context/switch-loop-context.ts @@ -35,7 +35,7 @@ export class SwitchLoopContext { getBreakTarget(label: ts.Identifier | undefined, sourceLocation: SourceLocation): string { const labelName = label?.text const item = this.switchLoopStack.toReversed().find(({ label }) => labelName === undefined || label === labelName) - codeInvariant(item, 'Break must must exist inside a switch or loop construct', sourceLocation) + codeInvariant(item, 'Break must exist inside a switch or loop construct', sourceLocation) item.numBreaks++ return `${item.uniqueName}${breakSuffix}` } @@ -43,7 +43,7 @@ export class SwitchLoopContext { getContinueTarget(label: ts.Identifier | undefined, sourceLocation: SourceLocation): string { const labelName = label?.text const item = this.switchLoopStack.toReversed().find(({ label }) => labelName === undefined || label === labelName) - codeInvariant(item?.type === 'loop', 'Continue must must exist inside a loop construct', sourceLocation) + codeInvariant(item?.type === 'loop', 'Continue must exist inside a loop construct', sourceLocation) item.numContinues++ return `${item.uniqueName}${continueSuffix}` } diff --git a/src/puya/log-deserializer.ts b/src/puya/log-deserializer.ts index 15d9022c6..1e484558d 100644 --- a/src/puya/log-deserializer.ts +++ b/src/puya/log-deserializer.ts @@ -1,3 +1,4 @@ +import upath from 'upath' import { z } from 'zod' import { SourceLocation } from '../awst/source-location' import { logger, LogLevel } from '../logger' @@ -22,7 +23,7 @@ export function deserializeAndLog(logText: string) { const sourceLocation = log.location ? new SourceLocation({ - file: log.location.file, + file: upath.normalize(log.location.file), line: log.location.line, endLine: log.location.end_line ?? log.location.line + 1, column: log.location.column, diff --git a/tests/approvals/do-loops.algo.ts b/tests/approvals/do-loops.algo.ts index 13e23d737..3df6116e1 100644 --- a/tests/approvals/do-loops.algo.ts +++ b/tests/approvals/do-loops.algo.ts @@ -1,9 +1,37 @@ import type { uint64 } from '@algorandfoundation/algorand-typescript' -import { Uint64 } from '@algorandfoundation/algorand-typescript' +import { Contract, Uint64 } from '@algorandfoundation/algorand-typescript' -function test_do(stop: uint64) { - let i = Uint64(0) - do { - i += 1 - } while (i < stop) +export class DoLoopsAlgo extends Contract { + testDo(stop: uint64) { + let i = Uint64(0) + do { + i += 1 + } while (i < stop) + return i + } + testDoBreak(stop: uint64, breakMod: uint64) { + let total = Uint64(0) + let i = Uint64(0) + do { + if (i > 0 && i % breakMod === 0) break + + i += 1 + total += i + } while (i < stop) + return total + } + testDoContinue(stop: uint64, mod: uint64) { + let i = Uint64(0) + let total = Uint64(0) + do { + if (i > 0 && i % mod === 0) { + total += 2 + i += 1 + continue + } + total += 1 + i += 1 + } while (i < stop) + return total + } } diff --git a/tests/approvals/for-loops.algo.ts b/tests/approvals/for-loops.algo.ts index 77aafe742..6dc1e7d30 100644 --- a/tests/approvals/for-loops.algo.ts +++ b/tests/approvals/for-loops.algo.ts @@ -33,9 +33,9 @@ class ForLoopsAlgo extends Contract { let total = Uint64(0) outer: for (let i = start; i < stop; i += step) { for (let j = start; j < stop; j += step) { - total += j + j - // TODO: Can't unconditionally break as it leads to unreachable blocks and puya goes 💥 - if (j === start) break outer + total += i + j + + if (i * j > stop) break outer } } return total diff --git a/tests/approvals/out/o1/destructuring-iterators/destructuring-iterators.awst b/tests/approvals/out/o1/destructuring-iterators/destructuring-iterators.awst index 8fcb30d70..8cabe95d5 100644 --- a/tests/approvals/out/o1/destructuring-iterators/destructuring-iterators.awst +++ b/tests/approvals/out/o1/destructuring-iterators/destructuring-iterators.awst @@ -4,8 +4,6 @@ subroutine test(): void total: uint64 = 0 for ({ a: a, b: _ } in items) { total: uint64 = total + a - #loop₁ᶜ: } - #loop₁ᵇ: assert(total == 6) } \ No newline at end of file diff --git a/tests/approvals/out/o1/destructuring-iterators/destructuring-iterators.awst.json b/tests/approvals/out/o1/destructuring-iterators/destructuring-iterators.awst.json index 435f7b368..63c8b326b 100644 --- a/tests/approvals/out/o1/destructuring-iterators/destructuring-iterators.awst.json +++ b/tests/approvals/out/o1/destructuring-iterators/destructuring-iterators.awst.json @@ -817,37 +817,11 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/destructuring-iterators.algo.ts", - "line": 11, - "end_line": 11, - "column": 2, - "end_column": 28 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, "comment": null } - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/destructuring-iterators.algo.ts", - "line": 11, - "end_line": 11, - "column": 2, - "end_column": 28 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null } ], "label": null, diff --git a/tests/approvals/out/o1/do-loops/DoLoopsAlgo.approval.teal b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.approval.teal new file mode 100644 index 000000000..af8514b8d --- /dev/null +++ b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.approval.teal @@ -0,0 +1,240 @@ +#pragma version 10 +#pragma typetrack false + +// @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram() -> uint64: +main: + intcblock 1 0 + bytecblock 0x151f7c75 + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txn NumAppArgs + bz main_bare_routing@8 + pushbytess 0x39239792 0xace2eb21 0x78e8d516 // method "testDo(uint64)uint64", method "testDoBreak(uint64,uint64)uint64", method "testDoContinue(uint64,uint64)uint64" + txna ApplicationArgs 0 + match main_testDo_route@3 main_testDoBreak_route@4 main_testDoContinue_route@5 + +main_after_if_else@12: + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + intc_1 // 0 + return + +main_testDoContinue_route@5: + // tests/approvals/do-loops.algo.ts:23 + // testDoContinue(stop: uint64, mod: uint64) { + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txna ApplicationArgs 1 + btoi + txna ApplicationArgs 2 + btoi + // tests/approvals/do-loops.algo.ts:23 + // testDoContinue(stop: uint64, mod: uint64) { + callsub testDoContinue + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_testDoBreak_route@4: + // tests/approvals/do-loops.algo.ts:12 + // testDoBreak(stop: uint64, breakMod: uint64) { + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txna ApplicationArgs 1 + btoi + txna ApplicationArgs 2 + btoi + // tests/approvals/do-loops.algo.ts:12 + // testDoBreak(stop: uint64, breakMod: uint64) { + callsub testDoBreak + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_testDo_route@3: + // tests/approvals/do-loops.algo.ts:5 + // testDo(stop: uint64) { + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txna ApplicationArgs 1 + btoi + // tests/approvals/do-loops.algo.ts:5 + // testDo(stop: uint64) { + callsub testDo + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_bare_routing@8: + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txn OnCompletion + bnz main_after_if_else@12 + txn ApplicationID + ! + assert // can only call when creating + intc_0 // 1 + return + + +// tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(stop: uint64) -> uint64: +testDo: + // tests/approvals/do-loops.algo.ts:5 + // testDo(stop: uint64) { + proto 1 1 + // tests/approvals/do-loops.algo.ts:6 + // let i = Uint64(0) + intc_1 // 0 + +testDo_while_top@1: + // tests/approvals/do-loops.algo.ts:8 + // i += 1 + intc_0 // 1 + + + dup + // tests/approvals/do-loops.algo.ts:9 + // } while (i < stop) + frame_dig -1 + < + bnz testDo_while_top@1 + // tests/approvals/do-loops.algo.ts:10 + // return i + retsub + + +// tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(stop: uint64, breakMod: uint64) -> uint64: +testDoBreak: + // tests/approvals/do-loops.algo.ts:12 + // testDoBreak(stop: uint64, breakMod: uint64) { + proto 2 1 + // tests/approvals/do-loops.algo.ts:13 + // let total = Uint64(0) + intc_1 // 0 + // tests/approvals/do-loops.algo.ts:14 + // let i = Uint64(0) + dup + +testDoBreak_while_top@1: + // tests/approvals/do-loops.algo.ts:16 + // if (i > 0 && i % breakMod === 0) break + frame_dig 1 + bz testDoBreak_after_if_else@5 + frame_dig 1 + frame_dig -1 + % + bz testDoBreak_block@9 + +testDoBreak_after_if_else@5: + // tests/approvals/do-loops.algo.ts:18 + // i += 1 + frame_dig 1 + intc_0 // 1 + + + dup + frame_bury 1 + // tests/approvals/do-loops.algo.ts:19 + // total += i + frame_dig 0 + dig 1 + + + frame_bury 0 + // tests/approvals/do-loops.algo.ts:20 + // } while (i < stop) + frame_dig -2 + < + bnz testDoBreak_while_top@1 + +testDoBreak_block@9: + // tests/approvals/do-loops.algo.ts:21 + // return total + retsub + + +// tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(stop: uint64, mod: uint64) -> uint64: +testDoContinue: + // tests/approvals/do-loops.algo.ts:23 + // testDoContinue(stop: uint64, mod: uint64) { + proto 2 1 + // tests/approvals/do-loops.algo.ts:24 + // let i = Uint64(0) + intc_1 // 0 + // tests/approvals/do-loops.algo.ts:25 + // let total = Uint64(0) + dup + +testDoContinue_while_top@1: + // tests/approvals/do-loops.algo.ts:27 + // if (i > 0 && i % mod === 0) { + frame_dig 0 + bz testDoContinue_after_if_else@5 + frame_dig 0 + frame_dig -1 + % + bnz testDoContinue_after_if_else@5 + // tests/approvals/do-loops.algo.ts:28 + // total += 2 + frame_dig 1 + pushint 2 // 2 + + + frame_bury 1 + // tests/approvals/do-loops.algo.ts:29 + // i += 1 + frame_dig 0 + intc_0 // 1 + + + frame_bury 0 + +testDoContinue_block@6: + // tests/approvals/do-loops.algo.ts:34 + // } while (i < stop) + frame_dig 0 + frame_dig -2 + < + bnz testDoContinue_while_top@1 + // tests/approvals/do-loops.algo.ts:35 + // return total + frame_dig 1 + frame_bury 0 + retsub + +testDoContinue_after_if_else@5: + // tests/approvals/do-loops.algo.ts:32 + // total += 1 + frame_dig 1 + intc_0 // 1 + + + frame_bury 1 + // tests/approvals/do-loops.algo.ts:33 + // i += 1 + frame_dig 0 + intc_0 // 1 + + + frame_bury 0 + b testDoContinue_block@6 diff --git a/tests/approvals/out/o1/do-loops/DoLoopsAlgo.arc32.json b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.arc32.json new file mode 100644 index 000000000..2de1b63cb --- /dev/null +++ b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.arc32.json @@ -0,0 +1,99 @@ +{ + "hints": { + "testDo(uint64)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "testDoBreak(uint64,uint64)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "testDoContinue(uint64,uint64)uint64": { + "call_config": { + "no_op": "CALL" + } + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A4CiAgICBwdXNoYnl0ZXNzIDB4MzkyMzk3OTIgMHhhY2UyZWIyMSAweDc4ZThkNTE2IC8vIG1ldGhvZCAidGVzdERvKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3REb0JyZWFrKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0RG9Db250aW51ZSh1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdERvX3JvdXRlQDMgbWFpbl90ZXN0RG9CcmVha19yb3V0ZUA0IG1haW5fdGVzdERvQ29udGludWVfcm91dGVANQoKbWFpbl9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl90ZXN0RG9Db250aW51ZV9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHRlc3REb0NvbnRpbnVlKHN0b3A6IHVpbnQ2NCwgbW9kOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHRlc3REb0NvbnRpbnVlKHN0b3A6IHVpbnQ2NCwgbW9kOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdERvQ29udGludWUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdERvQnJlYWtfcm91dGVANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEyCiAgICAvLyB0ZXN0RG9CcmVhayhzdG9wOiB1aW50NjQsIGJyZWFrTW9kOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIHRlc3REb0JyZWFrKHN0b3A6IHVpbnQ2NCwgYnJlYWtNb2Q6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0RG9CcmVhawogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0RG9fcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3REbyhzdG9wOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdERvKHN0b3A6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0RG8KICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgRG9Mb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDEyCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby50ZXN0RG8oc3RvcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3REbzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3REbyhzdG9wOiB1aW50NjQpIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NgogICAgLy8gbGV0IGkgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCgp0ZXN0RG9fd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo4CiAgICAvLyBpICs9IDEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBkdXAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjkKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBibnogdGVzdERvX3doaWxlX3RvcEAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxMAogICAgLy8gcmV0dXJuIGkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby50ZXN0RG9CcmVhayhzdG9wOiB1aW50NjQsIGJyZWFrTW9kOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdERvQnJlYWs6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxMgogICAgLy8gdGVzdERvQnJlYWsoc3RvcDogdWludDY0LCBicmVha01vZDogdWludDY0KSB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNAogICAgLy8gbGV0IGkgPSBVaW50NjQoMCkKICAgIGR1cAoKdGVzdERvQnJlYWtfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNgogICAgLy8gaWYgKGkgPiAwICYmIGkgJSBicmVha01vZCA9PT0gMCkgYnJlYWsKICAgIGZyYW1lX2RpZyAxCiAgICBieiB0ZXN0RG9CcmVha19hZnRlcl9pZl9lbHNlQDUKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICUKICAgIGJ6IHRlc3REb0JyZWFrX2Jsb2NrQDkKCnRlc3REb0JyZWFrX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE4CiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE5CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjAKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBibnogdGVzdERvQnJlYWtfd2hpbGVfdG9wQDEKCnRlc3REb0JyZWFrX2Jsb2NrQDk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyMQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo6RG9Mb29wc0FsZ28udGVzdERvQ29udGludWUoc3RvcDogdWludDY0LCBtb2Q6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0RG9Db250aW51ZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjIzCiAgICAvLyB0ZXN0RG9Db250aW51ZShzdG9wOiB1aW50NjQsIG1vZDogdWludDY0KSB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI0CiAgICAvLyBsZXQgaSA9IFVpbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI1CiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGR1cAoKdGVzdERvQ29udGludWVfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyNwogICAgLy8gaWYgKGkgPiAwICYmIGkgJSBtb2QgPT09IDApIHsKICAgIGZyYW1lX2RpZyAwCiAgICBieiB0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDUKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgICUKICAgIGJueiB0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyB0b3RhbCArPSAyCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjkKICAgIC8vIGkgKz0gMQogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKCnRlc3REb0NvbnRpbnVlX2Jsb2NrQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czozNAogICAgLy8gfSB3aGlsZSAoaSA8IHN0b3ApCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBibnogdGVzdERvQ29udGludWVfd2hpbGVfdG9wQDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyByZXR1cm4gdG90YWwKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdGVzdERvQ29udGludWVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRvdGFsICs9IDEKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czozMwogICAgLy8gaSArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiB0ZXN0RG9Db250aW51ZV9ibG9ja0A2Cg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "state": { + "global": { + "num_byte_slices": 0, + "num_uints": 0 + }, + "local": { + "num_byte_slices": 0, + "num_uints": 0 + } + }, + "schema": { + "global": { + "declared": {}, + "reserved": {} + }, + "local": { + "declared": {}, + "reserved": {} + } + }, + "contract": { + "name": "DoLoopsAlgo", + "methods": [ + { + "name": "testDo", + "args": [ + { + "type": "uint64", + "name": "stop" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + }, + { + "name": "testDoBreak", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "breakMod" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + }, + { + "name": "testDoContinue", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "mod" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + } + ], + "networks": {} + }, + "bare_call_config": { + "no_op": "CREATE" + } +} \ No newline at end of file diff --git a/tests/approvals/out/o1/do-loops/DoLoopsAlgo.arc56.json b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.arc56.json new file mode 100644 index 000000000..c9ddd8b49 --- /dev/null +++ b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.arc56.json @@ -0,0 +1,161 @@ +{ + "name": "DoLoopsAlgo", + "structs": {}, + "methods": [ + { + "name": "testDo", + "args": [ + { + "type": "uint64", + "name": "stop" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "testDoBreak", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "breakMod" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "testDoContinue", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "mod" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 50, + 75, + 100 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 126 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 53, + 78, + 103 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A4CiAgICBwdXNoYnl0ZXNzIDB4MzkyMzk3OTIgMHhhY2UyZWIyMSAweDc4ZThkNTE2IC8vIG1ldGhvZCAidGVzdERvKHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3REb0JyZWFrKHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0RG9Db250aW51ZSh1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdERvX3JvdXRlQDMgbWFpbl90ZXN0RG9CcmVha19yb3V0ZUA0IG1haW5fdGVzdERvQ29udGludWVfcm91dGVANQoKbWFpbl9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18xIC8vIDAKICAgIHJldHVybgoKbWFpbl90ZXN0RG9Db250aW51ZV9yb3V0ZUA1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHRlc3REb0NvbnRpbnVlKHN0b3A6IHVpbnQ2NCwgbW9kOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHRlc3REb0NvbnRpbnVlKHN0b3A6IHVpbnQ2NCwgbW9kOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdERvQ29udGludWUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdERvQnJlYWtfcm91dGVANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEyCiAgICAvLyB0ZXN0RG9CcmVhayhzdG9wOiB1aW50NjQsIGJyZWFrTW9kOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIHRlc3REb0JyZWFrKHN0b3A6IHVpbnQ2NCwgYnJlYWtNb2Q6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0RG9CcmVhawogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0RG9fcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3REbyhzdG9wOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdERvKHN0b3A6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0RG8KICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgRG9Mb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDEyCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby50ZXN0RG8oc3RvcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3REbzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3REbyhzdG9wOiB1aW50NjQpIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NgogICAgLy8gbGV0IGkgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCgp0ZXN0RG9fd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo4CiAgICAvLyBpICs9IDEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBkdXAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjkKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBibnogdGVzdERvX3doaWxlX3RvcEAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxMAogICAgLy8gcmV0dXJuIGkKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby50ZXN0RG9CcmVhayhzdG9wOiB1aW50NjQsIGJyZWFrTW9kOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdERvQnJlYWs6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxMgogICAgLy8gdGVzdERvQnJlYWsoc3RvcDogdWludDY0LCBicmVha01vZDogdWludDY0KSB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNAogICAgLy8gbGV0IGkgPSBVaW50NjQoMCkKICAgIGR1cAoKdGVzdERvQnJlYWtfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNgogICAgLy8gaWYgKGkgPiAwICYmIGkgJSBicmVha01vZCA9PT0gMCkgYnJlYWsKICAgIGZyYW1lX2RpZyAxCiAgICBieiB0ZXN0RG9CcmVha19hZnRlcl9pZl9lbHNlQDUKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICUKICAgIGJ6IHRlc3REb0JyZWFrX2Jsb2NrQDkKCnRlc3REb0JyZWFrX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE4CiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE5CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjAKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBibnogdGVzdERvQnJlYWtfd2hpbGVfdG9wQDEKCnRlc3REb0JyZWFrX2Jsb2NrQDk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyMQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo6RG9Mb29wc0FsZ28udGVzdERvQ29udGludWUoc3RvcDogdWludDY0LCBtb2Q6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0RG9Db250aW51ZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjIzCiAgICAvLyB0ZXN0RG9Db250aW51ZShzdG9wOiB1aW50NjQsIG1vZDogdWludDY0KSB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI0CiAgICAvLyBsZXQgaSA9IFVpbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI1CiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGR1cAoKdGVzdERvQ29udGludWVfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyNwogICAgLy8gaWYgKGkgPiAwICYmIGkgJSBtb2QgPT09IDApIHsKICAgIGZyYW1lX2RpZyAwCiAgICBieiB0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDUKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgICUKICAgIGJueiB0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyB0b3RhbCArPSAyCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCAyIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjkKICAgIC8vIGkgKz0gMQogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKCnRlc3REb0NvbnRpbnVlX2Jsb2NrQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czozNAogICAgLy8gfSB3aGlsZSAoaSA8IHN0b3ApCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBibnogdGVzdERvQ29udGludWVfd2hpbGVfdG9wQDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyByZXR1cm4gdG90YWwKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdGVzdERvQ29udGludWVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRvdGFsICs9IDEKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czozMwogICAgLy8gaSArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiB0ZXN0RG9Db250aW51ZV9ibG9ja0A2Cg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAQAmAQQVH3x1MRtBAGWCAwQ5I5eSBKzi6yEEeOjVFjYaAI4DADQAGwACI0MxGRREMRhENhoBFzYaAheIAHUWKExQsCJDMRkURDEYRDYaARc2GgIXiAA1FihMULAiQzEZFEQxGEQ2GgEXiAASFihMULAiQzEZQP+yMRgURCJDigEBIyIISYv/DED/94mKAgEjSYsBQQAIiwGL/xhBABSLASIISYwBiwBLAQiMAIv+DED/34mKAgEjSYsAQQAiiwCL/xhAABqLAYECCIwBiwAiCIwAiwCL/gxA/96LAYwAiYsBIgiMAYsAIgiMAEL/5A==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 4, + "minor": 3, + "patch": 3 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/approvals/out/o1/do-loops/DoLoopsAlgo.clear.teal b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.clear.teal new file mode 100644 index 000000000..a4d580477 --- /dev/null +++ b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 +#pragma typetrack false + +// @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram() -> uint64: +main: + pushint 1 // 1 + return diff --git a/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.0.ssa.ir b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.0.ssa.ir new file mode 100644 index 000000000..c453cbd01 --- /dev/null +++ b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.0.ssa.ir @@ -0,0 +1,175 @@ +main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram: + block@0: // L1 + let tmp%0#0: bool = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__() + return tmp%0#0 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__() -> bool: + block@0: // L4 + let tmp%0#0: uint64 = (txn NumAppArgs) + let tmp%1#0: bool = (!= tmp%0#0 0u) + goto tmp%1#0 ? block@1 : block@7 + block@1: // abi_routing_L4 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "testDo(uint64)uint64" => block@2, method "testDoBreak(uint64,uint64)uint64" => block@3, method "testDoContinue(uint64,uint64)uint64" => block@4, * => block@5} + block@2: // testDo_route_L5 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: bool = (== tmp%3#0 NoOp) + (assert tmp%4#0) // OnCompletion is not NoOp + let tmp%5#0: uint64 = (txn ApplicationID) + let tmp%6#0: bool = (!= tmp%5#0 0u) + (assert tmp%6#0) // can only call when not creating + let reinterpret_bytes[8]%0#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%7#0: uint64 = (btoi reinterpret_bytes[8]%0#0) + let to_encode%0#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(tmp%7#0) + let val_as_bytes%0#0: bytes[8] = (itob to_encode%0#0) + let tmp%8#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%8#0) + return 1u + block@3: // testDoBreak_route_L12 + let tmp%9#0: uint64 = (txn OnCompletion) + let tmp%10#0: bool = (== tmp%9#0 NoOp) + (assert tmp%10#0) // OnCompletion is not NoOp + let tmp%11#0: uint64 = (txn ApplicationID) + let tmp%12#0: bool = (!= tmp%11#0 0u) + (assert tmp%12#0) // can only call when not creating + let reinterpret_bytes[8]%1#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%13#0: uint64 = (btoi reinterpret_bytes[8]%1#0) + let reinterpret_bytes[8]%2#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%14#0: uint64 = (btoi reinterpret_bytes[8]%2#0) + let to_encode%1#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(tmp%13#0, tmp%14#0) + let val_as_bytes%1#0: bytes[8] = (itob to_encode%1#0) + let tmp%15#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) + (log tmp%15#0) + return 1u + block@4: // testDoContinue_route_L23 + let tmp%16#0: uint64 = (txn OnCompletion) + let tmp%17#0: bool = (== tmp%16#0 NoOp) + (assert tmp%17#0) // OnCompletion is not NoOp + let tmp%18#0: uint64 = (txn ApplicationID) + let tmp%19#0: bool = (!= tmp%18#0 0u) + (assert tmp%19#0) // can only call when not creating + let reinterpret_bytes[8]%3#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%20#0: uint64 = (btoi reinterpret_bytes[8]%3#0) + let reinterpret_bytes[8]%4#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%21#0: uint64 = (btoi reinterpret_bytes[8]%4#0) + let to_encode%2#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(tmp%20#0, tmp%21#0) + let val_as_bytes%2#0: bytes[8] = (itob to_encode%2#0) + let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) + (log tmp%22#0) + return 1u + block@5: // switch_case_default_L4 + goto block@6 + block@6: // switch_case_next_L4 + goto block@11 + block@7: // bare_routing_L4 + let tmp%23#0: uint64 = (txn OnCompletion) + switch tmp%23#0 {0u => block@8, * => block@9} + block@8: // __algots__.defaultCreate_L4 + let tmp%24#0: uint64 = (txn ApplicationID) + let tmp%25#0: bool = (== tmp%24#0 0u) + (assert tmp%25#0) // can only call when creating + tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__algots__.defaultCreate() + return 1u + block@9: // switch_case_default_L4 + goto block@10 + block@10: // switch_case_next_L4 + goto block@11 + block@11: // after_if_else_L4 + return 0u + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(stop: uint64) -> uint64: + block@0: // L5 + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L7 + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + goto 1u ? block@2 : block@5 + block@2: // while_body_L7 + let i#2: uint64 = (+ i#1 1u) + let tmp%0#0: bool = (< i#2 stop#0) + goto tmp%0#0 ? block@4 : block@3 + block@3: // if_body_L7 + goto block@6 + block@4: // after_if_else_L7 + goto block@1 + block@5: // after_while_L7 + goto block@6 + block@6: // L7 + let i#3: uint64 = φ(i#2 <- block@3, i#1 <- block@5) + return i#3 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(stop: uint64, breakMod: uint64) -> uint64: + block@0: // L12 + let total#0: uint64 = 0u + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L15 + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#2: uint64 = φ(total#0 <- block@0, total#3 <- block@7) + goto 1u ? block@2 : block@8 + block@2: // while_body_L15 + let tmp%0#0: bool = (> i#1 0u) + goto tmp%0#0 ? block@3 : block@5 + block@3: // and_contd_L16 + let tmp%1#0: uint64 = (% i#1 breakMod#0) + let tmp%2#0: bool = (== tmp%1#0 0u) + goto tmp%2#0 ? block@4 : block@5 + block@4: // if_body_L16 + goto block@9 + block@5: // after_if_else_L16 + let i#3: uint64 = (+ i#1 1u) + let total#3: uint64 = (+ total#2 i#3) + let tmp%3#0: bool = (< i#3 stop#0) + goto tmp%3#0 ? block@7 : block@6 + block@6: // if_body_L15 + goto block@9 + block@7: // after_if_else_L15 + goto block@1 + block@8: // after_while_L15 + goto block@9 + block@9: // L15 + let total#4: uint64 = φ(total#2 <- block@4, total#3 <- block@6, total#2 <- block@8) + return total#4 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(stop: uint64, mod: uint64) -> uint64: + block@0: // L23 + let i#0: uint64 = 0u + let total#0: uint64 = 0u + goto block@1 + block@1: // while_top_L26 + let i#1: uint64 = φ(i#0 <- block@0, i#5 <- block@8) + let total#1: uint64 = φ(total#0 <- block@0, total#5 <- block@8) + goto 1u ? block@2 : block@9 + block@2: // while_body_L26 + let tmp%0#0: bool = (> i#1 0u) + goto tmp%0#0 ? block@3 : block@5 + block@3: // and_contd_L27 + let tmp%1#0: uint64 = (% i#1 mod#0) + let tmp%2#0: bool = (== tmp%1#0 0u) + goto tmp%2#0 ? block@4 : block@5 + block@4: // if_body_L27 + let total#2: uint64 = (+ total#1 2u) + let i#2: uint64 = (+ i#1 1u) + goto block@6 + block@5: // after_if_else_L27 + let total#4: uint64 = (+ total#1 1u) + let i#4: uint64 = (+ i#1 1u) + goto block@6 + block@6: // L26 + let i#5: uint64 = φ(i#2 <- block@4, i#4 <- block@5) + let total#5: uint64 = φ(total#2 <- block@4, total#4 <- block@5) + let tmp%3#0: bool = (< i#5 stop#0) + goto tmp%3#0 ? block@8 : block@7 + block@7: // if_body_L26 + goto block@10 + block@8: // after_if_else_L26 + goto block@1 + block@9: // after_while_L26 + goto block@10 + block@10: // L26 + let total#6: uint64 = φ(total#5 <- block@7, total#1 <- block@9) + return total#6 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__algots__.defaultCreate() -> void: + block@0: // L4 + return \ No newline at end of file diff --git a/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.1.ssa.array.ir b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.1.ssa.array.ir new file mode 100644 index 000000000..27e20ba71 --- /dev/null +++ b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.1.ssa.array.ir @@ -0,0 +1,139 @@ +main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram: + block@0: // L1 + let tmp%0#1: uint64 = (txn NumAppArgs) + goto tmp%0#1 ? block@2 : block@8 + block@2: // abi_routing_L4 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "testDo(uint64)uint64" => block@3, method "testDoBreak(uint64,uint64)uint64" => block@4, method "testDoContinue(uint64,uint64)uint64" => block@5, * => block@12} + block@3: // testDo_route_L5 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: bool = (! tmp%3#0) + (assert tmp%4#0) // OnCompletion is not NoOp + let tmp%5#0: uint64 = (txn ApplicationID) + (assert tmp%5#0) // can only call when not creating + let reinterpret_bytes[8]%0#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%7#0: uint64 = (btoi reinterpret_bytes[8]%0#0) + let to_encode%0#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(tmp%7#0) + let val_as_bytes%0#0: bytes[8] = (itob to_encode%0#0) + let tmp%8#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%8#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0: bool = 1u + goto block@13 + block@4: // testDoBreak_route_L12 + let tmp%9#0: uint64 = (txn OnCompletion) + let tmp%10#0: bool = (! tmp%9#0) + (assert tmp%10#0) // OnCompletion is not NoOp + let tmp%11#0: uint64 = (txn ApplicationID) + (assert tmp%11#0) // can only call when not creating + let reinterpret_bytes[8]%1#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%13#0: uint64 = (btoi reinterpret_bytes[8]%1#0) + let reinterpret_bytes[8]%2#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%14#0: uint64 = (btoi reinterpret_bytes[8]%2#0) + let to_encode%1#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(tmp%13#0, tmp%14#0) + let val_as_bytes%1#0: bytes[8] = (itob to_encode%1#0) + let tmp%15#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) + (log tmp%15#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1: bool = 1u + goto block@13 + block@5: // testDoContinue_route_L23 + let tmp%16#0: uint64 = (txn OnCompletion) + let tmp%17#0: bool = (! tmp%16#0) + (assert tmp%17#0) // OnCompletion is not NoOp + let tmp%18#0: uint64 = (txn ApplicationID) + (assert tmp%18#0) // can only call when not creating + let reinterpret_bytes[8]%3#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%20#0: uint64 = (btoi reinterpret_bytes[8]%3#0) + let reinterpret_bytes[8]%4#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%21#0: uint64 = (btoi reinterpret_bytes[8]%4#0) + let to_encode%2#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(tmp%20#0, tmp%21#0) + let val_as_bytes%2#0: bytes[8] = (itob to_encode%2#0) + let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) + (log tmp%22#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2: bool = 1u + goto block@13 + block@8: // bare_routing_L4 + let tmp%23#0: uint64 = (txn OnCompletion) + goto tmp%23#0 ? block@12 : block@9 + block@9: // __algots__.defaultCreate_L4 + let tmp%24#0: uint64 = (txn ApplicationID) + let tmp%25#0: bool = (! tmp%24#0) + (assert tmp%25#0) // can only call when creating + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3: bool = 1u + goto block@13 + block@12: // after_if_else_L4 + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4: bool = 0u + goto block@13 + block@13: // after_inlined_tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router___L1 + let tmp%0#0: bool = φ(tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0 <- block@3, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1 <- block@4, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2 <- block@5, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3 <- block@9, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4 <- block@12) + return tmp%0#0 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(stop: uint64) -> uint64: + block@0: // L5 + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L7 + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + let i#2: uint64 = (+ i#1 1u) + let tmp%0#0: bool = (< i#2 stop#0) + goto tmp%0#0 ? block@4 : block@3 + block@3: // if_body_L7 + return i#2 + block@4: // after_if_else_L7 + goto block@1 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(stop: uint64, breakMod: uint64) -> uint64: + block@0: // L12 + let total#0: uint64 = 0u + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L15 + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#2: uint64 = φ(total#0 <- block@0, total#3 <- block@7) + goto i#1 ? block@3 : block@5 + block@3: // and_contd_L16 + let tmp%1#0: uint64 = (% i#1 breakMod#0) + goto tmp%1#0 ? block@5 : block@4 + block@4: // if_body_L16 + goto block@9 + block@5: // after_if_else_L16 + let i#3: uint64 = (+ i#1 1u) + let total#3: uint64 = (+ total#2 i#3) + let tmp%3#0: bool = (< i#3 stop#0) + goto tmp%3#0 ? block@7 : block@6 + block@6: // if_body_L15 + goto block@9 + block@7: // after_if_else_L15 + goto block@1 + block@9: // L15 + let total#4: uint64 = φ(total#2 <- block@4, total#3 <- block@6) + return total#4 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(stop: uint64, mod: uint64) -> uint64: + block@0: // L23 + let i#0: uint64 = 0u + let total#0: uint64 = 0u + goto block@1 + block@1: // while_top_L26 + let i#1: uint64 = φ(i#0 <- block@0, i#5 <- block@8) + let total#1: uint64 = φ(total#0 <- block@0, total#5 <- block@8) + goto i#1 ? block@3 : block@5 + block@3: // and_contd_L27 + let tmp%1#0: uint64 = (% i#1 mod#0) + goto tmp%1#0 ? block@5 : block@4 + block@4: // if_body_L27 + let total#2: uint64 = (+ total#1 2u) + let i#2: uint64 = (+ i#1 1u) + goto block@6 + block@5: // after_if_else_L27 + let total#4: uint64 = (+ total#1 1u) + let i#4: uint64 = (+ i#1 1u) + goto block@6 + block@6: // L26 + let i#5: uint64 = φ(i#2 <- block@4, i#4 <- block@5) + let total#5: uint64 = φ(total#2 <- block@4, total#4 <- block@5) + let tmp%3#0: bool = (< i#5 stop#0) + goto tmp%3#0 ? block@8 : block@7 + block@7: // if_body_L26 + return total#5 + block@8: // after_if_else_L26 + goto block@1 \ No newline at end of file diff --git a/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.2.ssa.slot.ir new file mode 100644 index 000000000..27e20ba71 --- /dev/null +++ b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.2.ssa.slot.ir @@ -0,0 +1,139 @@ +main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram: + block@0: // L1 + let tmp%0#1: uint64 = (txn NumAppArgs) + goto tmp%0#1 ? block@2 : block@8 + block@2: // abi_routing_L4 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "testDo(uint64)uint64" => block@3, method "testDoBreak(uint64,uint64)uint64" => block@4, method "testDoContinue(uint64,uint64)uint64" => block@5, * => block@12} + block@3: // testDo_route_L5 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: bool = (! tmp%3#0) + (assert tmp%4#0) // OnCompletion is not NoOp + let tmp%5#0: uint64 = (txn ApplicationID) + (assert tmp%5#0) // can only call when not creating + let reinterpret_bytes[8]%0#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%7#0: uint64 = (btoi reinterpret_bytes[8]%0#0) + let to_encode%0#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(tmp%7#0) + let val_as_bytes%0#0: bytes[8] = (itob to_encode%0#0) + let tmp%8#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%8#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0: bool = 1u + goto block@13 + block@4: // testDoBreak_route_L12 + let tmp%9#0: uint64 = (txn OnCompletion) + let tmp%10#0: bool = (! tmp%9#0) + (assert tmp%10#0) // OnCompletion is not NoOp + let tmp%11#0: uint64 = (txn ApplicationID) + (assert tmp%11#0) // can only call when not creating + let reinterpret_bytes[8]%1#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%13#0: uint64 = (btoi reinterpret_bytes[8]%1#0) + let reinterpret_bytes[8]%2#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%14#0: uint64 = (btoi reinterpret_bytes[8]%2#0) + let to_encode%1#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(tmp%13#0, tmp%14#0) + let val_as_bytes%1#0: bytes[8] = (itob to_encode%1#0) + let tmp%15#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) + (log tmp%15#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1: bool = 1u + goto block@13 + block@5: // testDoContinue_route_L23 + let tmp%16#0: uint64 = (txn OnCompletion) + let tmp%17#0: bool = (! tmp%16#0) + (assert tmp%17#0) // OnCompletion is not NoOp + let tmp%18#0: uint64 = (txn ApplicationID) + (assert tmp%18#0) // can only call when not creating + let reinterpret_bytes[8]%3#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%20#0: uint64 = (btoi reinterpret_bytes[8]%3#0) + let reinterpret_bytes[8]%4#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%21#0: uint64 = (btoi reinterpret_bytes[8]%4#0) + let to_encode%2#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(tmp%20#0, tmp%21#0) + let val_as_bytes%2#0: bytes[8] = (itob to_encode%2#0) + let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) + (log tmp%22#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2: bool = 1u + goto block@13 + block@8: // bare_routing_L4 + let tmp%23#0: uint64 = (txn OnCompletion) + goto tmp%23#0 ? block@12 : block@9 + block@9: // __algots__.defaultCreate_L4 + let tmp%24#0: uint64 = (txn ApplicationID) + let tmp%25#0: bool = (! tmp%24#0) + (assert tmp%25#0) // can only call when creating + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3: bool = 1u + goto block@13 + block@12: // after_if_else_L4 + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4: bool = 0u + goto block@13 + block@13: // after_inlined_tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router___L1 + let tmp%0#0: bool = φ(tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0 <- block@3, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1 <- block@4, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2 <- block@5, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3 <- block@9, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4 <- block@12) + return tmp%0#0 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(stop: uint64) -> uint64: + block@0: // L5 + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L7 + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + let i#2: uint64 = (+ i#1 1u) + let tmp%0#0: bool = (< i#2 stop#0) + goto tmp%0#0 ? block@4 : block@3 + block@3: // if_body_L7 + return i#2 + block@4: // after_if_else_L7 + goto block@1 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(stop: uint64, breakMod: uint64) -> uint64: + block@0: // L12 + let total#0: uint64 = 0u + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L15 + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#2: uint64 = φ(total#0 <- block@0, total#3 <- block@7) + goto i#1 ? block@3 : block@5 + block@3: // and_contd_L16 + let tmp%1#0: uint64 = (% i#1 breakMod#0) + goto tmp%1#0 ? block@5 : block@4 + block@4: // if_body_L16 + goto block@9 + block@5: // after_if_else_L16 + let i#3: uint64 = (+ i#1 1u) + let total#3: uint64 = (+ total#2 i#3) + let tmp%3#0: bool = (< i#3 stop#0) + goto tmp%3#0 ? block@7 : block@6 + block@6: // if_body_L15 + goto block@9 + block@7: // after_if_else_L15 + goto block@1 + block@9: // L15 + let total#4: uint64 = φ(total#2 <- block@4, total#3 <- block@6) + return total#4 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(stop: uint64, mod: uint64) -> uint64: + block@0: // L23 + let i#0: uint64 = 0u + let total#0: uint64 = 0u + goto block@1 + block@1: // while_top_L26 + let i#1: uint64 = φ(i#0 <- block@0, i#5 <- block@8) + let total#1: uint64 = φ(total#0 <- block@0, total#5 <- block@8) + goto i#1 ? block@3 : block@5 + block@3: // and_contd_L27 + let tmp%1#0: uint64 = (% i#1 mod#0) + goto tmp%1#0 ? block@5 : block@4 + block@4: // if_body_L27 + let total#2: uint64 = (+ total#1 2u) + let i#2: uint64 = (+ i#1 1u) + goto block@6 + block@5: // after_if_else_L27 + let total#4: uint64 = (+ total#1 1u) + let i#4: uint64 = (+ i#1 1u) + goto block@6 + block@6: // L26 + let i#5: uint64 = φ(i#2 <- block@4, i#4 <- block@5) + let total#5: uint64 = φ(total#2 <- block@4, total#4 <- block@5) + let tmp%3#0: bool = (< i#5 stop#0) + goto tmp%3#0 ? block@8 : block@7 + block@7: // if_body_L26 + return total#5 + block@8: // after_if_else_L26 + goto block@1 \ No newline at end of file diff --git a/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.0.ssa.ir b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.0.ssa.ir new file mode 100644 index 000000000..1253eaad9 --- /dev/null +++ b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.0.ssa.ir @@ -0,0 +1,3 @@ +main @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.1.ssa.array.ir b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.1.ssa.array.ir new file mode 100644 index 000000000..1253eaad9 --- /dev/null +++ b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.1.ssa.array.ir @@ -0,0 +1,3 @@ +main @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.2.ssa.slot.ir b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.2.ssa.slot.ir new file mode 100644 index 000000000..1253eaad9 --- /dev/null +++ b/tests/approvals/out/o1/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.2.ssa.slot.ir @@ -0,0 +1,3 @@ +main @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/tests/approvals/out/o1/do-loops/do-loops.awst b/tests/approvals/out/o1/do-loops/do-loops.awst index 7c51ebfb7..eafa96dd5 100644 --- a/tests/approvals/out/o1/do-loops/do-loops.awst +++ b/tests/approvals/out/o1/do-loops/do-loops.awst @@ -1,12 +1,69 @@ -subroutine test_do(stop: uint64): void +contract DoLoopsAlgo { - i: uint64 = 0 - while (True) { - i: uint64 = i + 1 - #loop₁ᶜ: - if (!i < stop) { - goto #loop₁ᵇ + approvalProgram(): bool + { + return arc4Router() + } + + clearProgram(): bool + { + return True + } + + testDo(stop: uint64): uint64 + { + i: uint64 = 0 + while (True) { + i: uint64 = i + 1 + if (!i < stop) { + goto #loop₁ᵇ + } + } + #loop₁ᵇ: + return i + } + + testDoBreak(stop: uint64, breakMod: uint64): uint64 + { + total: uint64 = 0 + i: uint64 = 0 + while (True) { + if (i > 0 and i % breakMod == 0) { + goto #loop₁ᵇ + } + i: uint64 = i + 1 + total: uint64 = total + i + if (!i < stop) { + goto #loop₁ᵇ + } } + #loop₁ᵇ: + return total + } + + testDoContinue(stop: uint64, mod: uint64): uint64 + { + i: uint64 = 0 + total: uint64 = 0 + while (True) { + if (i > 0 and i % mod == 0) { + total: uint64 = total + 2 + i: uint64 = i + 1 + goto #loop₁ᶜ + } + total: uint64 = total + 1 + i: uint64 = i + 1 + #loop₁ᶜ: + if (!i < stop) { + goto #loop₁ᵇ + } + } + #loop₁ᵇ: + return total + } + + __algots__.defaultCreate(): void + { } - #loop₁ᵇ: + } \ No newline at end of file diff --git a/tests/approvals/out/o1/do-loops/do-loops.awst.json b/tests/approvals/out/o1/do-loops/do-loops.awst.json index 290dd6bbe..a982373dc 100644 --- a/tests/approvals/out/o1/do-loops/do-loops.awst.json +++ b/tests/approvals/out/o1/do-loops/do-loops.awst.json @@ -1,67 +1,1384 @@ [ { - "_type": "Subroutine", + "_type": "Contract", "source_location": { "file": "tests/approvals/do-loops.algo.ts", "line": 4, "end_line": 4, "column": 0, - "end_column": 30 + "end_column": 43 }, - "args": [ + "id": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "name": "DoLoopsAlgo", + "description": null, + "method_resolution_order": [ + "@algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract", + "@algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract" + ], + "approval_program": { + "_type": "ContractMethod", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "args": [], + "return_type": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "body": [ + { + "_type": "ReturnStatement", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "value": { + "_type": "ARC4Router", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + } + } + ], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "@algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract", + "member_name": "approvalProgram", + "arc4_method_config": null + }, + "clear_program": { + "_type": "ContractMethod", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "args": [], + "return_type": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "body": [ + { + "_type": "ReturnStatement", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "value": { + "_type": "BoolConstant", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + } + } + ], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "@algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract", + "member_name": "clearStateProgram", + "arc4_method_config": null + }, + "methods": [ { - "_type": "SubroutineArgument", - "name": "stop", + "_type": "ContractMethod", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 4, - "end_line": 4, - "column": 17, - "end_column": 29 + "line": 5, + "end_line": 5, + "column": 2, + "end_column": 22 + }, + "args": [ + { + "_type": "SubroutineArgument", + "name": "stop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 5, + "end_line": 5, + "column": 9, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + } + ], + "return_type": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 5, + "end_line": 11, + "column": 23, + "end_column": 3 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 6, + "end_line": 6, + "column": 8, + "end_column": 21 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 6, + "end_line": 6, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 6, + "end_line": 6, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "WhileLoop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "BoolConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + }, + "loop_body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 7, + "end_column": 5 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 12 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } + } + ], + "label": null, + "comment": null + }, + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "Not", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "expr": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": "<", + "rhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 17, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "stop" + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null + } + ], + "label": null, + "comment": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [], + "label": "#loop₁ᵇ", + "comment": null + } + ], + "label": null, + "comment": null + }, + { + "_type": "ReturnStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 10, + "end_line": 10, + "column": 4, + "end_column": 12 + }, + "value": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 10, + "end_line": 10, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + } + } + ], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "testDo", + "arc4_method_config": { + "_type": "ARC4ABIMethodConfig", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 5, + "end_line": 5, + "column": 2, + "end_column": 22 + }, + "allowed_completion_types": [ + 0 + ], + "create": 3, + "name": "testDo", + "readonly": false, + "default_args": {} + } + }, + { + "_type": "ContractMethod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 12, + "column": 2, + "end_column": 45 + }, + "args": [ + { + "_type": "SubroutineArgument", + "name": "stop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 12, + "column": 14, + "end_column": 26 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + }, + { + "_type": "SubroutineArgument", + "name": "breakMod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 12, + "column": 28, + "end_column": 44 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + } + ], + "return_type": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 22, + "column": 46, + "end_column": 3 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 13, + "end_line": 13, + "column": 8, + "end_column": 25 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 13, + "end_line": 13, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 13, + "end_line": 13, + "column": 23, + "end_column": 24 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 14, + "end_line": 14, + "column": 8, + "end_column": 21 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 14, + "end_line": 14, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 14, + "end_line": 14, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "WhileLoop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "BoolConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + }, + "loop_body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 7, + "end_column": 5 + }, + "body": [ + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 6, + "end_column": 38 + }, + "condition": { + "_type": "BooleanBinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 10, + "end_column": 37 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 10, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 10, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": ">", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 14, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + "op": "and", + "right": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 19, + "end_column": 37 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 19, + "end_column": 31 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "%", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 23, + "end_column": 31 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "breakMod" + } + }, + "operator": "==", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 36, + "end_column": 37 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 39, + "end_column": 44 + }, + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 39, + "end_column": 44 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 12 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 16 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "op": "+", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 15, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + } + } + } + ], + "label": null, + "comment": null + }, + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "Not", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "expr": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": "<", + "rhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 17, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "stop" + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null + } + ], + "label": null, + "comment": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [], + "label": "#loop₁ᵇ", + "comment": null + } + ], + "label": null, + "comment": null + }, + { + "_type": "ReturnStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 21, + "end_line": 21, + "column": 4, + "end_column": 16 + }, + "value": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 21, + "end_line": 21, + "column": 11, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + } + } + ], + "label": null, + "comment": null }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 - } - } - ], - "return_type": { - "_type": "WType", - "name": "void", - "immutable": true, - "ephemeral": false, - "scalar_type": null - }, - "body": { - "_type": "Block", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 4, - "end_line": 9, - "column": 31, - "end_column": 1 - }, - "body": [ - { - "_type": "AssignmentStatement", + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "testDoBreak", + "arc4_method_config": { + "_type": "ARC4ABIMethodConfig", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 5, - "end_line": 5, - "column": 6, - "end_column": 19 + "line": 12, + "end_line": 12, + "column": 2, + "end_column": 45 }, - "target": { - "_type": "VarExpression", + "allowed_completion_types": [ + 0 + ], + "create": 3, + "name": "testDoBreak", + "readonly": false, + "default_args": {} + } + }, + { + "_type": "ContractMethod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 23, + "end_line": 23, + "column": 2, + "end_column": 43 + }, + "args": [ + { + "_type": "SubroutineArgument", + "name": "stop", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 5, - "end_line": 5, - "column": 6, - "end_column": 7 + "line": 23, + "end_line": 23, + "column": 17, + "end_column": 29 }, "wtype": { "_type": "WType", @@ -69,17 +1386,17 @@ "immutable": true, "ephemeral": false, "scalar_type": 2 - }, - "name": "i" + } }, - "value": { - "_type": "IntegerConstant", + { + "_type": "SubroutineArgument", + "name": "mod", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 5, - "end_line": 5, - "column": 17, - "end_column": 18 + "line": 23, + "end_line": 23, + "column": 31, + "end_column": 42 }, "wtype": { "_type": "WType", @@ -87,309 +1404,992 @@ "immutable": true, "ephemeral": false, "scalar_type": 2 - }, - "value": "0", - "teal_alias": null + } } + ], + "return_type": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 }, - { + "body": { "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 23, + "end_line": 36, + "column": 44, + "end_column": 3 }, "body": [ { - "_type": "WhileLoop", + "_type": "AssignmentStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 24, + "end_line": 24, + "column": 8, + "end_column": 21 }, - "condition": { - "_type": "BoolConstant", + "target": { + "_type": "VarExpression", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 24, + "end_line": 24, + "column": 8, + "end_column": 9 }, "wtype": { "_type": "WType", - "name": "bool", + "name": "uint64", "immutable": true, "ephemeral": false, "scalar_type": 2 }, - "value": true + "name": "i" }, - "loop_body": { - "_type": "Block", + "value": { + "_type": "IntegerConstant", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, + "line": 24, + "end_line": 24, + "column": 19, "end_column": 20 }, - "body": [ - { + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 25, + "end_line": 25, + "column": 8, + "end_column": 25 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 25, + "end_line": 25, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 25, + "end_line": 25, + "column": 23, + "end_column": 24 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "WhileLoop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "BoolConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + }, + "loop_body": { "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 5, - "end_column": 3 + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, "body": [ { - "_type": "AssignmentStatement", + "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 10 - }, - "target": { - "_type": "VarExpression", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 5 - }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 - }, - "name": "i" + "line": 26, + "end_line": 34, + "column": 7, + "end_column": 5 }, - "value": { - "_type": "UInt64BinaryOperation", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 10 - }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "body": [ + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 6, + "end_column": 33 + }, + "condition": { + "_type": "BooleanBinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 10, + "end_column": 32 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 10, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 10, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": ">", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 14, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + "op": "and", + "right": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 19, + "end_column": 32 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 19, + "end_column": 26 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "%", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 23, + "end_column": 26 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "mod" + } + }, + "operator": "==", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 31, + "end_column": 32 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 31, + "column": 34, + "end_column": 7 + }, + "body": [ + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 31, + "column": 34, + "end_column": 7 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 18 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 18 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 17, + "end_column": 18 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "2", + "teal_alias": null + } + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 14 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } + }, + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 30, + "end_line": 30, + "column": 8, + "end_column": 16 + }, + "target": "#loop₁ᶜ" + } + ], + "label": null, + "comment": null + } + ], + "label": null, + "comment": null + }, + "else_branch": null }, - "left": { - "_type": "VarExpression", + { + "_type": "AssignmentStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 5 + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 16 }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" }, - "name": "i" + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 15, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } }, - "op": "+", - "right": { - "_type": "IntegerConstant", + { + "_type": "AssignmentStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 9, - "end_column": 10 + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 12 }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" }, - "value": "1", - "teal_alias": null + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } } - } - } - ], - "label": null, - "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, - { - "_type": "IfElse", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "condition": { - "_type": "Not", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 11, - "end_column": 19 - }, - "wtype": { - "_type": "WType", - "name": "bool", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + ], + "label": null, + "comment": null }, - "expr": { - "_type": "NumericComparisonExpression", + { + "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 11, - "end_column": 19 + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, - "wtype": { - "_type": "WType", - "name": "bool", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "body": [], + "label": "#loop₁ᶜ", + "comment": null + }, + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, - "lhs": { - "_type": "VarExpression", + "condition": { + "_type": "Not", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 11, - "end_column": 12 + "line": 34, + "end_line": 34, + "column": 13, + "end_column": 21 }, "wtype": { "_type": "WType", - "name": "uint64", + "name": "bool", "immutable": true, "ephemeral": false, "scalar_type": 2 }, - "name": "i" + "expr": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 34, + "end_line": 34, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 34, + "end_line": 34, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": "<", + "rhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 34, + "end_line": 34, + "column": 17, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "stop" + } + } }, - "operator": "<", - "rhs": { - "_type": "VarExpression", + "if_branch": { + "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 15, - "end_column": 19 - }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, - "name": "stop" - } + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null } - }, - "if_branch": { - "_type": "Block", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "body": [ - { - "_type": "Goto", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "target": "#loop₁ᵇ" - } - ], - "label": null, - "comment": null - }, - "else_branch": null + ], + "label": null, + "comment": null } - ], - "label": null, - "comment": null - } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "body": [], + "label": "#loop₁ᵇ", + "comment": null + } + ], + "label": null, + "comment": null }, { - "_type": "Block", + "_type": "ReturnStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 35, + "end_line": 35, + "column": 4, + "end_column": 16 }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null + "value": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 35, + "end_line": 35, + "column": 11, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + } } ], "label": null, "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "testDoContinue", + "arc4_method_config": { + "_type": "ARC4ABIMethodConfig", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 23, + "end_line": 23, + "column": 2, + "end_column": 43 + }, + "allowed_completion_types": [ + 0 + ], + "create": 3, + "name": "testDoContinue", + "readonly": false, + "default_args": {} + } + }, + { + "_type": "ContractMethod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 4, + "end_line": 4, + "column": 0, + "end_column": 43 + }, + "args": [], + "return_type": { + "_type": "WType", + "name": "void", + "immutable": true, + "ephemeral": false, + "scalar_type": null + }, + "body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 4, + "end_line": 4, + "column": 0, + "end_column": 43 + }, + "body": [], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": "Implicitly generated create method", + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "__algots__.defaultCreate", + "arc4_method_config": { + "_type": "ARC4BareMethodConfig", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 4, + "end_line": 4, + "column": 0, + "end_column": 43 + }, + "allowed_completion_types": [ + 0 + ], + "create": 2 } - ], - "label": null, - "comment": null - }, - "documentation": { - "_type": "MethodDocumentation", - "description": null, - "args": {}, - "returns": null + } + ], + "app_state": [], + "state_totals": { + "_type": "StateTotals", + "global_uints": null, + "local_uints": null, + "global_bytes": null, + "local_bytes": null }, - "inline": null, - "id": "tests/approvals/do-loops.algo.ts::test_do", - "name": "test_do" + "reserved_scratch_space": [], + "avm_version": null } ] \ No newline at end of file diff --git a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.approval.teal b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.approval.teal index a22465dfd..6673a9b03 100644 --- a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.approval.teal +++ b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.approval.teal @@ -155,7 +155,7 @@ test_for_loop_while_top@1: frame_dig 1 frame_dig -2 < - bz test_for_loop_after_while@4 + bz test_for_loop_after_while@3 // tests/approvals/for-loops.algo.ts:8 // total += i frame_dig 0 @@ -171,7 +171,7 @@ test_for_loop_while_top@1: frame_bury 1 b test_for_loop_while_top@1 -test_for_loop_after_while@4: +test_for_loop_after_while@3: // tests/approvals/for-loops.algo.ts:10 // return total retsub @@ -193,7 +193,7 @@ test_for_loop_break_while_top@1: frame_dig 1 frame_dig -2 < - bz test_for_loop_break_block@7 + bz test_for_loop_break_block@6 // tests/approvals/for-loops.algo.ts:16 // total += i frame_dig 0 @@ -205,7 +205,7 @@ test_for_loop_break_while_top@1: // if (total > 10) { pushint 10 // 10 > - bnz test_for_loop_break_block@7 + bnz test_for_loop_break_block@6 // tests/approvals/for-loops.algo.ts:15 // for (let i = start; i < stop; i += step) { frame_dig 1 @@ -214,7 +214,7 @@ test_for_loop_break_while_top@1: frame_bury 1 b test_for_loop_break_while_top@1 -test_for_loop_break_block@7: +test_for_loop_break_block@6: // tests/approvals/for-loops.algo.ts:21 // return total retsub @@ -282,7 +282,7 @@ test_for_loop_labelled_while_top@1: frame_dig 2 frame_dig -2 < - bz test_for_loop_labelled_block@12 + bz test_for_loop_labelled_block@9 frame_dig -3 frame_bury 0 @@ -292,21 +292,24 @@ test_for_loop_labelled_while_top@3: frame_dig 0 frame_dig -2 < - bz test_for_loop_labelled_after_while@8 + bz test_for_loop_labelled_after_while@7 // tests/approvals/for-loops.algo.ts:36 - // total += j + j + // total += i + j + frame_dig 2 + dup frame_dig 0 dup - dig 1 + cover 3 + frame_dig 1 + frame_bury 1 // tests/approvals/for-loops.algo.ts:38 - // if (j === start) break outer - frame_dig -3 - == - bnz test_for_loop_labelled_block@12 + // if (i * j > stop) break outer + * + frame_dig -2 + > + bnz test_for_loop_labelled_block@9 // tests/approvals/for-loops.algo.ts:35 // for (let j = start; j < stop; j += step) { frame_dig 0 @@ -315,14 +318,14 @@ test_for_loop_labelled_while_top@3: frame_bury 0 b test_for_loop_labelled_while_top@3 -test_for_loop_labelled_block@12: +test_for_loop_labelled_block@9: // tests/approvals/for-loops.algo.ts:41 // return total frame_dig 1 frame_bury 0 retsub -test_for_loop_labelled_after_while@8: +test_for_loop_labelled_after_while@7: // tests/approvals/for-loops.algo.ts:34 // outer: for (let i = start; i < stop; i += step) { frame_dig 2 diff --git a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.arc32.json b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.arc32.json index 91edb75c5..23db0d33f 100644 --- a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.arc32.json +++ b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.arc32.json @@ -22,7 +22,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAOQogICAgcHVzaGJ5dGVzcyAweGY4NjU0ZjczIDB4Mjg3ZjRjMDIgMHg0YmQ3Nzc4YyAweDMzNjc1ZTA2IC8vIG1ldGhvZCAidGVzdF9mb3JfbG9vcCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX2xvb3BfYnJlYWsodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9sYWJlbGxlZCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3Rlc3RfZm9yX2xvb3Bfcm91dGVAMyBtYWluX3Rlc3RfZm9yX2xvb3BfYnJlYWtfcm91dGVANCBtYWluX3Rlc3RfZm9yX2xvb3BfY29udGludWVfcm91dGVANSBtYWluX3Rlc3RfZm9yX2xvb3BfbGFiZWxsZWRfcm91dGVANgoKbWFpbl9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjQKICAgIC8vIHRlc3RfZm9yX2xvb3BfY29udGludWUoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3BfYnJlYWtfcm91dGVANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3BfYnJlYWsKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3AKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxMwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby50ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX2xvb3A6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NgogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMgogICAgPAogICAgYnogdGVzdF9mb3JfbG9vcF9hZnRlcl93aGlsZUA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OAogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGVzdF9mb3JfbG9vcF93aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9hZnRlcl93aGlsZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLnRlc3RfZm9yX2xvb3BfYnJlYWsoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdF9mb3JfbG9vcF9icmVhazoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTQKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF9icmVha193aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNgogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyBpZiAodG90YWwgPiAxMCkgewogICAgcHVzaGludCAxMCAvLyAxMAogICAgPgogICAgYm56IHRlc3RfZm9yX2xvb3BfYnJlYWtfYmxvY2tANwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE1CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX2JyZWFrX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI0CiAgICAvLyB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNQogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfY29udGludWVfYWZ0ZXJfd2hpbGVANgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBpZiAoaSAlIDUgPT09IDApIGNvbnRpbnVlCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCA1IC8vIDUKICAgICUKICAgIGJ6IHRlc3RfZm9yX2xvb3BfY29udGludWVfYmxvY2tANQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV9ibG9ja0A1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX3doaWxlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzAKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTMKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzQKICAgIC8vIG91dGVyOiBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYmxvY2tAMTIKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3doaWxlX3RvcEAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyBmb3IgKGxldCBqID0gc3RhcnQ7IGogPCBzdG9wOyBqICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYWZ0ZXJfd2hpbGVAOAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM2CiAgICAvLyB0b3RhbCArPSBqICsgagogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozOAogICAgLy8gaWYgKGogPT09IHN0YXJ0KSBicmVhayBvdXRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYm56IHRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYmxvY2tAMTIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMwoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9ibG9ja0AxMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYWZ0ZXJfd2hpbGVAODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNAogICAgLy8gb3V0ZXI6IGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfdG9wQDEK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAOQogICAgcHVzaGJ5dGVzcyAweGY4NjU0ZjczIDB4Mjg3ZjRjMDIgMHg0YmQ3Nzc4YyAweDMzNjc1ZTA2IC8vIG1ldGhvZCAidGVzdF9mb3JfbG9vcCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX2xvb3BfYnJlYWsodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9sYWJlbGxlZCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3Rlc3RfZm9yX2xvb3Bfcm91dGVAMyBtYWluX3Rlc3RfZm9yX2xvb3BfYnJlYWtfcm91dGVANCBtYWluX3Rlc3RfZm9yX2xvb3BfY29udGludWVfcm91dGVANSBtYWluX3Rlc3RfZm9yX2xvb3BfbGFiZWxsZWRfcm91dGVANgoKbWFpbl9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjQKICAgIC8vIHRlc3RfZm9yX2xvb3BfY29udGludWUoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3BfYnJlYWtfcm91dGVANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3BfYnJlYWsKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3AKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxMwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby50ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX2xvb3A6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NgogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMgogICAgPAogICAgYnogdGVzdF9mb3JfbG9vcF9hZnRlcl93aGlsZUAzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OAogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGVzdF9mb3JfbG9vcF93aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9hZnRlcl93aGlsZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLnRlc3RfZm9yX2xvb3BfYnJlYWsoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdF9mb3JfbG9vcF9icmVhazoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTQKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF9icmVha193aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDYKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNgogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyBpZiAodG90YWwgPiAxMCkgewogICAgcHVzaGludCAxMCAvLyAxMAogICAgPgogICAgYm56IHRlc3RfZm9yX2xvb3BfYnJlYWtfYmxvY2tANgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE1CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX2JyZWFrX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI0CiAgICAvLyB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNQogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfY29udGludWVfYWZ0ZXJfd2hpbGVANgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBpZiAoaSAlIDUgPT09IDApIGNvbnRpbnVlCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCA1IC8vIDUKICAgICUKICAgIGJ6IHRlc3RfZm9yX2xvb3BfY29udGludWVfYmxvY2tANQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV9ibG9ja0A1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX3doaWxlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzAKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTMKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzQKICAgIC8vIG91dGVyOiBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYmxvY2tAOQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfdG9wQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIGZvciAobGV0IGogPSBzdGFydDsgaiA8IHN0b3A7IGogKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPAogICAgYnogdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUA3CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzYKICAgIC8vIHRvdGFsICs9IGkgKyBqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzgKICAgIC8vIGlmIChpICogaiA+IHN0b3ApIGJyZWFrIG91dGVyCiAgICAqCiAgICBmcmFtZV9kaWcgLTIKICAgID4KICAgIGJueiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2Jsb2NrQDkKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMwoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9ibG9ja0A5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQxCiAgICAvLyByZXR1cm4gdG90YWwKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUA3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyBvdXRlcjogZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.arc56.json b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.arc56.json index 4b1bad231..3dfa1cef4 100644 --- a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.arc56.json +++ b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.arc56.json @@ -188,11 +188,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAOQogICAgcHVzaGJ5dGVzcyAweGY4NjU0ZjczIDB4Mjg3ZjRjMDIgMHg0YmQ3Nzc4YyAweDMzNjc1ZTA2IC8vIG1ldGhvZCAidGVzdF9mb3JfbG9vcCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX2xvb3BfYnJlYWsodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9sYWJlbGxlZCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3Rlc3RfZm9yX2xvb3Bfcm91dGVAMyBtYWluX3Rlc3RfZm9yX2xvb3BfYnJlYWtfcm91dGVANCBtYWluX3Rlc3RfZm9yX2xvb3BfY29udGludWVfcm91dGVANSBtYWluX3Rlc3RfZm9yX2xvb3BfbGFiZWxsZWRfcm91dGVANgoKbWFpbl9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjQKICAgIC8vIHRlc3RfZm9yX2xvb3BfY29udGludWUoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3BfYnJlYWtfcm91dGVANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3BfYnJlYWsKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3AKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxMwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby50ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX2xvb3A6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NgogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMgogICAgPAogICAgYnogdGVzdF9mb3JfbG9vcF9hZnRlcl93aGlsZUA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OAogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGVzdF9mb3JfbG9vcF93aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9hZnRlcl93aGlsZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLnRlc3RfZm9yX2xvb3BfYnJlYWsoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdF9mb3JfbG9vcF9icmVhazoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTQKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF9icmVha193aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNgogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyBpZiAodG90YWwgPiAxMCkgewogICAgcHVzaGludCAxMCAvLyAxMAogICAgPgogICAgYm56IHRlc3RfZm9yX2xvb3BfYnJlYWtfYmxvY2tANwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE1CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX2JyZWFrX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI0CiAgICAvLyB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNQogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfY29udGludWVfYWZ0ZXJfd2hpbGVANgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBpZiAoaSAlIDUgPT09IDApIGNvbnRpbnVlCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCA1IC8vIDUKICAgICUKICAgIGJ6IHRlc3RfZm9yX2xvb3BfY29udGludWVfYmxvY2tANQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV9ibG9ja0A1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX3doaWxlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzAKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTMKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzQKICAgIC8vIG91dGVyOiBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYmxvY2tAMTIKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfYnVyeSAwCgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3doaWxlX3RvcEAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyBmb3IgKGxldCBqID0gc3RhcnQ7IGogPCBzdG9wOyBqICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYWZ0ZXJfd2hpbGVAOAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM2CiAgICAvLyB0b3RhbCArPSBqICsgagogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozOAogICAgLy8gaWYgKGogPT09IHN0YXJ0KSBicmVhayBvdXRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYm56IHRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYmxvY2tAMTIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMwoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9ibG9ja0AxMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYWZ0ZXJfd2hpbGVAODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNAogICAgLy8gb3V0ZXI6IGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZnJhbWVfYnVyeSAyCiAgICBiIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfdG9wQDEK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAOQogICAgcHVzaGJ5dGVzcyAweGY4NjU0ZjczIDB4Mjg3ZjRjMDIgMHg0YmQ3Nzc4YyAweDMzNjc1ZTA2IC8vIG1ldGhvZCAidGVzdF9mb3JfbG9vcCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX2xvb3BfYnJlYWsodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9sYWJlbGxlZCh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3Rlc3RfZm9yX2xvb3Bfcm91dGVAMyBtYWluX3Rlc3RfZm9yX2xvb3BfYnJlYWtfcm91dGVANCBtYWluX3Rlc3RfZm9yX2xvb3BfY29udGludWVfcm91dGVANSBtYWluX3Rlc3RfZm9yX2xvb3BfbGFiZWxsZWRfcm91dGVANgoKbWFpbl9hZnRlcl9pZl9lbHNlQDEzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjQKICAgIC8vIHRlc3RfZm9yX2xvb3BfY29udGludWUoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3BfYnJlYWtfcm91dGVANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3BfYnJlYWsKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3AKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxMwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby50ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX2xvb3A6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NgogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMgogICAgPAogICAgYnogdGVzdF9mb3JfbG9vcF9hZnRlcl93aGlsZUAzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OAogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGVzdF9mb3JfbG9vcF93aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9hZnRlcl93aGlsZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLnRlc3RfZm9yX2xvb3BfYnJlYWsoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdF9mb3JfbG9vcF9icmVhazoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTQKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF9icmVha193aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDYKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNgogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyBpZiAodG90YWwgPiAxMCkgewogICAgcHVzaGludCAxMCAvLyAxMAogICAgPgogICAgYm56IHRlc3RfZm9yX2xvb3BfYnJlYWtfYmxvY2tANgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE1CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX2JyZWFrX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI0CiAgICAvLyB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNQogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfY29udGludWVfYWZ0ZXJfd2hpbGVANgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBpZiAoaSAlIDUgPT09IDApIGNvbnRpbnVlCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCA1IC8vIDUKICAgICUKICAgIGJ6IHRlc3RfZm9yX2xvb3BfY29udGludWVfYmxvY2tANQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV9ibG9ja0A1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX3doaWxlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzAKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTMKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzQKICAgIC8vIG91dGVyOiBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYmxvY2tAOQogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9idXJ5IDAKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfdG9wQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIGZvciAobGV0IGogPSBzdGFydDsgaiA8IHN0b3A7IGogKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAtMgogICAgPAogICAgYnogdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUA3CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzYKICAgIC8vIHRvdGFsICs9IGkgKyBqCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzgKICAgIC8vIGlmIChpICogaiA+IHN0b3ApIGJyZWFrIG91dGVyCiAgICAqCiAgICBmcmFtZV9kaWcgLTIKICAgID4KICAgIGJueiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2Jsb2NrQDkKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMwoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9ibG9ja0A5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQxCiAgICAvLyByZXR1cm4gdG90YWwKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUA3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyBvdXRlcjogZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CiACAAEmAQQVH3x1MRtBAJmCBAT4ZU9zBCh/TAIES9d3jAQzZ14GNhoAjgQAWQA8AB8AAiJDMRkURDEYRDYaARc2GgIXNhoDF4gA2RYoTFCwI0MxGRREMRhENhoBFzYaAhc2GgMXiACUFihMULAjQzEZFEQxGEQ2GgEXNhoCFzYaAxeIAFAWKExQsCNDMRkURDEYRDYaARc2GgIXNhoDF4gAEhYoTFCwI0MxGUD/hTEYFEQjQ4oDASKL/YsBi/4MQQASiwCLAUlOAgiMAIv/CIwBQv/miYoDASKL/YsBi/4MQQAYiwCLAQhJjACBCg1AAAqLAYv/CIwBQv/giYoDASKL/YsBi/4MQQAZiwGBBRhBAAeLAIsBCIwAiwGL/wiMAUL/34mKAwGAACKL/YsCi/4MQQAni/2MAIsAi/4MQQAgiwBJSwEIiwEIjAGL/RJAAAqLAIv/CIwAQv/diwGMAImLAov/CIwCQv/C", + "approval": "CiACAAEmAQQVH3x1MRtBAJmCBAT4ZU9zBCh/TAIES9d3jAQzZ14GNhoAjgQAWQA8AB8AAiJDMRkURDEYRDYaARc2GgIXNhoDF4gA2RYoTFCwI0MxGRREMRhENhoBFzYaAhc2GgMXiACUFihMULAjQzEZFEQxGEQ2GgEXNhoCFzYaAxeIAFAWKExQsCNDMRkURDEYRDYaARc2GgIXNhoDF4gAEhYoTFCwI0MxGUD/hTEYFEQjQ4oDASKL/YsBi/4MQQASiwCLAUlOAgiMAIv/CIwBQv/miYoDASKL/YsBi/4MQQAYiwCLAQhJjACBCg1AAAqLAYv/CIwBQv/giYoDASKL/YsBi/4MQQAZiwGBBRhBAAeLAIsBCIwAiwGL/wiMAUL/34mKAwGAACKL/YsCi/4MQQAri/2MAIsAi/4MQQAkiwJJiwBJTgMIiwEIjAELi/4NQAAKiwCL/wiMAEL/2YsBjACJiwKL/wiMAkL/vg==", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir index 81d570a21..4e49d3d8c 100644 --- a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir +++ b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir @@ -109,19 +109,15 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop(start: let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@3) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let total#2: uint64 = (+ total#1 i#1) - goto block@3 - block@3: // L7 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@4: // after_while_L7 - goto block@5 - block@5: // L7 + block@3: // after_while_L7 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -130,26 +126,24 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(s let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L15 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@5) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@6 + goto tmp%0#0 ? block@2 : block@5 block@2: // while_body_L15 let total#2: uint64 = (+ total#1 i#1) let tmp%1#0: bool = (> total#2 10u) goto tmp%1#0 ? block@3 : block@4 block@3: // if_body_L17 - goto block@7 + goto block@6 block@4: // after_if_else_L17 - goto block@5 - block@5: // L15 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@6: // after_while_L15 - goto block@7 - block@7: // L15 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@6) - return total#4 + block@5: // after_while_L15 + goto block@6 + block@6: // L15 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@5) + return total#3 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continue(start: uint64, stop: uint64, step: uint64) -> uint64: block@0: // L24 @@ -175,8 +169,6 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continu let i#3: uint64 = (+ i#1 step#0) goto block@1 block@6: // after_while_L26 - goto block@7 - block@7: // L26 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelled(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -185,42 +177,37 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelle let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L34 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@10) - let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@10) + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@7) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@11 + goto tmp%0#0 ? block@2 : block@8 block@2: // while_body_L34 let j#0: uint64 = start#0 goto block@3 block@3: // while_top_L35 - let j#1: uint64 = φ(j#0 <- block@2, j#3 <- block@7) - let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@7) + let j#1: uint64 = φ(j#0 <- block@2, j#2 <- block@6) + let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@6) let tmp%1#0: bool = (< j#1 stop#0) - goto tmp%1#0 ? block@4 : block@8 + goto tmp%1#0 ? block@4 : block@7 block@4: // while_body_L35 - let tmp%2#0: uint64 = (+ j#1 j#1) + let tmp%2#0: uint64 = (+ i#1 j#1) let total#2: uint64 = (+ total#1 tmp%2#0) - let tmp%3#0: bool = (== j#1 start#0) - goto tmp%3#0 ? block@5 : block@6 + let tmp%3#0: uint64 = (* i#1 j#1) + let tmp%4#0: bool = (> tmp%3#0 stop#0) + goto tmp%4#0 ? block@5 : block@6 block@5: // if_body_L38 - goto block@12 + goto block@9 block@6: // after_if_else_L38 - goto block@7 - block@7: // L35 - let j#3: uint64 = (+ j#1 step#0) + let j#2: uint64 = (+ j#1 step#0) goto block@3 - block@8: // after_while_L35 - goto block@9 - block@9: // L35 - goto block@10 - block@10: // L34 + block@7: // after_while_L35 let i#3: uint64 = (+ i#1 step#0) goto block@1 - block@11: // after_while_L34 - goto block@12 - block@12: // L34 - let total#6: uint64 = φ(total#2 <- block@5, total#3 <- block@11) - return total#6 + block@8: // after_while_L34 + goto block@9 + block@9: // L34 + let total#4: uint64 = φ(total#2 <- block@5, total#3 <- block@8) + return total#4 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__algots__.defaultCreate() -> void: block@0: // L4 diff --git a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir index fc27baf2a..599bf4c19 100644 --- a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir +++ b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir @@ -98,15 +98,15 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop(start: let total#0: uint64 = 0u goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(start#0 <- block@0, i#3 <- block@2) + let i#1: uint64 = φ(start#0 <- block@0, i#2 <- block@2) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let total#2: uint64 = (+ total#1 i#1) - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@4: // after_while_L7 + block@3: // after_while_L7 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -114,24 +114,24 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(s let total#0: uint64 = 0u goto block@1 block@1: // while_top_L15 - let i#1: uint64 = φ(start#0 <- block@0, i#3 <- block@4) + let i#1: uint64 = φ(start#0 <- block@0, i#2 <- block@4) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@6 + goto tmp%0#0 ? block@2 : block@5 block@2: // while_body_L15 let total#2: uint64 = (+ total#1 i#1) let tmp%1#0: bool = (> total#2 10u) goto tmp%1#0 ? block@3 : block@4 block@3: // if_body_L17 - goto block@7 + goto block@6 block@4: // after_if_else_L17 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@6: // after_while_L15 - goto block@7 - block@7: // L15 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@6) - return total#4 + block@5: // after_while_L15 + goto block@6 + block@6: // L15 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@5) + return total#3 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continue(start: uint64, stop: uint64, step: uint64) -> uint64: block@0: // L24 @@ -162,32 +162,33 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelle let total#0: uint64 = 0u goto block@1 block@1: // while_top_L34 - let i#1: uint64 = φ(start#0 <- block@0, i#3 <- block@8) - let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@8) + let i#1: uint64 = φ(start#0 <- block@0, i#3 <- block@7) + let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@7) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@11 + goto tmp%0#0 ? block@2 : block@8 block@2: // while_body_L34 goto block@3 block@3: // while_top_L35 - let j#1: uint64 = φ(start#0 <- block@2, j#3 <- block@6) + let j#1: uint64 = φ(start#0 <- block@2, j#2 <- block@6) let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@6) let tmp%1#0: bool = (< j#1 stop#0) - goto tmp%1#0 ? block@4 : block@8 + goto tmp%1#0 ? block@4 : block@7 block@4: // while_body_L35 - let tmp%2#0: uint64 = (+ j#1 j#1) + let tmp%2#0: uint64 = (+ i#1 j#1) let total#2: uint64 = (+ total#1 tmp%2#0) - let tmp%3#0: bool = (== j#1 start#0) - goto tmp%3#0 ? block@5 : block@6 + let tmp%3#0: uint64 = (* i#1 j#1) + let tmp%4#0: bool = (> tmp%3#0 stop#0) + goto tmp%4#0 ? block@5 : block@6 block@5: // if_body_L38 - goto block@12 + goto block@9 block@6: // after_if_else_L38 - let j#3: uint64 = (+ j#1 step#0) + let j#2: uint64 = (+ j#1 step#0) goto block@3 - block@8: // after_while_L35 + block@7: // after_while_L35 let i#3: uint64 = (+ i#1 step#0) goto block@1 - block@11: // after_while_L34 - goto block@12 - block@12: // L34 - let total#6: uint64 = φ(total#2 <- block@5, total#3 <- block@11) - return total#6 \ No newline at end of file + block@8: // after_while_L34 + goto block@9 + block@9: // L34 + let total#4: uint64 = φ(total#2 <- block@5, total#3 <- block@8) + return total#4 \ No newline at end of file diff --git a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir index fc27baf2a..599bf4c19 100644 --- a/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir +++ b/tests/approvals/out/o1/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir @@ -98,15 +98,15 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop(start: let total#0: uint64 = 0u goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(start#0 <- block@0, i#3 <- block@2) + let i#1: uint64 = φ(start#0 <- block@0, i#2 <- block@2) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let total#2: uint64 = (+ total#1 i#1) - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@4: // after_while_L7 + block@3: // after_while_L7 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -114,24 +114,24 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(s let total#0: uint64 = 0u goto block@1 block@1: // while_top_L15 - let i#1: uint64 = φ(start#0 <- block@0, i#3 <- block@4) + let i#1: uint64 = φ(start#0 <- block@0, i#2 <- block@4) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@6 + goto tmp%0#0 ? block@2 : block@5 block@2: // while_body_L15 let total#2: uint64 = (+ total#1 i#1) let tmp%1#0: bool = (> total#2 10u) goto tmp%1#0 ? block@3 : block@4 block@3: // if_body_L17 - goto block@7 + goto block@6 block@4: // after_if_else_L17 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@6: // after_while_L15 - goto block@7 - block@7: // L15 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@6) - return total#4 + block@5: // after_while_L15 + goto block@6 + block@6: // L15 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@5) + return total#3 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continue(start: uint64, stop: uint64, step: uint64) -> uint64: block@0: // L24 @@ -162,32 +162,33 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelle let total#0: uint64 = 0u goto block@1 block@1: // while_top_L34 - let i#1: uint64 = φ(start#0 <- block@0, i#3 <- block@8) - let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@8) + let i#1: uint64 = φ(start#0 <- block@0, i#3 <- block@7) + let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@7) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@11 + goto tmp%0#0 ? block@2 : block@8 block@2: // while_body_L34 goto block@3 block@3: // while_top_L35 - let j#1: uint64 = φ(start#0 <- block@2, j#3 <- block@6) + let j#1: uint64 = φ(start#0 <- block@2, j#2 <- block@6) let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@6) let tmp%1#0: bool = (< j#1 stop#0) - goto tmp%1#0 ? block@4 : block@8 + goto tmp%1#0 ? block@4 : block@7 block@4: // while_body_L35 - let tmp%2#0: uint64 = (+ j#1 j#1) + let tmp%2#0: uint64 = (+ i#1 j#1) let total#2: uint64 = (+ total#1 tmp%2#0) - let tmp%3#0: bool = (== j#1 start#0) - goto tmp%3#0 ? block@5 : block@6 + let tmp%3#0: uint64 = (* i#1 j#1) + let tmp%4#0: bool = (> tmp%3#0 stop#0) + goto tmp%4#0 ? block@5 : block@6 block@5: // if_body_L38 - goto block@12 + goto block@9 block@6: // after_if_else_L38 - let j#3: uint64 = (+ j#1 step#0) + let j#2: uint64 = (+ j#1 step#0) goto block@3 - block@8: // after_while_L35 + block@7: // after_while_L35 let i#3: uint64 = (+ i#1 step#0) goto block@1 - block@11: // after_while_L34 - goto block@12 - block@12: // L34 - let total#6: uint64 = φ(total#2 <- block@5, total#3 <- block@11) - return total#6 \ No newline at end of file + block@8: // after_while_L34 + goto block@9 + block@9: // L34 + let total#4: uint64 = φ(total#2 <- block@5, total#3 <- block@8) + return total#4 \ No newline at end of file diff --git a/tests/approvals/out/o1/for-loops/for-loops.awst b/tests/approvals/out/o1/for-loops/for-loops.awst index bc7bac843..615b14884 100644 --- a/tests/approvals/out/o1/for-loops/for-loops.awst +++ b/tests/approvals/out/o1/for-loops/for-loops.awst @@ -16,10 +16,8 @@ contract ForLoopsAlgo i: uint64 = start while (i < stop) { total: uint64 = total + i - #loop₁ᶜ: i: uint64 = i + step } - #loop₁ᵇ: return total } @@ -32,7 +30,6 @@ contract ForLoopsAlgo if (total > 10) { goto #loop₁ᵇ } - #loop₁ᶜ: i: uint64 = i + step } #loop₁ᵇ: @@ -51,7 +48,6 @@ contract ForLoopsAlgo #loop₁ᶜ: i: uint64 = i + step } - #loop₁ᵇ: return total } @@ -62,15 +58,12 @@ contract ForLoopsAlgo while (i < stop) { j: uint64 = start while (j < stop) { - total: uint64 = total + j + j - if (j == start) { + total: uint64 = total + i + j + if (i * j > stop) { goto outer₁ᵇ } - #loop₁ᶜ: j: uint64 = j + step } - #loop₁ᵇ: - outer₁ᶜ: i: uint64 = i + step } outer₁ᵇ: diff --git a/tests/approvals/out/o1/for-loops/for-loops.awst.json b/tests/approvals/out/o1/for-loops/for-loops.awst.json index b6894a1d1..ad319f754 100644 --- a/tests/approvals/out/o1/for-loops/for-loops.awst.json +++ b/tests/approvals/out/o1/for-loops/for-loops.awst.json @@ -507,19 +507,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { @@ -607,19 +594,6 @@ "comment": null } }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null - }, { "_type": "ReturnStatement", "source_location": { @@ -1128,19 +1102,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 15, - "end_line": 15, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { @@ -1872,19 +1833,6 @@ "comment": null } }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 26, - "end_line": 26, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null - }, { "_type": "ReturnStatement", "source_location": { @@ -2425,7 +2373,7 @@ "ephemeral": false, "scalar_type": 2 }, - "name": "j" + "name": "i" }, "op": "+", "right": { @@ -2456,7 +2404,7 @@ "line": 38, "end_line": 38, "column": 8, - "end_column": 24 + "end_column": 25 }, "condition": { "_type": "NumericComparisonExpression", @@ -2465,7 +2413,7 @@ "line": 38, "end_line": 38, "column": 12, - "end_column": 23 + "end_column": 24 }, "wtype": { "_type": "WType", @@ -2475,13 +2423,13 @@ "scalar_type": 2 }, "lhs": { - "_type": "VarExpression", + "_type": "UInt64BinaryOperation", "source_location": { "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, "column": 12, - "end_column": 13 + "end_column": 17 }, "wtype": { "_type": "WType", @@ -2490,17 +2438,53 @@ "ephemeral": false, "scalar_type": 2 }, - "name": "j" + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/for-loops.algo.ts", + "line": 38, + "end_line": 38, + "column": 12, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "*", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/for-loops.algo.ts", + "line": 38, + "end_line": 38, + "column": 16, + "end_column": 17 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "j" + } }, - "operator": "==", + "operator": ">", "rhs": { "_type": "VarExpression", "source_location": { "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, - "column": 18, - "end_column": 23 + "column": 20, + "end_column": 24 }, "wtype": { "_type": "WType", @@ -2509,7 +2493,7 @@ "ephemeral": false, "scalar_type": 2 }, - "name": "start" + "name": "stop" } }, "if_branch": { @@ -2518,8 +2502,8 @@ "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, - "column": 25, - "end_column": 36 + "column": 26, + "end_column": 37 }, "body": [ { @@ -2528,8 +2512,8 @@ "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, - "column": 25, - "end_column": 36 + "column": 26, + "end_column": 37 }, "target": "outer₁ᵇ" } @@ -2543,19 +2527,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 35, - "end_line": 35, - "column": 6, - "end_column": 46 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { @@ -2642,37 +2613,11 @@ "label": null, "comment": null } - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 35, - "end_line": 35, - "column": 6, - "end_column": 46 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null } ], "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 34, - "end_line": 34, - "column": 11, - "end_column": 51 - }, - "body": [], - "label": "outer₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { diff --git a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.approval.teal b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.approval.teal index 88ccd48a4..aea53eb78 100644 --- a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.approval.teal +++ b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.approval.teal @@ -183,24 +183,24 @@ test_for_of_loop_tuple_for_body@1: // tests/approvals/for-of-loops.algo.ts:12 // if (item === stopNumber) break == - bnz test_for_of_loop_tuple_block@9 + bnz test_for_of_loop_tuple_block@8 // tests/approvals/for-of-loops.algo.ts:10 // for (const item of items) { frame_dig 1 - switch test_for_of_loop_tuple_for_header_1@6 test_for_of_loop_tuple_for_header_2@7 + switch test_for_of_loop_tuple_for_header_1@5 test_for_of_loop_tuple_for_header_2@6 -test_for_of_loop_tuple_block@9: +test_for_of_loop_tuple_block@8: // tests/approvals/for-of-loops.algo.ts:14 // return total retsub -test_for_of_loop_tuple_for_header_2@7: +test_for_of_loop_tuple_for_header_2@6: pushint 2 // 2 frame_bury 1 frame_dig -1 b test_for_of_loop_tuple_for_body@1 -test_for_of_loop_tuple_for_header_1@6: +test_for_of_loop_tuple_for_header_1@5: intc_1 // 1 frame_bury 1 frame_dig -2 @@ -228,7 +228,7 @@ test_for_of_loop_arc4_dynamic_array_for_header@1: frame_dig 2 frame_dig 1 < - bz test_for_of_loop_arc4_dynamic_array_block@8 + bz test_for_of_loop_arc4_dynamic_array_block@7 frame_dig -1 extract 2 0 frame_dig 2 @@ -247,14 +247,14 @@ test_for_of_loop_arc4_dynamic_array_for_header@1: // tests/approvals/for-of-loops.algo.ts:21 // if (item.native === stopNumber) break == - bnz test_for_of_loop_arc4_dynamic_array_block@8 + bnz test_for_of_loop_arc4_dynamic_array_block@7 frame_dig 2 intc_1 // 1 + frame_bury 2 b test_for_of_loop_arc4_dynamic_array_for_header@1 -test_for_of_loop_arc4_dynamic_array_block@8: +test_for_of_loop_arc4_dynamic_array_block@7: // tests/approvals/for-of-loops.algo.ts:23 // return total retsub @@ -276,7 +276,7 @@ test_for_of_loop_arc4_static_array_for_header@1: frame_dig 1 pushint 5 // 5 < - bz test_for_of_loop_arc4_static_array_block@8 + bz test_for_of_loop_arc4_static_array_block@7 frame_dig 1 intc_2 // 8 * @@ -295,14 +295,14 @@ test_for_of_loop_arc4_static_array_for_header@1: // tests/approvals/for-of-loops.algo.ts:30 // if (item.native === stopNumber) break == - bnz test_for_of_loop_arc4_static_array_block@8 + bnz test_for_of_loop_arc4_static_array_block@7 frame_dig 1 intc_1 // 1 + frame_bury 1 b test_for_of_loop_arc4_static_array_for_header@1 -test_for_of_loop_arc4_static_array_block@8: +test_for_of_loop_arc4_static_array_block@7: // tests/approvals/for-of-loops.algo.ts:32 // return total retsub @@ -329,7 +329,7 @@ test_for_of_loop_native_immutable_array_for_header@1: frame_dig 2 frame_dig 1 < - bz test_for_of_loop_native_immutable_array_block@8 + bz test_for_of_loop_native_immutable_array_block@7 frame_dig -1 extract 2 0 frame_dig 2 @@ -348,14 +348,14 @@ test_for_of_loop_native_immutable_array_for_header@1: // tests/approvals/for-of-loops.algo.ts:39 // if (item === stopNumber) break == - bnz test_for_of_loop_native_immutable_array_block@8 + bnz test_for_of_loop_native_immutable_array_block@7 frame_dig 2 intc_1 // 1 + frame_bury 2 b test_for_of_loop_native_immutable_array_for_header@1 -test_for_of_loop_native_immutable_array_block@8: +test_for_of_loop_native_immutable_array_block@7: // tests/approvals/for-of-loops.algo.ts:41 // return total retsub @@ -398,7 +398,7 @@ test_for_of_loop_native_mutable_array_for_header@1: frame_dig 3 frame_dig 2 < - bz test_for_of_loop_native_mutable_array_block@8 + bz test_for_of_loop_native_mutable_array_block@7 frame_dig 0 frame_dig 3 intc_2 // 8 @@ -419,14 +419,14 @@ test_for_of_loop_native_mutable_array_for_header@1: // tests/approvals/for-of-loops.algo.ts:49 // if (item === stopNumber) break == - bnz test_for_of_loop_native_mutable_array_block@8 + bnz test_for_of_loop_native_mutable_array_block@7 frame_dig 3 intc_1 // 1 + frame_bury 3 b test_for_of_loop_native_mutable_array_for_header@1 -test_for_of_loop_native_mutable_array_block@8: +test_for_of_loop_native_mutable_array_block@7: // tests/approvals/for-of-loops.algo.ts:51 // return total frame_dig 1 diff --git a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.arc32.json b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.arc32.json index 055bb84b5..d6b905b88 100644 --- a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.arc32.json +++ b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.arc32.json @@ -27,7 +27,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNDIKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMAogICAgcHVzaGJ5dGVzcyAweGNmMWYyMGI4IDB4OGMxNmVlODcgMHhiMmM3NTNiZiAweGQxYjViZWVlIDB4YTFjYzBkOTQgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheSh1aW50NjRbXSl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkodWludDY0WzVdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheSgodWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9yb3V0ZUAzIG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXlfcm91dGVANCBtYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANSBtYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9yb3V0ZUA2IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9yb3V0ZUA3CgptYWluX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X3JvdXRlQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IEFycmF5PHVpbnQ2ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheShpdGVtczogRHluYW1pY0FycmF5PFVpbnRONjQ+KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXMuMDogdWludDY0LCBpdGVtcy4xOiB1aW50NjQsIGl0ZW1zLjI6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OQogICAgLy8gbGV0IHRvdGFsOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTMKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2JvZHlAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMQogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDAKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Jsb2NrQDkKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMAogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgMQogICAgc3dpdGNoIHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8xQDYgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANwoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9ibG9ja0A5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE0CiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANzoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyAtMQogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9ib2R5QDEKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8xQDY6CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheShpdGVtczogYnl0ZXMpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE4CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTkKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTkKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A4CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyMAogICAgLy8gdG90YWwgKz0gaXRlbS5uYXRpdmUKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjUKICAgIC8vIGNvbnN0IHN0b3BOdW1iZXI6IHVpbnQ2NCA9IDQyCiAgICBpbnRjXzMgLy8gNDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyMQogICAgLy8gaWYgKGl0ZW0ubmF0aXZlID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A4CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfaGVhZGVyQDEKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Jsb2NrQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBTdGF0aWNBcnJheTxVaW50TjY0LCA1PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Jsb2NrQDgKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbCArPSBpdGVtLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDAKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzAKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgID09CiAgICBibnogdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A4CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A4OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo6Rm9yT2ZMb29wc0FsZ28udGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzYKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tAOAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM4CiAgICAvLyB0b3RhbCArPSBpdGVtCiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjUKICAgIC8vIGNvbnN0IHN0b3BOdW1iZXI6IHVpbnQ2NCA9IDQyCiAgICBpbnRjXzMgLy8gNDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozOQogICAgLy8gaWYgKGl0ZW0gPT09IHN0b3BOdW1iZXIpIGJyZWFrCiAgICA9PQogICAgYm56IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9ibG9ja0A4CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tAODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXMuMDogdWludDY0LCBpdGVtcy4xOiB1aW50NjQsIGl0ZW1zLjI6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ0CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5KGl0ZW1zOiBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ2CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYmxvY2tAOAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0OAogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDEKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDkKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Jsb2NrQDgKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Jsb2NrQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NTEKICAgIC8vIHJldHVybiB0b3RhbAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNDIKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMAogICAgcHVzaGJ5dGVzcyAweGNmMWYyMGI4IDB4OGMxNmVlODcgMHhiMmM3NTNiZiAweGQxYjViZWVlIDB4YTFjYzBkOTQgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheSh1aW50NjRbXSl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkodWludDY0WzVdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheSgodWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9yb3V0ZUAzIG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXlfcm91dGVANCBtYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANSBtYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9yb3V0ZUA2IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9yb3V0ZUA3CgptYWluX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X3JvdXRlQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IEFycmF5PHVpbnQ2ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheShpdGVtczogRHluYW1pY0FycmF5PFVpbnRONjQ+KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXMuMDogdWludDY0LCBpdGVtcy4xOiB1aW50NjQsIGl0ZW1zLjI6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OQogICAgLy8gbGV0IHRvdGFsOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTMKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2JvZHlAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMQogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDAKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Jsb2NrQDgKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMAogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgMQogICAgc3dpdGNoIHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8xQDUgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9ibG9ja0A4OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE0CiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANjoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyAtMQogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9ib2R5QDEKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8xQDU6CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheShpdGVtczogYnl0ZXMpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE4CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTkKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTkKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyMAogICAgLy8gdG90YWwgKz0gaXRlbS5uYXRpdmUKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjUKICAgIC8vIGNvbnN0IHN0b3BOdW1iZXI6IHVpbnQ2NCA9IDQyCiAgICBpbnRjXzMgLy8gNDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyMQogICAgLy8gaWYgKGl0ZW0ubmF0aXZlID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A3CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfaGVhZGVyQDEKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Jsb2NrQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBTdGF0aWNBcnJheTxVaW50TjY0LCA1PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Jsb2NrQDcKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbCArPSBpdGVtLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDAKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzAKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgID09CiAgICBibnogdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A3CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo6Rm9yT2ZMb29wc0FsZ28udGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzYKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM4CiAgICAvLyB0b3RhbCArPSBpdGVtCiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjUKICAgIC8vIGNvbnN0IHN0b3BOdW1iZXI6IHVpbnQ2NCA9IDQyCiAgICBpbnRjXzMgLy8gNDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozOQogICAgLy8gaWYgKGl0ZW0gPT09IHN0b3BOdW1iZXIpIGJyZWFrCiAgICA9PQogICAgYm56IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9ibG9ja0A3CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXMuMDogdWludDY0LCBpdGVtcy4xOiB1aW50NjQsIGl0ZW1zLjI6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ0CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5KGl0ZW1zOiBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ2CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYmxvY2tANwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0OAogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDEKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDkKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Jsb2NrQDcKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Jsb2NrQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NTEKICAgIC8vIHJldHVybiB0b3RhbAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.arc56.json b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.arc56.json index a6de5aae4..f7d973653 100644 --- a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.arc56.json +++ b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.arc56.json @@ -179,7 +179,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNDIKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMAogICAgcHVzaGJ5dGVzcyAweGNmMWYyMGI4IDB4OGMxNmVlODcgMHhiMmM3NTNiZiAweGQxYjViZWVlIDB4YTFjYzBkOTQgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheSh1aW50NjRbXSl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkodWludDY0WzVdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheSgodWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9yb3V0ZUAzIG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXlfcm91dGVANCBtYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANSBtYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9yb3V0ZUA2IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9yb3V0ZUA3CgptYWluX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X3JvdXRlQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IEFycmF5PHVpbnQ2ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheShpdGVtczogRHluYW1pY0FycmF5PFVpbnRONjQ+KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXMuMDogdWludDY0LCBpdGVtcy4xOiB1aW50NjQsIGl0ZW1zLjI6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OQogICAgLy8gbGV0IHRvdGFsOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTMKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2JvZHlAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMQogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDAKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Jsb2NrQDkKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMAogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgMQogICAgc3dpdGNoIHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8xQDYgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANwoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9ibG9ja0A5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE0CiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANzoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyAtMQogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9ib2R5QDEKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8xQDY6CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheShpdGVtczogYnl0ZXMpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE4CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTkKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTkKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A4CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyMAogICAgLy8gdG90YWwgKz0gaXRlbS5uYXRpdmUKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjUKICAgIC8vIGNvbnN0IHN0b3BOdW1iZXI6IHVpbnQ2NCA9IDQyCiAgICBpbnRjXzMgLy8gNDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyMQogICAgLy8gaWYgKGl0ZW0ubmF0aXZlID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A4CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfaGVhZGVyQDEKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Jsb2NrQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBTdGF0aWNBcnJheTxVaW50TjY0LCA1PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Jsb2NrQDgKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbCArPSBpdGVtLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDAKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzAKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgID09CiAgICBibnogdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A4CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A4OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo6Rm9yT2ZMb29wc0FsZ28udGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzYKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tAOAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM4CiAgICAvLyB0b3RhbCArPSBpdGVtCiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjUKICAgIC8vIGNvbnN0IHN0b3BOdW1iZXI6IHVpbnQ2NCA9IDQyCiAgICBpbnRjXzMgLy8gNDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozOQogICAgLy8gaWYgKGl0ZW0gPT09IHN0b3BOdW1iZXIpIGJyZWFrCiAgICA9PQogICAgYm56IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9ibG9ja0A4CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tAODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXMuMDogdWludDY0LCBpdGVtcy4xOiB1aW50NjQsIGl0ZW1zLjI6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ0CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5KGl0ZW1zOiBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ2CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYmxvY2tAOAogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0OAogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDEKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDkKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Jsb2NrQDgKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Jsb2NrQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NTEKICAgIC8vIHJldHVybiB0b3RhbAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNDIKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0AxMAogICAgcHVzaGJ5dGVzcyAweGNmMWYyMGI4IDB4OGMxNmVlODcgMHhiMmM3NTNiZiAweGQxYjViZWVlIDB4YTFjYzBkOTQgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheSh1aW50NjRbXSl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkodWludDY0WzVdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheSgodWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9yb3V0ZUAzIG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXlfcm91dGVANCBtYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANSBtYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9yb3V0ZUA2IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9yb3V0ZUA3CgptYWluX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X3JvdXRlQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IEFycmF5PHVpbnQ2ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheShpdGVtczogRHluYW1pY0FycmF5PFVpbnRONjQ+KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXMuMDogdWludDY0LCBpdGVtcy4xOiB1aW50NjQsIGl0ZW1zLjI6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OQogICAgLy8gbGV0IHRvdGFsOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTMKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2JvZHlAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMQogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDAKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Jsb2NrQDgKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMAogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgMQogICAgc3dpdGNoIHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8xQDUgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9ibG9ja0A4OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE0CiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANjoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyAtMQogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9ib2R5QDEKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8xQDU6CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheShpdGVtczogYnl0ZXMpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE4CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTkKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTkKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A3CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDgKICAgICoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyMAogICAgLy8gdG90YWwgKz0gaXRlbS5uYXRpdmUKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjUKICAgIC8vIGNvbnN0IHN0b3BOdW1iZXI6IHVpbnQ2NCA9IDQyCiAgICBpbnRjXzMgLy8gNDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyMQogICAgLy8gaWYgKGl0ZW0ubmF0aXZlID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A3CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfaGVhZGVyQDEKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Jsb2NrQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBTdGF0aWNBcnJheTxVaW50TjY0LCA1PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Jsb2NrQDcKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbCArPSBpdGVtLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDAKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzAKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgID09CiAgICBibnogdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A3CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo6Rm9yT2ZMb29wc0FsZ28udGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzYKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tANwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM4CiAgICAvLyB0b3RhbCArPSBpdGVtCiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjUKICAgIC8vIGNvbnN0IHN0b3BOdW1iZXI6IHVpbnQ2NCA9IDQyCiAgICBpbnRjXzMgLy8gNDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozOQogICAgLy8gaWYgKGl0ZW0gPT09IHN0b3BOdW1iZXIpIGJyZWFrCiAgICA9PQogICAgYm56IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9ibG9ja0A3CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXMuMDogdWludDY0LCBpdGVtcy4xOiB1aW50NjQsIGl0ZW1zLjI6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ0CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5KGl0ZW1zOiBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ2CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICAvCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYmxvY2tANwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzIgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3QzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0OAogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDEKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDkKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJueiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Jsb2NrQDcKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzCiAgICBiIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Jsb2NrQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NTEKICAgIC8vIHJldHVybiB0b3RhbAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { diff --git a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir index 7c65aacf1..0a670fd69 100644 --- a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir +++ b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir @@ -115,31 +115,29 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item#0: uint64 = items.0#0 goto block@1 block@1: // for_body_L10 - let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@6, loop_counter%0#3 <- block@7) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6, total#2 <- block@7) - let item#1: uint64 = φ(item#0 <- block@0, item#2 <- block@6, item#3 <- block@7) + let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@5, loop_counter%0#3 <- block@6) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5, total#2 <- block@6) + let item#1: uint64 = φ(item#0 <- block@0, item#2 <- block@5, item#3 <- block@6) let total#2: uint64 = (+ total#1 item#1) let tmp%0#0: bool = (== item#1 42u) goto tmp%0#0 ? block@2 : block@3 block@2: // if_body_L12 - goto block@9 + goto block@8 block@3: // after_if_else_L12 goto block@4 - block@4: // L10 - goto block@5 - block@5: // for_footer_L10 - goto_nth [block@6, block@7][loop_counter%0#1] else goto block@8 - block@6: // for_header_1_L10 + block@4: // for_footer_L10 + goto_nth [block@5, block@6][loop_counter%0#1] else goto block@7 + block@5: // for_header_1_L10 let loop_counter%0#2: uint64 = 1u let item#2: uint64 = items.1#0 goto block@1 - block@7: // for_header_2_L10 + block@6: // for_header_2_L10 let loop_counter%0#3: uint64 = 2u let item#3: uint64 = items.2#0 goto block@1 - block@8: // after_for_L10 - goto block@9 - block@9: // L10 + block@7: // after_for_L10 + goto block@8 + block@8: // L10 return total#2 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_dynamic_array(items: bytes) -> uint64: @@ -150,10 +148,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L19 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L19 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -164,19 +162,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%1#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L21 - goto block@8 + goto block@7 block@4: // after_if_else_L21 goto block@5 - block@5: // L19 - goto block@6 - block@6: // for_footer_L19 + block@5: // for_footer_L19 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L19 - goto block@8 - block@8: // L19 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L19 + goto block@7 + block@7: // L19 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_static_array(items: bytes[40]) -> uint64: block@0: // L26 @@ -186,10 +182,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L28 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L28 let array_head_and_tail%0#0: bytes[40] = items#0 let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -200,19 +196,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%1#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L30 - goto block@8 + goto block@7 block@4: // after_if_else_L30 goto block@5 - block@5: // L28 - goto block@6 - block@6: // for_footer_L28 + block@5: // for_footer_L28 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L28 - goto block@8 - block@8: // L28 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L28 + goto block@7 + block@7: // L28 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_immutable_array(items: uint64[]) -> uint64: block@0: // L35 @@ -222,10 +216,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L37 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L37 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -235,19 +229,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L39 - goto block@8 + goto block@7 block@4: // after_if_else_L39 goto block@5 - block@5: // L37 - goto block@6 - block@6: // for_footer_L37 + block@5: // for_footer_L37 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L37 - goto block@8 - block@8: // L37 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L37 + goto block@7 + block@7: // L37 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_mutable_array(items.0: uint64, items.1: uint64, items.2: uint64) -> uint64: block@0: // L44 @@ -262,10 +254,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L47 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L47 let slot_contents%1#0: uint64[] = read(mutable#0) let item#0: uint64 = slot_contents%1#0[item_index_internal%0#1] @@ -273,19 +265,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L49 - goto block@8 + goto block@7 block@4: // after_if_else_L49 goto block@5 - block@5: // L47 - goto block@6 - block@6: // for_footer_L47 + block@5: // for_footer_L47 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L47 - goto block@8 - block@8: // L47 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L47 + goto block@7 + block@7: // L47 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__algots__.defaultCreate() -> void: block@0: // L7 diff --git a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir index 132807c3b..11572d76e 100644 --- a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir +++ b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir @@ -98,21 +98,21 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let loop_counter%0#0: uint64 = 0u goto block@1 block@1: // for_body_L10 - let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@6, loop_counter%0#3 <- block@7) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6, total#2 <- block@7) - let item#1: uint64 = φ(items.0#0 <- block@0, items.1#0 <- block@6, items.2#0 <- block@7) + let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@5, loop_counter%0#3 <- block@6) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5, total#2 <- block@6) + let item#1: uint64 = φ(items.0#0 <- block@0, items.1#0 <- block@5, items.2#0 <- block@6) let total#2: uint64 = (+ total#1 item#1) let tmp%0#0: bool = (== item#1 42u) - goto tmp%0#0 ? block@9 : block@3 + goto tmp%0#0 ? block@8 : block@3 block@3: // after_if_else_L12 - goto_nth [block@6, block@7][loop_counter%0#1] else goto block@9 - block@6: // for_header_1_L10 + goto_nth [block@5, block@6][loop_counter%0#1] else goto block@8 + block@5: // for_header_1_L10 let loop_counter%0#2: uint64 = 1u goto block@1 - block@7: // for_header_2_L10 + block@6: // for_header_2_L10 let loop_counter%0#3: uint64 = 2u goto block@1 - block@9: // L10 + block@8: // L10 return total#2 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_dynamic_array(items: bytes) -> uint64: @@ -125,7 +125,7 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@4) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L19 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -134,15 +134,15 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%0#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L21 - goto block@8 + goto block@7 block@4: // after_if_else_L21 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L19 - goto block@8 - block@8: // L19 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L19 + goto block@7 + block@7: // L19 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_static_array(items: bytes[40]) -> uint64: block@0: // L26 @@ -153,7 +153,7 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@4) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let continue_looping%0#0: bool = (< item_index_internal%0#1 5u) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L28 let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) let tmp%0#0: uint64 = (extract_uint64 items#0 item_offset%0#0) @@ -161,15 +161,15 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%0#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L30 - goto block@8 + goto block@7 block@4: // after_if_else_L30 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L28 - goto block@8 - block@8: // L28 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L28 + goto block@7 + block@7: // L28 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_immutable_array(items: uint64[]) -> uint64: block@0: // L35 @@ -181,7 +181,7 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@4) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L37 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -190,15 +190,15 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L39 - goto block@8 + goto block@7 block@4: // after_if_else_L39 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L37 - goto block@8 - block@8: // L37 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L37 + goto block@7 + block@7: // L37 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_mutable_array(items.0: uint64, items.1: uint64, items.2: uint64) -> uint64: block@0: // L44 @@ -224,7 +224,7 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@4) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L47 let slot_contents%1#0: uint64[] = read(mutable#0) let array%bytes_index%0#1: uint64 = (* item_index_internal%0#1 8u) @@ -236,12 +236,12 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L49 - goto block@8 + goto block@7 block@4: // after_if_else_L49 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L47 - goto block@8 - block@8: // L47 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 \ No newline at end of file + block@6: // after_for_L47 + goto block@7 + block@7: // L47 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 \ No newline at end of file diff --git a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir index 5c4e558fe..dac1e9f55 100644 --- a/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir +++ b/tests/approvals/out/o1/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir @@ -98,21 +98,21 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let loop_counter%0#0: uint64 = 0u goto block@1 block@1: // for_body_L10 - let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@6, loop_counter%0#3 <- block@7) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6, total#2 <- block@7) - let item#1: uint64 = φ(items.0#0 <- block@0, items.1#0 <- block@6, items.2#0 <- block@7) + let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@5, loop_counter%0#3 <- block@6) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5, total#2 <- block@6) + let item#1: uint64 = φ(items.0#0 <- block@0, items.1#0 <- block@5, items.2#0 <- block@6) let total#2: uint64 = (+ total#1 item#1) let tmp%0#0: bool = (== item#1 42u) - goto tmp%0#0 ? block@9 : block@3 + goto tmp%0#0 ? block@8 : block@3 block@3: // after_if_else_L12 - goto_nth [block@6, block@7][loop_counter%0#1] else goto block@9 - block@6: // for_header_1_L10 + goto_nth [block@5, block@6][loop_counter%0#1] else goto block@8 + block@5: // for_header_1_L10 let loop_counter%0#2: uint64 = 1u goto block@1 - block@7: // for_header_2_L10 + block@6: // for_header_2_L10 let loop_counter%0#3: uint64 = 2u goto block@1 - block@9: // L10 + block@8: // L10 return total#2 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_dynamic_array(items: bytes) -> uint64: @@ -125,7 +125,7 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@4) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L19 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -134,15 +134,15 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%0#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L21 - goto block@8 + goto block@7 block@4: // after_if_else_L21 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L19 - goto block@8 - block@8: // L19 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L19 + goto block@7 + block@7: // L19 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_static_array(items: bytes[40]) -> uint64: block@0: // L26 @@ -153,7 +153,7 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@4) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let continue_looping%0#0: bool = (< item_index_internal%0#1 5u) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L28 let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) let tmp%0#0: uint64 = (extract_uint64 items#0 item_offset%0#0) @@ -161,15 +161,15 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%0#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L30 - goto block@8 + goto block@7 block@4: // after_if_else_L30 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L28 - goto block@8 - block@8: // L28 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L28 + goto block@7 + block@7: // L28 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_immutable_array(items: uint64[]) -> uint64: block@0: // L35 @@ -181,7 +181,7 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@4) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L37 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -190,15 +190,15 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L39 - goto block@8 + goto block@7 block@4: // after_if_else_L39 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L37 - goto block@8 - block@8: // L37 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L37 + goto block@7 + block@7: // L37 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_mutable_array(items.0: uint64, items.1: uint64, items.2: uint64) -> uint64: block@0: // L44 @@ -217,7 +217,7 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@4) let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let continue_looping%0#0: bool = (< item_index_internal%0#1 array%array_len%0#1) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L47 let slot_contents%1#0: uint64[] = read(local.0) let array%bytes_index%0#1: uint64 = (* item_index_internal%0#1 8u) @@ -227,12 +227,12 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L49 - goto block@8 + goto block@7 block@4: // after_if_else_L49 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L47 - goto block@8 - block@8: // L47 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 \ No newline at end of file + block@6: // after_for_L47 + goto block@7 + block@7: // L47 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 \ No newline at end of file diff --git a/tests/approvals/out/o1/for-of-loops/for-of-loops.awst b/tests/approvals/out/o1/for-of-loops/for-of-loops.awst index 1f8cb3e92..62b88a2d1 100644 --- a/tests/approvals/out/o1/for-of-loops/for-of-loops.awst +++ b/tests/approvals/out/o1/for-of-loops/for-of-loops.awst @@ -18,7 +18,6 @@ contract ForOfLoopsAlgo if (item == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -32,7 +31,6 @@ contract ForOfLoopsAlgo if (ARC4_DECODE(item) == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -46,7 +44,6 @@ contract ForOfLoopsAlgo if (ARC4_DECODE(item) == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -60,7 +57,6 @@ contract ForOfLoopsAlgo if (item == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -75,7 +71,6 @@ contract ForOfLoopsAlgo if (item == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total diff --git a/tests/approvals/out/o1/for-of-loops/for-of-loops.awst.json b/tests/approvals/out/o1/for-of-loops/for-of-loops.awst.json index 5aba22a18..af7ff3ae2 100644 --- a/tests/approvals/out/o1/for-of-loops/for-of-loops.awst.json +++ b/tests/approvals/out/o1/for-of-loops/for-of-loops.awst.json @@ -553,19 +553,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 10, - "end_line": 10, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -1091,19 +1078,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 19, - "end_line": 19, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -1631,19 +1605,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 28, - "end_line": 28, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -2086,19 +2047,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 37, - "end_line": 37, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -2796,19 +2744,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 47, - "end_line": 47, - "column": 4, - "end_column": 31 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, diff --git a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.approval.teal b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.approval.teal index 6a259cfa7..d72132d7a 100644 --- a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.approval.teal +++ b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.approval.teal @@ -59,7 +59,7 @@ test: pushint 2010 // 2010 global OpcodeBudget > - bz test_after_while@12 + bz test_after_while@10 itxn_begin pushint 6 // appl itxn_field TypeEnum @@ -74,7 +74,7 @@ test: itxn_submit b test -test_after_while@12: +test_after_while@10: // tests/approvals/mutable-arrays.algo.ts:7 // const ma = new MutableArray() bytec_0 // 0x @@ -90,7 +90,7 @@ test_while_top@1: frame_dig 1 frame_dig -1 < - bz test_after_while@4 + bz test_after_while@3 // tests/approvals/mutable-arrays.algo.ts:9 // ma.push(i) frame_dig 1 @@ -107,7 +107,7 @@ test_while_top@1: frame_bury 1 b test_while_top@1 -test_after_while@4: +test_after_while@3: frame_dig 0 // tests/approvals/mutable-arrays.algo.ts:12 // assert(ma.length === length) diff --git a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.arc32.json b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.arc32.json index dcf215619..61ed19aac 100644 --- a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.arc32.json +++ b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEKICAgIGJ5dGVjYmxvY2sgMHggMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlcyAweDJhMzM3NzcxIC8vIG1ldGhvZCAidGVzdCh1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF9yb3V0ZUAzCgptYWluX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjUKICAgIC8vIHRlc3QobGVuZ3RoOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdAogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28udGVzdChsZW5ndGg6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjUKICAgIC8vIHRlc3QobGVuZ3RoOiB1aW50NjQpIHsKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIHB1c2hpbnQgMjAxMCAvLyAyMDEwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDEyCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWNfMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjXzEgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgdGVzdAoKdGVzdF9hZnRlcl93aGlsZUAxMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjcKICAgIC8vIGNvbnN0IG1hID0gbmV3IE11dGFibGVBcnJheTx1aW50NjQ+KCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCgp0ZXN0X3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjkKICAgIC8vIG1hLnB1c2goaSkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3Rfd2hpbGVfdG9wQDEKCnRlc3RfYWZ0ZXJfd2hpbGVANDoKICAgIGZyYW1lX2RpZyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czoxMgogICAgLy8gYXNzZXJ0KG1hLmxlbmd0aCA9PT0gbGVuZ3RoKQogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTMKICAgIC8vIGFzc2VydChsZW5ndGgsICdoYXMgbGVuZ3RoJykKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXJ0IC8vIGhhcyBsZW5ndGgKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjE0CiAgICAvLyBjb25zdCBwb3BwZWQgPSBtYS5wb3AoKQogICAgaW50Y18xIC8vIDgKICAgIC0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0MwogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgICoKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTcKICAgIC8vIGFzc2VydChwb3BwZWQgPT09IGxlbmd0aCAtIDEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEKICAgIGJ5dGVjYmxvY2sgMHggMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlcyAweDJhMzM3NzcxIC8vIG1ldGhvZCAidGVzdCh1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF9yb3V0ZUAzCgptYWluX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjUKICAgIC8vIHRlc3QobGVuZ3RoOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdAogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28udGVzdChsZW5ndGg6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjUKICAgIC8vIHRlc3QobGVuZ3RoOiB1aW50NjQpIHsKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIHB1c2hpbnQgMjAxMCAvLyAyMDEwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDEwCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWNfMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjXzEgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgdGVzdAoKdGVzdF9hZnRlcl93aGlsZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjcKICAgIC8vIGNvbnN0IG1hID0gbmV3IE11dGFibGVBcnJheTx1aW50NjQ+KCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCgp0ZXN0X3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDMKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjkKICAgIC8vIG1hLnB1c2goaSkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3Rfd2hpbGVfdG9wQDEKCnRlc3RfYWZ0ZXJfd2hpbGVAMzoKICAgIGZyYW1lX2RpZyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czoxMgogICAgLy8gYXNzZXJ0KG1hLmxlbmd0aCA9PT0gbGVuZ3RoKQogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTMKICAgIC8vIGFzc2VydChsZW5ndGgsICdoYXMgbGVuZ3RoJykKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXJ0IC8vIGhhcyBsZW5ndGgKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjE0CiAgICAvLyBjb25zdCBwb3BwZWQgPSBtYS5wb3AoKQogICAgaW50Y18xIC8vIDgKICAgIC0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0MwogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgICoKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTcKICAgIC8vIGFzc2VydChwb3BwZWQgPT09IGxlbmd0aCAtIDEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.arc56.json b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.arc56.json index f509b1c45..5223f541b 100644 --- a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.arc56.json +++ b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.arc56.json @@ -99,7 +99,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEKICAgIGJ5dGVjYmxvY2sgMHggMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlcyAweDJhMzM3NzcxIC8vIG1ldGhvZCAidGVzdCh1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF9yb3V0ZUAzCgptYWluX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjUKICAgIC8vIHRlc3QobGVuZ3RoOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdAogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28udGVzdChsZW5ndGg6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjUKICAgIC8vIHRlc3QobGVuZ3RoOiB1aW50NjQpIHsKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIHB1c2hpbnQgMjAxMCAvLyAyMDEwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDEyCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWNfMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjXzEgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgdGVzdAoKdGVzdF9hZnRlcl93aGlsZUAxMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjcKICAgIC8vIGNvbnN0IG1hID0gbmV3IE11dGFibGVBcnJheTx1aW50NjQ+KCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCgp0ZXN0X3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjkKICAgIC8vIG1hLnB1c2goaSkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3Rfd2hpbGVfdG9wQDEKCnRlc3RfYWZ0ZXJfd2hpbGVANDoKICAgIGZyYW1lX2RpZyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czoxMgogICAgLy8gYXNzZXJ0KG1hLmxlbmd0aCA9PT0gbGVuZ3RoKQogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTMKICAgIC8vIGFzc2VydChsZW5ndGgsICdoYXMgbGVuZ3RoJykKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXJ0IC8vIGhhcyBsZW5ndGgKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjE0CiAgICAvLyBjb25zdCBwb3BwZWQgPSBtYS5wb3AoKQogICAgaW50Y18xIC8vIDgKICAgIC0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0MwogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgICoKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTcKICAgIC8vIGFzc2VydChwb3BwZWQgPT09IGxlbmd0aCAtIDEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEKICAgIGJ5dGVjYmxvY2sgMHggMHgwNjgxMDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlcyAweDJhMzM3NzcxIC8vIG1ldGhvZCAidGVzdCh1aW50NjQpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdF9yb3V0ZUAzCgptYWluX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjUKICAgIC8vIHRlc3QobGVuZ3RoOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdAogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28udGVzdChsZW5ndGg6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjUKICAgIC8vIHRlc3QobGVuZ3RoOiB1aW50NjQpIHsKICAgIHByb3RvIDEgMAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gIiIKICAgIHB1c2hpbnQgMjAxMCAvLyAyMDEwCiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICA+CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDEwCiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWNfMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW0KICAgIGJ5dGVjXzEgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGIgdGVzdAoKdGVzdF9hZnRlcl93aGlsZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjcKICAgIC8vIGNvbnN0IG1hID0gbmV3IE11dGFibGVBcnJheTx1aW50NjQ+KCkKICAgIGJ5dGVjXzAgLy8gMHgKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAxCgp0ZXN0X3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDMKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjkKICAgIC8vIG1hLnB1c2goaSkKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3Rfd2hpbGVfdG9wQDEKCnRlc3RfYWZ0ZXJfd2hpbGVAMzoKICAgIGZyYW1lX2RpZyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czoxMgogICAgLy8gYXNzZXJ0KG1hLmxlbmd0aCA9PT0gbGVuZ3RoKQogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGZyYW1lX2RpZyAtMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTMKICAgIC8vIGFzc2VydChsZW5ndGgsICdoYXMgbGVuZ3RoJykKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXJ0IC8vIGhhcyBsZW5ndGgKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjE0CiAgICAvLyBjb25zdCBwb3BwZWQgPSBtYS5wb3AoKQogICAgaW50Y18xIC8vIDgKICAgIC0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0MwogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgICoKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTcKICAgIC8vIGFzc2VydChwb3BwZWQgPT09IGxlbmd0aCAtIDEpCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { diff --git a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir index a1ac95fbd..3f8bf1fc6 100644 --- a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir +++ b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir @@ -82,21 +82,17 @@ subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length let i#0: uint64 = 0u goto block@1 block@1: // while_top_L8 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 length#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L8 let encoded%1#0: uint64[] = encode(i#1) let slot_contents%0#0: uint64[] = read(ma#0) let extended%0#0: uint64[] = slot_contents%0#0.concat(encoded%1#0) write(ma#0, extended%0#0) - goto block@3 - block@3: // L8 - let i#3: uint64 = (+ i#1 1u) + let i#2: uint64 = (+ i#1 1u) goto block@1 - block@4: // after_while_L8 - goto block@5 - block@5: // L8 + block@3: // after_while_L8 let slot_contents%1#0: uint64[] = read(ma#0) let tmp%1#0: uint64 = slot_contents%1#0.length let tmp%2#0: bool = (== tmp%1#0 length#0) diff --git a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir index 3b1191788..f41befe29 100644 --- a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir +++ b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir @@ -33,11 +33,11 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP return tmp%0#0 subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length: uint64) -> void: - block@7: // while_top_L20 + block@5: // while_top_L20 let tmp%0#1: uint64 = (global OpcodeBudget) let tmp%1#1: bool = (> 2010u tmp%0#1) - goto tmp%1#1 ? block@8 : block@12 - block@8: // while_body_L21 + goto tmp%1#1 ? block@6 : block@10 + block@6: // while_body_L21 itxn_begin ((itxn_field TypeEnum) appl) ((itxn_field OnCompletion) DeleteApplication) @@ -45,17 +45,17 @@ subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length ((itxn_field ClearStateProgram) 0x068101) ((itxn_field Fee) 0u) itxn_submit - goto block@7 - block@12: // after_while_L20 + goto block@5 + block@10: // after_while_L20 let encoded%0#0: uint64[] = 0x let ma#0: uint64[]* = new() write(ma#0, encoded%0#0) let i#0: uint64 = 0u goto block@1 block@1: // while_top_L8 - let i#1: uint64 = φ(i#0 <- block@12, i#3 <- block@2) + let i#1: uint64 = φ(i#0 <- block@10, i#2 <- block@2) let tmp%0#0: bool = (< i#1 length#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L8 let array%sub_item%0#1: bytes[8] = (itob i#1) let array%encoded%0#1: uint64[] = (concat 0x array%sub_item%0#1) @@ -65,9 +65,9 @@ subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length let array%array_contents%0#1: bytes = (concat slot_contents%0#0 encoded%1#0) // on error: max array length exceeded let extended%0#0: uint64[] = array%array_contents%0#1 write(ma#0, extended%0#0) - let i#3: uint64 = (+ i#1 1u) + let i#2: uint64 = (+ i#1 1u) goto block@1 - block@4: // after_while_L8 + block@3: // after_while_L8 let slot_contents%1#0: uint64[] = read(ma#0) let array%bytes_len%0#1: uint64 = (len slot_contents%1#0) let array%array_len%0#1: uint64 = (/ array%bytes_len%0#1 8u) diff --git a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir index ce6b6b1aa..e13f90f57 100644 --- a/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir +++ b/tests/approvals/out/o1/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir @@ -33,11 +33,11 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP return tmp%0#0 subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length: uint64) -> void: - block@7: // while_top_L20 + block@5: // while_top_L20 let tmp%0#1: uint64 = (global OpcodeBudget) let tmp%1#1: bool = (> 2010u tmp%0#1) - goto tmp%1#1 ? block@8 : block@12 - block@8: // while_body_L21 + goto tmp%1#1 ? block@6 : block@10 + block@6: // while_body_L21 itxn_begin ((itxn_field TypeEnum) appl) ((itxn_field OnCompletion) DeleteApplication) @@ -45,23 +45,23 @@ subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length ((itxn_field ClearStateProgram) 0x068101) ((itxn_field Fee) 0u) itxn_submit - goto block@7 - block@12: // after_while_L20 + goto block@5 + block@10: // after_while_L20 write(local.0, 0x) let i#0: uint64 = 0u goto block@1 block@1: // while_top_L8 - let i#1: uint64 = φ(i#0 <- block@12, i#3 <- block@2) + let i#1: uint64 = φ(i#0 <- block@10, i#2 <- block@2) let tmp%0#0: bool = (< i#1 length#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L8 let array%sub_item%0#1: bytes[8] = (itob i#1) let slot_contents%0#0: uint64[] = read(local.0) let array%array_contents%0#1: bytes = (concat slot_contents%0#0 array%sub_item%0#1) // on error: max array length exceeded write(local.0, array%array_contents%0#1) - let i#3: uint64 = (+ i#1 1u) + let i#2: uint64 = (+ i#1 1u) goto block@1 - block@4: // after_while_L8 + block@3: // after_while_L8 let slot_contents%1#0: uint64[] = read(local.0) let array%bytes_len%0#1: uint64 = (len slot_contents%1#0) let array%array_len%0#1: uint64 = (/ array%bytes_len%0#1 8u) diff --git a/tests/approvals/out/o1/mutable-arrays/mutable-arrays.awst b/tests/approvals/out/o1/mutable-arrays/mutable-arrays.awst index 634eaf6c7..4fe61999a 100644 --- a/tests/approvals/out/o1/mutable-arrays/mutable-arrays.awst +++ b/tests/approvals/out/o1/mutable-arrays/mutable-arrays.awst @@ -17,10 +17,8 @@ contract MutableArraysAlgo i: uint64 = 0 while (i < length) { ma.push(...[i] - #loop₁ᶜ: i++ } - #loop₁ᵇ: assert(ma.length == length) assert(Boolean(length), comment=has length) popped: uint64 = ma.pop() diff --git a/tests/approvals/out/o1/mutable-arrays/mutable-arrays.awst.json b/tests/approvals/out/o1/mutable-arrays/mutable-arrays.awst.json index e59246822..5d597e292 100644 --- a/tests/approvals/out/o1/mutable-arrays/mutable-arrays.awst.json +++ b/tests/approvals/out/o1/mutable-arrays/mutable-arrays.awst.json @@ -580,19 +580,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/mutable-arrays.algo.ts", - "line": 8, - "end_line": 8, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "ExpressionStatement", "source_location": { @@ -644,19 +631,6 @@ "comment": null } }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/mutable-arrays.algo.ts", - "line": 8, - "end_line": 8, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null - }, { "_type": "ExpressionStatement", "source_location": { diff --git a/tests/approvals/out/o1/while-loops/DemoContract.approval.teal b/tests/approvals/out/o1/while-loops/DemoContract.approval.teal index b77943bef..ed8c77dee 100644 --- a/tests/approvals/out/o1/while-loops/DemoContract.approval.teal +++ b/tests/approvals/out/o1/while-loops/DemoContract.approval.teal @@ -72,7 +72,7 @@ testWhile_while_top@1: // while (i < stop) { // i += 1 // } - bz testWhile_after_while@4 + bz testWhile_after_while@3 // tests/approvals/while-loops.algo.ts:8 // i += 1 frame_dig 0 @@ -81,7 +81,7 @@ testWhile_while_top@1: frame_bury 0 b testWhile_while_top@1 -testWhile_after_while@4: +testWhile_after_while@3: // tests/approvals/while-loops.algo.ts:11 // return i frame_dig 0 diff --git a/tests/approvals/out/o1/while-loops/DemoContract.arc32.json b/tests/approvals/out/o1/while-loops/DemoContract.arc32.json index c71a90d3f..d29665525 100644 --- a/tests/approvals/out/o1/while-loops/DemoContract.arc32.json +++ b/tests/approvals/out/o1/while-loops/DemoContract.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzIDB4MjhhNTJkNzMgLy8gbWV0aG9kICJ0ZXN0V2hpbGUodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdFdoaWxlX3JvdXRlQDMKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdFdoaWxlX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0V2hpbGUKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC50ZXN0V2hpbGUoc3RvcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RXaGlsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzEgLy8gMAoKdGVzdFdoaWxlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NwogICAgLy8gd2hpbGUgKGkgPCBzdG9wKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo3LTkKICAgIC8vIHdoaWxlIChpIDwgc3RvcCkgewogICAgLy8gICBpICs9IDEKICAgIC8vIH0KICAgIGJ6IHRlc3RXaGlsZV9hZnRlcl93aGlsZUA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo4CiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHRlc3RXaGlsZV93aGlsZV90b3BAMQoKdGVzdFdoaWxlX2FmdGVyX3doaWxlQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czoxMQogICAgLy8gcmV0dXJuIGkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzIDB4MjhhNTJkNzMgLy8gbWV0aG9kICJ0ZXN0V2hpbGUodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdFdoaWxlX3JvdXRlQDMKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdFdoaWxlX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0V2hpbGUKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC50ZXN0V2hpbGUoc3RvcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RXaGlsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzEgLy8gMAoKdGVzdFdoaWxlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NwogICAgLy8gd2hpbGUgKGkgPCBzdG9wKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo3LTkKICAgIC8vIHdoaWxlIChpIDwgc3RvcCkgewogICAgLy8gICBpICs9IDEKICAgIC8vIH0KICAgIGJ6IHRlc3RXaGlsZV9hZnRlcl93aGlsZUAzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo4CiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHRlc3RXaGlsZV93aGlsZV90b3BAMQoKdGVzdFdoaWxlX2FmdGVyX3doaWxlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czoxMQogICAgLy8gcmV0dXJuIGkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/tests/approvals/out/o1/while-loops/DemoContract.arc56.json b/tests/approvals/out/o1/while-loops/DemoContract.arc56.json index 37048b25a..a80d19acd 100644 --- a/tests/approvals/out/o1/while-loops/DemoContract.arc56.json +++ b/tests/approvals/out/o1/while-loops/DemoContract.arc56.json @@ -87,7 +87,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzIDB4MjhhNTJkNzMgLy8gbWV0aG9kICJ0ZXN0V2hpbGUodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdFdoaWxlX3JvdXRlQDMKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdFdoaWxlX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0V2hpbGUKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC50ZXN0V2hpbGUoc3RvcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RXaGlsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzEgLy8gMAoKdGVzdFdoaWxlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NwogICAgLy8gd2hpbGUgKGkgPCBzdG9wKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo3LTkKICAgIC8vIHdoaWxlIChpIDwgc3RvcCkgewogICAgLy8gICBpICs9IDEKICAgIC8vIH0KICAgIGJ6IHRlc3RXaGlsZV9hZnRlcl93aGlsZUA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo4CiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHRlc3RXaGlsZV93aGlsZV90b3BAMQoKdGVzdFdoaWxlX2FmdGVyX3doaWxlQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czoxMQogICAgLy8gcmV0dXJuIGkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzIDB4MjhhNTJkNzMgLy8gbWV0aG9kICJ0ZXN0V2hpbGUodWludDY0KXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fdGVzdFdoaWxlX3JvdXRlQDMKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdFdoaWxlX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0V2hpbGUKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC50ZXN0V2hpbGUoc3RvcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RXaGlsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzEgLy8gMAoKdGVzdFdoaWxlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NwogICAgLy8gd2hpbGUgKGkgPCBzdG9wKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo3LTkKICAgIC8vIHdoaWxlIChpIDwgc3RvcCkgewogICAgLy8gICBpICs9IDEKICAgIC8vIH0KICAgIGJ6IHRlc3RXaGlsZV9hZnRlcl93aGlsZUAzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo4CiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHRlc3RXaGlsZV93aGlsZV90b3BAMQoKdGVzdFdoaWxlX2FmdGVyX3doaWxlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czoxMQogICAgLy8gcmV0dXJuIGkKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { diff --git a/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir b/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir index 5fb1dc0de..6c590eaee 100644 --- a/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir +++ b/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir @@ -50,17 +50,13 @@ subroutine tests/approvals/while-loops.algo.ts::DemoContract.testWhile(stop: uin let i#0: uint64 = 0u goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let i#2: uint64 = (+ i#1 1u) - goto block@3 - block@3: // L7 goto block@1 - block@4: // after_while_L7 - goto block@5 - block@5: // L7 + block@3: // after_while_L7 return i#1 subroutine tests/approvals/while-loops.algo.ts::DemoContract.__algots__.defaultCreate() -> void: diff --git a/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.1.ssa.array.ir b/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.1.ssa.array.ir index 4add186bf..76f2e20b5 100644 --- a/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.1.ssa.array.ir +++ b/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.1.ssa.array.ir @@ -42,9 +42,9 @@ subroutine tests/approvals/while-loops.algo.ts::DemoContract.testWhile(stop: uin block@1: // while_top_L7 let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let i#2: uint64 = (+ i#1 1u) goto block@1 - block@4: // after_while_L7 + block@3: // after_while_L7 return i#1 \ No newline at end of file diff --git a/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.2.ssa.slot.ir b/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.2.ssa.slot.ir index 4add186bf..76f2e20b5 100644 --- a/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.2.ssa.slot.ir +++ b/tests/approvals/out/o1/while-loops/DemoContract.ir/DemoContract.approval.2.ssa.slot.ir @@ -42,9 +42,9 @@ subroutine tests/approvals/while-loops.algo.ts::DemoContract.testWhile(stop: uin block@1: // while_top_L7 let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let i#2: uint64 = (+ i#1 1u) goto block@1 - block@4: // after_while_L7 + block@3: // after_while_L7 return i#1 \ No newline at end of file diff --git a/tests/approvals/out/o1/while-loops/while-loops.awst b/tests/approvals/out/o1/while-loops/while-loops.awst index 79148559d..1cd04ef6a 100644 --- a/tests/approvals/out/o1/while-loops/while-loops.awst +++ b/tests/approvals/out/o1/while-loops/while-loops.awst @@ -15,9 +15,7 @@ contract DemoContract i: uint64 = 0 while (i < stop) { i: uint64 = i + 1 - #loop₁ᶜ: } - #loop₁ᵇ: return i } diff --git a/tests/approvals/out/o1/while-loops/while-loops.awst.json b/tests/approvals/out/o1/while-loops/while-loops.awst.json index 6642b04a6..2ce9e84fe 100644 --- a/tests/approvals/out/o1/while-loops/while-loops.awst.json +++ b/tests/approvals/out/o1/while-loops/while-loops.awst.json @@ -435,37 +435,11 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/while-loops.algo.ts", - "line": 7, - "end_line": 9, - "column": 4, - "end_column": 5 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, "comment": null } - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/while-loops.algo.ts", - "line": 7, - "end_line": 9, - "column": 4, - "end_column": 5 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null } ], "label": null, diff --git a/tests/approvals/out/o2/destructuring-iterators/destructuring-iterators.awst b/tests/approvals/out/o2/destructuring-iterators/destructuring-iterators.awst index 8fcb30d70..8cabe95d5 100644 --- a/tests/approvals/out/o2/destructuring-iterators/destructuring-iterators.awst +++ b/tests/approvals/out/o2/destructuring-iterators/destructuring-iterators.awst @@ -4,8 +4,6 @@ subroutine test(): void total: uint64 = 0 for ({ a: a, b: _ } in items) { total: uint64 = total + a - #loop₁ᶜ: } - #loop₁ᵇ: assert(total == 6) } \ No newline at end of file diff --git a/tests/approvals/out/o2/destructuring-iterators/destructuring-iterators.awst.json b/tests/approvals/out/o2/destructuring-iterators/destructuring-iterators.awst.json index 435f7b368..63c8b326b 100644 --- a/tests/approvals/out/o2/destructuring-iterators/destructuring-iterators.awst.json +++ b/tests/approvals/out/o2/destructuring-iterators/destructuring-iterators.awst.json @@ -817,37 +817,11 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/destructuring-iterators.algo.ts", - "line": 11, - "end_line": 11, - "column": 2, - "end_column": 28 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, "comment": null } - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/destructuring-iterators.algo.ts", - "line": 11, - "end_line": 11, - "column": 2, - "end_column": 28 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null } ], "label": null, diff --git a/tests/approvals/out/o2/do-loops/DoLoopsAlgo.approval.teal b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.approval.teal new file mode 100644 index 000000000..ec34e96b1 --- /dev/null +++ b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.approval.teal @@ -0,0 +1,221 @@ +#pragma version 10 +#pragma typetrack false + +// @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram() -> uint64: +main: + intcblock 1 0 + bytecblock 0x151f7c75 + pushbytes "" + dupn 4 + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txn NumAppArgs + bz main_bare_routing@8 + pushbytess 0x39239792 0xace2eb21 0x78e8d516 // method "testDo(uint64)uint64", method "testDoBreak(uint64,uint64)uint64", method "testDoContinue(uint64,uint64)uint64" + txna ApplicationArgs 0 + match main_testDo_route@3 main_testDoBreak_route@4 main_testDoContinue_route@5 + +main_after_if_else@12: + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + intc_1 // 0 + return + +main_testDoContinue_route@5: + // tests/approvals/do-loops.algo.ts:23 + // testDoContinue(stop: uint64, mod: uint64) { + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txna ApplicationArgs 1 + btoi + bury 2 + txna ApplicationArgs 2 + btoi + bury 3 + // tests/approvals/do-loops.algo.ts:24 + // let i = Uint64(0) + intc_1 // 0 + bury 4 + // tests/approvals/do-loops.algo.ts:25 + // let total = Uint64(0) + intc_1 // 0 + bury 1 + +main_while_top@17: + // tests/approvals/do-loops.algo.ts:27 + // if (i > 0 && i % mod === 0) { + dig 3 + bz main_after_if_else@20 + dig 3 + dig 3 + % + bnz main_after_if_else@20 + // tests/approvals/do-loops.algo.ts:28 + // total += 2 + dup + pushint 2 // 2 + + + bury 1 + // tests/approvals/do-loops.algo.ts:29 + // i += 1 + dig 3 + intc_0 // 1 + + + bury 4 + +main_block@21: + // tests/approvals/do-loops.algo.ts:34 + // } while (i < stop) + dig 3 + dig 2 + < + bnz main_while_top@17 + // tests/approvals/do-loops.algo.ts:23 + // testDoContinue(stop: uint64, mod: uint64) { + dup + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_after_if_else@20: + // tests/approvals/do-loops.algo.ts:32 + // total += 1 + dup + intc_0 // 1 + + + bury 1 + // tests/approvals/do-loops.algo.ts:33 + // i += 1 + dig 3 + intc_0 // 1 + + + bury 4 + b main_block@21 + +main_testDoBreak_route@4: + // tests/approvals/do-loops.algo.ts:12 + // testDoBreak(stop: uint64, breakMod: uint64) { + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txna ApplicationArgs 1 + btoi + bury 2 + txna ApplicationArgs 2 + btoi + bury 5 + // tests/approvals/do-loops.algo.ts:13 + // let total = Uint64(0) + intc_1 // 0 + bury 1 + // tests/approvals/do-loops.algo.ts:14 + // let i = Uint64(0) + intc_1 // 0 + bury 4 + +main_while_top@27: + // tests/approvals/do-loops.algo.ts:16 + // if (i > 0 && i % breakMod === 0) break + dig 3 + bz main_after_if_else@30 + dig 3 + dig 5 + % + bz main_block@33 + +main_after_if_else@30: + // tests/approvals/do-loops.algo.ts:18 + // i += 1 + dig 3 + intc_0 // 1 + + + dup + bury 5 + // tests/approvals/do-loops.algo.ts:19 + // total += i + dup2 + + + bury 2 + // tests/approvals/do-loops.algo.ts:20 + // } while (i < stop) + dig 2 + < + bnz main_while_top@27 + +main_block@33: + // tests/approvals/do-loops.algo.ts:12 + // testDoBreak(stop: uint64, breakMod: uint64) { + dup + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_testDo_route@3: + // tests/approvals/do-loops.algo.ts:5 + // testDo(stop: uint64) { + txn OnCompletion + ! + assert // OnCompletion is not NoOp + txn ApplicationID + assert // can only call when not creating + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txna ApplicationArgs 1 + btoi + bury 2 + // tests/approvals/do-loops.algo.ts:6 + // let i = Uint64(0) + intc_1 // 0 + bury 4 + +main_while_top@36: + // tests/approvals/do-loops.algo.ts:8 + // i += 1 + dig 3 + intc_0 // 1 + + + dup + bury 5 + // tests/approvals/do-loops.algo.ts:9 + // } while (i < stop) + dig 2 + < + bnz main_while_top@36 + // tests/approvals/do-loops.algo.ts:5 + // testDo(stop: uint64) { + dig 3 + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_0 // 1 + return + +main_bare_routing@8: + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txn OnCompletion + bnz main_after_if_else@12 + txn ApplicationID + ! + assert // can only call when creating + intc_0 // 1 + return diff --git a/tests/approvals/out/o2/do-loops/DoLoopsAlgo.arc32.json b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.arc32.json new file mode 100644 index 000000000..110dd7b92 --- /dev/null +++ b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.arc32.json @@ -0,0 +1,99 @@ +{ + "hints": { + "testDo(uint64)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "testDoBreak(uint64,uint64)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "testDoContinue(uint64,uint64)uint64": { + "call_config": { + "no_op": "CALL" + } + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgRG9Mb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAOAogICAgcHVzaGJ5dGVzcyAweDM5MjM5NzkyIDB4YWNlMmViMjEgMHg3OGU4ZDUxNiAvLyBtZXRob2QgInRlc3REbyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0RG9CcmVhayh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdERvQ29udGludWUodWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3Rlc3REb19yb3V0ZUAzIG1haW5fdGVzdERvQnJlYWtfcm91dGVANCBtYWluX3Rlc3REb0NvbnRpbnVlX3JvdXRlQDUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdERvQ29udGludWVfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjIzCiAgICAvLyB0ZXN0RG9Db250aW51ZShzdG9wOiB1aW50NjQsIG1vZDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGJ1cnkgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyNAogICAgLy8gbGV0IGkgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI1CiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDEKCm1haW5fd2hpbGVfdG9wQDE3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGlmIChpID4gMCAmJiBpICUgbW9kID09PSAwKSB7CiAgICBkaWcgMwogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDIwCiAgICBkaWcgMwogICAgZGlnIDMKICAgICUKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyB0b3RhbCArPSAyCiAgICBkdXAKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI5CiAgICAvLyBpICs9IDEKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSA0CgptYWluX2Jsb2NrQDIxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MzQKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZGlnIDMKICAgIGRpZyAyCiAgICA8CiAgICBibnogbWFpbl93aGlsZV90b3BAMTcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjIzCiAgICAvLyB0ZXN0RG9Db250aW51ZShzdG9wOiB1aW50NjQsIG1vZDogdWludDY0KSB7CiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0b3RhbCArPSAxCiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjMzCiAgICAvLyBpICs9IDEKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSA0CiAgICBiIG1haW5fYmxvY2tAMjEKCm1haW5fdGVzdERvQnJlYWtfcm91dGVANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEyCiAgICAvLyB0ZXN0RG9CcmVhayhzdG9wOiB1aW50NjQsIGJyZWFrTW9kOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgYnVyeSAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE0CiAgICAvLyBsZXQgaSA9IFVpbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgNAoKbWFpbl93aGlsZV90b3BAMjc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNgogICAgLy8gaWYgKGkgPiAwICYmIGkgJSBicmVha01vZCA9PT0gMCkgYnJlYWsKICAgIGRpZyAzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMzAKICAgIGRpZyAzCiAgICBkaWcgNQogICAgJQogICAgYnogbWFpbl9ibG9ja0AzMwoKbWFpbl9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTgKICAgIC8vIGkgKz0gMQogICAgZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTkKICAgIC8vIHRvdGFsICs9IGkKICAgIGR1cDIKICAgICsKICAgIGJ1cnkgMgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjAKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZGlnIDIKICAgIDwKICAgIGJueiBtYWluX3doaWxlX3RvcEAyNwoKbWFpbl9ibG9ja0AzMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEyCiAgICAvLyB0ZXN0RG9CcmVhayhzdG9wOiB1aW50NjQsIGJyZWFrTW9kOiB1aW50NjQpIHsKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0RG9fcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3REbyhzdG9wOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgYnVyeSAyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo2CiAgICAvLyBsZXQgaSA9IFVpbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgNAoKbWFpbl93aGlsZV90b3BAMzY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo4CiAgICAvLyBpICs9IDEKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjkKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZGlnIDIKICAgIDwKICAgIGJueiBtYWluX3doaWxlX3RvcEAzNgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdERvKHN0b3A6IHVpbnQ2NCkgewogICAgZGlnIDMKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgRG9Mb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDEyCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "state": { + "global": { + "num_byte_slices": 0, + "num_uints": 0 + }, + "local": { + "num_byte_slices": 0, + "num_uints": 0 + } + }, + "schema": { + "global": { + "declared": {}, + "reserved": {} + }, + "local": { + "declared": {}, + "reserved": {} + } + }, + "contract": { + "name": "DoLoopsAlgo", + "methods": [ + { + "name": "testDo", + "args": [ + { + "type": "uint64", + "name": "stop" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + }, + { + "name": "testDoBreak", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "breakMod" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + }, + { + "name": "testDoContinue", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "mod" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + } + ], + "networks": {} + }, + "bare_call_config": { + "no_op": "CREATE" + } +} \ No newline at end of file diff --git a/tests/approvals/out/o2/do-loops/DoLoopsAlgo.arc56.json b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.arc56.json new file mode 100644 index 000000000..e0ae085a0 --- /dev/null +++ b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.arc56.json @@ -0,0 +1,161 @@ +{ + "name": "DoLoopsAlgo", + "structs": {}, + "methods": [ + { + "name": "testDo", + "args": [ + { + "type": "uint64", + "name": "stop" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "testDoBreak", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "breakMod" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "testDoContinue", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "mod" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 54, + 134, + 197 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 240 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 57, + 137, + 200 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgRG9Mb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdAOAogICAgcHVzaGJ5dGVzcyAweDM5MjM5NzkyIDB4YWNlMmViMjEgMHg3OGU4ZDUxNiAvLyBtZXRob2QgInRlc3REbyh1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0RG9CcmVhayh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdERvQ29udGludWUodWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3Rlc3REb19yb3V0ZUAzIG1haW5fdGVzdERvQnJlYWtfcm91dGVANCBtYWluX3Rlc3REb0NvbnRpbnVlX3JvdXRlQDUKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMSAvLyAwCiAgICByZXR1cm4KCm1haW5fdGVzdERvQ29udGludWVfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjIzCiAgICAvLyB0ZXN0RG9Db250aW51ZShzdG9wOiB1aW50NjQsIG1vZDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIGJ1cnkgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgYnVyeSAzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyNAogICAgLy8gbGV0IGkgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI1CiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDEKCm1haW5fd2hpbGVfdG9wQDE3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGlmIChpID4gMCAmJiBpICUgbW9kID09PSAwKSB7CiAgICBkaWcgMwogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDIwCiAgICBkaWcgMwogICAgZGlnIDMKICAgICUKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyB0b3RhbCArPSAyCiAgICBkdXAKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI5CiAgICAvLyBpICs9IDEKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSA0CgptYWluX2Jsb2NrQDIxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MzQKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZGlnIDMKICAgIGRpZyAyCiAgICA8CiAgICBibnogbWFpbl93aGlsZV90b3BAMTcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjIzCiAgICAvLyB0ZXN0RG9Db250aW51ZShzdG9wOiB1aW50NjQsIG1vZDogdWludDY0KSB7CiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYWZ0ZXJfaWZfZWxzZUAyMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0b3RhbCArPSAxCiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjMzCiAgICAvLyBpICs9IDEKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSA0CiAgICBiIG1haW5fYmxvY2tAMjEKCm1haW5fdGVzdERvQnJlYWtfcm91dGVANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEyCiAgICAvLyB0ZXN0RG9CcmVhayhzdG9wOiB1aW50NjQsIGJyZWFrTW9kOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgYnVyeSAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE0CiAgICAvLyBsZXQgaSA9IFVpbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgNAoKbWFpbl93aGlsZV90b3BAMjc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNgogICAgLy8gaWYgKGkgPiAwICYmIGkgJSBicmVha01vZCA9PT0gMCkgYnJlYWsKICAgIGRpZyAzCiAgICBieiBtYWluX2FmdGVyX2lmX2Vsc2VAMzAKICAgIGRpZyAzCiAgICBkaWcgNQogICAgJQogICAgYnogbWFpbl9ibG9ja0AzMwoKbWFpbl9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTgKICAgIC8vIGkgKz0gMQogICAgZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBkdXAKICAgIGJ1cnkgNQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTkKICAgIC8vIHRvdGFsICs9IGkKICAgIGR1cDIKICAgICsKICAgIGJ1cnkgMgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjAKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZGlnIDIKICAgIDwKICAgIGJueiBtYWluX3doaWxlX3RvcEAyNwoKbWFpbl9ibG9ja0AzMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEyCiAgICAvLyB0ZXN0RG9CcmVhayhzdG9wOiB1aW50NjQsIGJyZWFrTW9kOiB1aW50NjQpIHsKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKbWFpbl90ZXN0RG9fcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3REbyhzdG9wOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgYnVyeSAyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo2CiAgICAvLyBsZXQgaSA9IFVpbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgNAoKbWFpbl93aGlsZV90b3BAMzY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo4CiAgICAvLyBpICs9IDEKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZHVwCiAgICBidXJ5IDUKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjkKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZGlnIDIKICAgIDwKICAgIGJueiBtYWluX3doaWxlX3RvcEAzNgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdERvKHN0b3A6IHVpbnQ2NCkgewogICAgZGlnIDMKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgRG9Mb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDEyCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAQAmAQQVH3x1gABHBDEbQQDTggMEOSOXkgSs4ushBHjo1RY2GgCOAwCRAFIAAiNDMRkURDEYRDYaARdFAjYaAhdFAyNFBCNFAUsDQQAkSwNLAxhAABxJgQIIRQFLAyIIRQRLA0sCDED/30kWKExQsCJDSSIIRQFLAyIIRQRC/+IxGRREMRhENhoBF0UCNhoCF0UFI0UBI0UESwNBAAhLA0sFGEEAEUsDIghJRQVKCEUCSwIMQP/iSRYoTFCwIkMxGRREMRhENhoBF0UCI0UESwMiCElFBUsCDED/80sDFihMULAiQzEZQP9EMRgURCJD", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 4, + "minor": 3, + "patch": 3 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/approvals/out/o2/do-loops/DoLoopsAlgo.clear.teal b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.clear.teal new file mode 100644 index 000000000..a4d580477 --- /dev/null +++ b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 +#pragma typetrack false + +// @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram() -> uint64: +main: + pushint 1 // 1 + return diff --git a/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.0.ssa.ir b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.0.ssa.ir new file mode 100644 index 000000000..c453cbd01 --- /dev/null +++ b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.0.ssa.ir @@ -0,0 +1,175 @@ +main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram: + block@0: // L1 + let tmp%0#0: bool = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__() + return tmp%0#0 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__() -> bool: + block@0: // L4 + let tmp%0#0: uint64 = (txn NumAppArgs) + let tmp%1#0: bool = (!= tmp%0#0 0u) + goto tmp%1#0 ? block@1 : block@7 + block@1: // abi_routing_L4 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "testDo(uint64)uint64" => block@2, method "testDoBreak(uint64,uint64)uint64" => block@3, method "testDoContinue(uint64,uint64)uint64" => block@4, * => block@5} + block@2: // testDo_route_L5 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: bool = (== tmp%3#0 NoOp) + (assert tmp%4#0) // OnCompletion is not NoOp + let tmp%5#0: uint64 = (txn ApplicationID) + let tmp%6#0: bool = (!= tmp%5#0 0u) + (assert tmp%6#0) // can only call when not creating + let reinterpret_bytes[8]%0#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%7#0: uint64 = (btoi reinterpret_bytes[8]%0#0) + let to_encode%0#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(tmp%7#0) + let val_as_bytes%0#0: bytes[8] = (itob to_encode%0#0) + let tmp%8#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%8#0) + return 1u + block@3: // testDoBreak_route_L12 + let tmp%9#0: uint64 = (txn OnCompletion) + let tmp%10#0: bool = (== tmp%9#0 NoOp) + (assert tmp%10#0) // OnCompletion is not NoOp + let tmp%11#0: uint64 = (txn ApplicationID) + let tmp%12#0: bool = (!= tmp%11#0 0u) + (assert tmp%12#0) // can only call when not creating + let reinterpret_bytes[8]%1#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%13#0: uint64 = (btoi reinterpret_bytes[8]%1#0) + let reinterpret_bytes[8]%2#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%14#0: uint64 = (btoi reinterpret_bytes[8]%2#0) + let to_encode%1#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(tmp%13#0, tmp%14#0) + let val_as_bytes%1#0: bytes[8] = (itob to_encode%1#0) + let tmp%15#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) + (log tmp%15#0) + return 1u + block@4: // testDoContinue_route_L23 + let tmp%16#0: uint64 = (txn OnCompletion) + let tmp%17#0: bool = (== tmp%16#0 NoOp) + (assert tmp%17#0) // OnCompletion is not NoOp + let tmp%18#0: uint64 = (txn ApplicationID) + let tmp%19#0: bool = (!= tmp%18#0 0u) + (assert tmp%19#0) // can only call when not creating + let reinterpret_bytes[8]%3#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%20#0: uint64 = (btoi reinterpret_bytes[8]%3#0) + let reinterpret_bytes[8]%4#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%21#0: uint64 = (btoi reinterpret_bytes[8]%4#0) + let to_encode%2#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(tmp%20#0, tmp%21#0) + let val_as_bytes%2#0: bytes[8] = (itob to_encode%2#0) + let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) + (log tmp%22#0) + return 1u + block@5: // switch_case_default_L4 + goto block@6 + block@6: // switch_case_next_L4 + goto block@11 + block@7: // bare_routing_L4 + let tmp%23#0: uint64 = (txn OnCompletion) + switch tmp%23#0 {0u => block@8, * => block@9} + block@8: // __algots__.defaultCreate_L4 + let tmp%24#0: uint64 = (txn ApplicationID) + let tmp%25#0: bool = (== tmp%24#0 0u) + (assert tmp%25#0) // can only call when creating + tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__algots__.defaultCreate() + return 1u + block@9: // switch_case_default_L4 + goto block@10 + block@10: // switch_case_next_L4 + goto block@11 + block@11: // after_if_else_L4 + return 0u + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(stop: uint64) -> uint64: + block@0: // L5 + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L7 + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + goto 1u ? block@2 : block@5 + block@2: // while_body_L7 + let i#2: uint64 = (+ i#1 1u) + let tmp%0#0: bool = (< i#2 stop#0) + goto tmp%0#0 ? block@4 : block@3 + block@3: // if_body_L7 + goto block@6 + block@4: // after_if_else_L7 + goto block@1 + block@5: // after_while_L7 + goto block@6 + block@6: // L7 + let i#3: uint64 = φ(i#2 <- block@3, i#1 <- block@5) + return i#3 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(stop: uint64, breakMod: uint64) -> uint64: + block@0: // L12 + let total#0: uint64 = 0u + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L15 + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#2: uint64 = φ(total#0 <- block@0, total#3 <- block@7) + goto 1u ? block@2 : block@8 + block@2: // while_body_L15 + let tmp%0#0: bool = (> i#1 0u) + goto tmp%0#0 ? block@3 : block@5 + block@3: // and_contd_L16 + let tmp%1#0: uint64 = (% i#1 breakMod#0) + let tmp%2#0: bool = (== tmp%1#0 0u) + goto tmp%2#0 ? block@4 : block@5 + block@4: // if_body_L16 + goto block@9 + block@5: // after_if_else_L16 + let i#3: uint64 = (+ i#1 1u) + let total#3: uint64 = (+ total#2 i#3) + let tmp%3#0: bool = (< i#3 stop#0) + goto tmp%3#0 ? block@7 : block@6 + block@6: // if_body_L15 + goto block@9 + block@7: // after_if_else_L15 + goto block@1 + block@8: // after_while_L15 + goto block@9 + block@9: // L15 + let total#4: uint64 = φ(total#2 <- block@4, total#3 <- block@6, total#2 <- block@8) + return total#4 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(stop: uint64, mod: uint64) -> uint64: + block@0: // L23 + let i#0: uint64 = 0u + let total#0: uint64 = 0u + goto block@1 + block@1: // while_top_L26 + let i#1: uint64 = φ(i#0 <- block@0, i#5 <- block@8) + let total#1: uint64 = φ(total#0 <- block@0, total#5 <- block@8) + goto 1u ? block@2 : block@9 + block@2: // while_body_L26 + let tmp%0#0: bool = (> i#1 0u) + goto tmp%0#0 ? block@3 : block@5 + block@3: // and_contd_L27 + let tmp%1#0: uint64 = (% i#1 mod#0) + let tmp%2#0: bool = (== tmp%1#0 0u) + goto tmp%2#0 ? block@4 : block@5 + block@4: // if_body_L27 + let total#2: uint64 = (+ total#1 2u) + let i#2: uint64 = (+ i#1 1u) + goto block@6 + block@5: // after_if_else_L27 + let total#4: uint64 = (+ total#1 1u) + let i#4: uint64 = (+ i#1 1u) + goto block@6 + block@6: // L26 + let i#5: uint64 = φ(i#2 <- block@4, i#4 <- block@5) + let total#5: uint64 = φ(total#2 <- block@4, total#4 <- block@5) + let tmp%3#0: bool = (< i#5 stop#0) + goto tmp%3#0 ? block@8 : block@7 + block@7: // if_body_L26 + goto block@10 + block@8: // after_if_else_L26 + goto block@1 + block@9: // after_while_L26 + goto block@10 + block@10: // L26 + let total#6: uint64 = φ(total#5 <- block@7, total#1 <- block@9) + return total#6 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__algots__.defaultCreate() -> void: + block@0: // L4 + return \ No newline at end of file diff --git a/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.1.ssa.array.ir b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.1.ssa.array.ir new file mode 100644 index 000000000..0e7756d93 --- /dev/null +++ b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.1.ssa.array.ir @@ -0,0 +1,124 @@ +main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram: + block@0: // L1 + let tmp%0#1: uint64 = (txn NumAppArgs) + goto tmp%0#1 ? block@2 : block@8 + block@2: // abi_routing_L4 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "testDo(uint64)uint64" => block@3, method "testDoBreak(uint64,uint64)uint64" => block@4, method "testDoContinue(uint64,uint64)uint64" => block@5, * => block@12} + block@3: // testDo_route_L5 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: bool = (! tmp%3#0) + (assert tmp%4#0) // OnCompletion is not NoOp + let tmp%5#0: uint64 = (txn ApplicationID) + (assert tmp%5#0) // can only call when not creating + let reinterpret_bytes[8]%0#0: bytes[8] = (txna ApplicationArgs 1) + let stop#2: uint64 = (btoi reinterpret_bytes[8]%0#0) + let i#10: uint64 = 0u + goto block@36 + block@36: // while_top_L7 + let i#11: uint64 = φ(i#10 <- block@3, i#12 <- block@38) + let i#12: uint64 = (+ i#11 1u) + let tmp%0#4: bool = (< i#12 stop#2) + goto tmp%0#4 ? block@38 : block@37 + block@37: // if_body_L7 + let val_as_bytes%0#0: bytes[8] = (itob i#12) + let tmp%8#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%8#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0: bool = 1u + goto block@13 + block@38: // after_if_else_L7 + goto block@36 + block@4: // testDoBreak_route_L12 + let tmp%9#0: uint64 = (txn OnCompletion) + let tmp%10#0: bool = (! tmp%9#0) + (assert tmp%10#0) // OnCompletion is not NoOp + let tmp%11#0: uint64 = (txn ApplicationID) + (assert tmp%11#0) // can only call when not creating + let reinterpret_bytes[8]%1#0: bytes[8] = (txna ApplicationArgs 1) + let stop#1: uint64 = (btoi reinterpret_bytes[8]%1#0) + let reinterpret_bytes[8]%2#0: bytes[8] = (txna ApplicationArgs 2) + let breakMod#0: uint64 = (btoi reinterpret_bytes[8]%2#0) + let total#6: uint64 = 0u + let i#6: uint64 = 0u + goto block@27 + block@27: // while_top_L15 + let i#7: uint64 = φ(i#6 <- block@4, i#9 <- block@32) + let total#8: uint64 = φ(total#6 <- block@4, total#9 <- block@32) + goto i#7 ? block@28 : block@30 + block@28: // and_contd_L16 + let tmp%1#2: uint64 = (% i#7 breakMod#0) + goto tmp%1#2 ? block@30 : block@29 + block@29: // if_body_L16 + goto block@33 + block@30: // after_if_else_L16 + let i#9: uint64 = (+ i#7 1u) + let total#9: uint64 = (+ total#8 i#9) + let tmp%3#2: bool = (< i#9 stop#1) + goto tmp%3#2 ? block@32 : block@31 + block@31: // if_body_L15 + goto block@33 + block@32: // after_if_else_L15 + goto block@27 + block@33: // L15 + let total#10: uint64 = φ(total#8 <- block@29, total#9 <- block@31) + let val_as_bytes%1#0: bytes[8] = (itob total#10) + let tmp%15#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) + (log tmp%15#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1: bool = 1u + goto block@13 + block@5: // testDoContinue_route_L23 + let tmp%16#0: uint64 = (txn OnCompletion) + let tmp%17#0: bool = (! tmp%16#0) + (assert tmp%17#0) // OnCompletion is not NoOp + let tmp%18#0: uint64 = (txn ApplicationID) + (assert tmp%18#0) // can only call when not creating + let reinterpret_bytes[8]%3#0: bytes[8] = (txna ApplicationArgs 1) + let stop#0: uint64 = (btoi reinterpret_bytes[8]%3#0) + let reinterpret_bytes[8]%4#0: bytes[8] = (txna ApplicationArgs 2) + let mod#0: uint64 = (btoi reinterpret_bytes[8]%4#0) + let i#0: uint64 = 0u + let total#0: uint64 = 0u + goto block@17 + block@17: // while_top_L26 + let i#1: uint64 = φ(i#0 <- block@5, i#5 <- block@23) + let total#1: uint64 = φ(total#0 <- block@5, total#5 <- block@23) + goto i#1 ? block@18 : block@20 + block@18: // and_contd_L27 + let tmp%1#1: uint64 = (% i#1 mod#0) + goto tmp%1#1 ? block@20 : block@19 + block@19: // if_body_L27 + let total#2: uint64 = (+ total#1 2u) + let i#2: uint64 = (+ i#1 1u) + goto block@21 + block@20: // after_if_else_L27 + let total#4: uint64 = (+ total#1 1u) + let i#4: uint64 = (+ i#1 1u) + goto block@21 + block@21: // L26 + let i#5: uint64 = φ(i#2 <- block@19, i#4 <- block@20) + let total#5: uint64 = φ(total#2 <- block@19, total#4 <- block@20) + let tmp%3#1: bool = (< i#5 stop#0) + goto tmp%3#1 ? block@23 : block@22 + block@22: // if_body_L26 + let val_as_bytes%2#0: bytes[8] = (itob total#5) + let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) + (log tmp%22#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2: bool = 1u + goto block@13 + block@23: // after_if_else_L26 + goto block@17 + block@8: // bare_routing_L4 + let tmp%23#0: uint64 = (txn OnCompletion) + goto tmp%23#0 ? block@12 : block@9 + block@9: // __algots__.defaultCreate_L4 + let tmp%24#0: uint64 = (txn ApplicationID) + let tmp%25#0: bool = (! tmp%24#0) + (assert tmp%25#0) // can only call when creating + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3: bool = 1u + goto block@13 + block@12: // after_if_else_L4 + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4: bool = 0u + goto block@13 + block@13: // after_inlined_tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router___L1 + let tmp%0#0: bool = φ(tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0 <- block@37, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1 <- block@33, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2 <- block@22, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3 <- block@9, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4 <- block@12) + return tmp%0#0 \ No newline at end of file diff --git a/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.2.ssa.slot.ir new file mode 100644 index 000000000..0e7756d93 --- /dev/null +++ b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.2.ssa.slot.ir @@ -0,0 +1,124 @@ +main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram: + block@0: // L1 + let tmp%0#1: uint64 = (txn NumAppArgs) + goto tmp%0#1 ? block@2 : block@8 + block@2: // abi_routing_L4 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "testDo(uint64)uint64" => block@3, method "testDoBreak(uint64,uint64)uint64" => block@4, method "testDoContinue(uint64,uint64)uint64" => block@5, * => block@12} + block@3: // testDo_route_L5 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: bool = (! tmp%3#0) + (assert tmp%4#0) // OnCompletion is not NoOp + let tmp%5#0: uint64 = (txn ApplicationID) + (assert tmp%5#0) // can only call when not creating + let reinterpret_bytes[8]%0#0: bytes[8] = (txna ApplicationArgs 1) + let stop#2: uint64 = (btoi reinterpret_bytes[8]%0#0) + let i#10: uint64 = 0u + goto block@36 + block@36: // while_top_L7 + let i#11: uint64 = φ(i#10 <- block@3, i#12 <- block@38) + let i#12: uint64 = (+ i#11 1u) + let tmp%0#4: bool = (< i#12 stop#2) + goto tmp%0#4 ? block@38 : block@37 + block@37: // if_body_L7 + let val_as_bytes%0#0: bytes[8] = (itob i#12) + let tmp%8#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%8#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0: bool = 1u + goto block@13 + block@38: // after_if_else_L7 + goto block@36 + block@4: // testDoBreak_route_L12 + let tmp%9#0: uint64 = (txn OnCompletion) + let tmp%10#0: bool = (! tmp%9#0) + (assert tmp%10#0) // OnCompletion is not NoOp + let tmp%11#0: uint64 = (txn ApplicationID) + (assert tmp%11#0) // can only call when not creating + let reinterpret_bytes[8]%1#0: bytes[8] = (txna ApplicationArgs 1) + let stop#1: uint64 = (btoi reinterpret_bytes[8]%1#0) + let reinterpret_bytes[8]%2#0: bytes[8] = (txna ApplicationArgs 2) + let breakMod#0: uint64 = (btoi reinterpret_bytes[8]%2#0) + let total#6: uint64 = 0u + let i#6: uint64 = 0u + goto block@27 + block@27: // while_top_L15 + let i#7: uint64 = φ(i#6 <- block@4, i#9 <- block@32) + let total#8: uint64 = φ(total#6 <- block@4, total#9 <- block@32) + goto i#7 ? block@28 : block@30 + block@28: // and_contd_L16 + let tmp%1#2: uint64 = (% i#7 breakMod#0) + goto tmp%1#2 ? block@30 : block@29 + block@29: // if_body_L16 + goto block@33 + block@30: // after_if_else_L16 + let i#9: uint64 = (+ i#7 1u) + let total#9: uint64 = (+ total#8 i#9) + let tmp%3#2: bool = (< i#9 stop#1) + goto tmp%3#2 ? block@32 : block@31 + block@31: // if_body_L15 + goto block@33 + block@32: // after_if_else_L15 + goto block@27 + block@33: // L15 + let total#10: uint64 = φ(total#8 <- block@29, total#9 <- block@31) + let val_as_bytes%1#0: bytes[8] = (itob total#10) + let tmp%15#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) + (log tmp%15#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1: bool = 1u + goto block@13 + block@5: // testDoContinue_route_L23 + let tmp%16#0: uint64 = (txn OnCompletion) + let tmp%17#0: bool = (! tmp%16#0) + (assert tmp%17#0) // OnCompletion is not NoOp + let tmp%18#0: uint64 = (txn ApplicationID) + (assert tmp%18#0) // can only call when not creating + let reinterpret_bytes[8]%3#0: bytes[8] = (txna ApplicationArgs 1) + let stop#0: uint64 = (btoi reinterpret_bytes[8]%3#0) + let reinterpret_bytes[8]%4#0: bytes[8] = (txna ApplicationArgs 2) + let mod#0: uint64 = (btoi reinterpret_bytes[8]%4#0) + let i#0: uint64 = 0u + let total#0: uint64 = 0u + goto block@17 + block@17: // while_top_L26 + let i#1: uint64 = φ(i#0 <- block@5, i#5 <- block@23) + let total#1: uint64 = φ(total#0 <- block@5, total#5 <- block@23) + goto i#1 ? block@18 : block@20 + block@18: // and_contd_L27 + let tmp%1#1: uint64 = (% i#1 mod#0) + goto tmp%1#1 ? block@20 : block@19 + block@19: // if_body_L27 + let total#2: uint64 = (+ total#1 2u) + let i#2: uint64 = (+ i#1 1u) + goto block@21 + block@20: // after_if_else_L27 + let total#4: uint64 = (+ total#1 1u) + let i#4: uint64 = (+ i#1 1u) + goto block@21 + block@21: // L26 + let i#5: uint64 = φ(i#2 <- block@19, i#4 <- block@20) + let total#5: uint64 = φ(total#2 <- block@19, total#4 <- block@20) + let tmp%3#1: bool = (< i#5 stop#0) + goto tmp%3#1 ? block@23 : block@22 + block@22: // if_body_L26 + let val_as_bytes%2#0: bytes[8] = (itob total#5) + let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) + (log tmp%22#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2: bool = 1u + goto block@13 + block@23: // after_if_else_L26 + goto block@17 + block@8: // bare_routing_L4 + let tmp%23#0: uint64 = (txn OnCompletion) + goto tmp%23#0 ? block@12 : block@9 + block@9: // __algots__.defaultCreate_L4 + let tmp%24#0: uint64 = (txn ApplicationID) + let tmp%25#0: bool = (! tmp%24#0) + (assert tmp%25#0) // can only call when creating + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3: bool = 1u + goto block@13 + block@12: // after_if_else_L4 + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4: bool = 0u + goto block@13 + block@13: // after_inlined_tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router___L1 + let tmp%0#0: bool = φ(tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0 <- block@37, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1 <- block@33, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2 <- block@22, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3 <- block@9, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4 <- block@12) + return tmp%0#0 \ No newline at end of file diff --git a/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.0.ssa.ir b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.0.ssa.ir new file mode 100644 index 000000000..1253eaad9 --- /dev/null +++ b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.0.ssa.ir @@ -0,0 +1,3 @@ +main @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.1.ssa.array.ir b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.1.ssa.array.ir new file mode 100644 index 000000000..1253eaad9 --- /dev/null +++ b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.1.ssa.array.ir @@ -0,0 +1,3 @@ +main @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.2.ssa.slot.ir b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.2.ssa.slot.ir new file mode 100644 index 000000000..1253eaad9 --- /dev/null +++ b/tests/approvals/out/o2/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.2.ssa.slot.ir @@ -0,0 +1,3 @@ +main @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/tests/approvals/out/o2/do-loops/do-loops.awst b/tests/approvals/out/o2/do-loops/do-loops.awst index 7c51ebfb7..eafa96dd5 100644 --- a/tests/approvals/out/o2/do-loops/do-loops.awst +++ b/tests/approvals/out/o2/do-loops/do-loops.awst @@ -1,12 +1,69 @@ -subroutine test_do(stop: uint64): void +contract DoLoopsAlgo { - i: uint64 = 0 - while (True) { - i: uint64 = i + 1 - #loop₁ᶜ: - if (!i < stop) { - goto #loop₁ᵇ + approvalProgram(): bool + { + return arc4Router() + } + + clearProgram(): bool + { + return True + } + + testDo(stop: uint64): uint64 + { + i: uint64 = 0 + while (True) { + i: uint64 = i + 1 + if (!i < stop) { + goto #loop₁ᵇ + } + } + #loop₁ᵇ: + return i + } + + testDoBreak(stop: uint64, breakMod: uint64): uint64 + { + total: uint64 = 0 + i: uint64 = 0 + while (True) { + if (i > 0 and i % breakMod == 0) { + goto #loop₁ᵇ + } + i: uint64 = i + 1 + total: uint64 = total + i + if (!i < stop) { + goto #loop₁ᵇ + } } + #loop₁ᵇ: + return total + } + + testDoContinue(stop: uint64, mod: uint64): uint64 + { + i: uint64 = 0 + total: uint64 = 0 + while (True) { + if (i > 0 and i % mod == 0) { + total: uint64 = total + 2 + i: uint64 = i + 1 + goto #loop₁ᶜ + } + total: uint64 = total + 1 + i: uint64 = i + 1 + #loop₁ᶜ: + if (!i < stop) { + goto #loop₁ᵇ + } + } + #loop₁ᵇ: + return total + } + + __algots__.defaultCreate(): void + { } - #loop₁ᵇ: + } \ No newline at end of file diff --git a/tests/approvals/out/o2/do-loops/do-loops.awst.json b/tests/approvals/out/o2/do-loops/do-loops.awst.json index 290dd6bbe..a982373dc 100644 --- a/tests/approvals/out/o2/do-loops/do-loops.awst.json +++ b/tests/approvals/out/o2/do-loops/do-loops.awst.json @@ -1,67 +1,1384 @@ [ { - "_type": "Subroutine", + "_type": "Contract", "source_location": { "file": "tests/approvals/do-loops.algo.ts", "line": 4, "end_line": 4, "column": 0, - "end_column": 30 + "end_column": 43 }, - "args": [ + "id": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "name": "DoLoopsAlgo", + "description": null, + "method_resolution_order": [ + "@algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract", + "@algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract" + ], + "approval_program": { + "_type": "ContractMethod", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "args": [], + "return_type": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "body": [ + { + "_type": "ReturnStatement", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "value": { + "_type": "ARC4Router", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + } + } + ], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "@algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract", + "member_name": "approvalProgram", + "arc4_method_config": null + }, + "clear_program": { + "_type": "ContractMethod", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "args": [], + "return_type": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "body": [ + { + "_type": "ReturnStatement", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "value": { + "_type": "BoolConstant", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + } + } + ], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "@algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract", + "member_name": "clearStateProgram", + "arc4_method_config": null + }, + "methods": [ { - "_type": "SubroutineArgument", - "name": "stop", + "_type": "ContractMethod", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 4, - "end_line": 4, - "column": 17, - "end_column": 29 + "line": 5, + "end_line": 5, + "column": 2, + "end_column": 22 + }, + "args": [ + { + "_type": "SubroutineArgument", + "name": "stop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 5, + "end_line": 5, + "column": 9, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + } + ], + "return_type": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 5, + "end_line": 11, + "column": 23, + "end_column": 3 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 6, + "end_line": 6, + "column": 8, + "end_column": 21 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 6, + "end_line": 6, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 6, + "end_line": 6, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "WhileLoop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "BoolConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + }, + "loop_body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 7, + "end_column": 5 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 12 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } + } + ], + "label": null, + "comment": null + }, + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "Not", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "expr": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": "<", + "rhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 17, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "stop" + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null + } + ], + "label": null, + "comment": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [], + "label": "#loop₁ᵇ", + "comment": null + } + ], + "label": null, + "comment": null + }, + { + "_type": "ReturnStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 10, + "end_line": 10, + "column": 4, + "end_column": 12 + }, + "value": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 10, + "end_line": 10, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + } + } + ], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "testDo", + "arc4_method_config": { + "_type": "ARC4ABIMethodConfig", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 5, + "end_line": 5, + "column": 2, + "end_column": 22 + }, + "allowed_completion_types": [ + 0 + ], + "create": 3, + "name": "testDo", + "readonly": false, + "default_args": {} + } + }, + { + "_type": "ContractMethod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 12, + "column": 2, + "end_column": 45 + }, + "args": [ + { + "_type": "SubroutineArgument", + "name": "stop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 12, + "column": 14, + "end_column": 26 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + }, + { + "_type": "SubroutineArgument", + "name": "breakMod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 12, + "column": 28, + "end_column": 44 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + } + ], + "return_type": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 22, + "column": 46, + "end_column": 3 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 13, + "end_line": 13, + "column": 8, + "end_column": 25 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 13, + "end_line": 13, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 13, + "end_line": 13, + "column": 23, + "end_column": 24 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 14, + "end_line": 14, + "column": 8, + "end_column": 21 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 14, + "end_line": 14, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 14, + "end_line": 14, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "WhileLoop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "BoolConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + }, + "loop_body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 7, + "end_column": 5 + }, + "body": [ + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 6, + "end_column": 38 + }, + "condition": { + "_type": "BooleanBinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 10, + "end_column": 37 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 10, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 10, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": ">", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 14, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + "op": "and", + "right": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 19, + "end_column": 37 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 19, + "end_column": 31 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "%", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 23, + "end_column": 31 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "breakMod" + } + }, + "operator": "==", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 36, + "end_column": 37 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 39, + "end_column": 44 + }, + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 39, + "end_column": 44 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 12 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 16 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "op": "+", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 15, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + } + } + } + ], + "label": null, + "comment": null + }, + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "Not", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "expr": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": "<", + "rhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 17, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "stop" + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null + } + ], + "label": null, + "comment": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [], + "label": "#loop₁ᵇ", + "comment": null + } + ], + "label": null, + "comment": null + }, + { + "_type": "ReturnStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 21, + "end_line": 21, + "column": 4, + "end_column": 16 + }, + "value": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 21, + "end_line": 21, + "column": 11, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + } + } + ], + "label": null, + "comment": null }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 - } - } - ], - "return_type": { - "_type": "WType", - "name": "void", - "immutable": true, - "ephemeral": false, - "scalar_type": null - }, - "body": { - "_type": "Block", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 4, - "end_line": 9, - "column": 31, - "end_column": 1 - }, - "body": [ - { - "_type": "AssignmentStatement", + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "testDoBreak", + "arc4_method_config": { + "_type": "ARC4ABIMethodConfig", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 5, - "end_line": 5, - "column": 6, - "end_column": 19 + "line": 12, + "end_line": 12, + "column": 2, + "end_column": 45 }, - "target": { - "_type": "VarExpression", + "allowed_completion_types": [ + 0 + ], + "create": 3, + "name": "testDoBreak", + "readonly": false, + "default_args": {} + } + }, + { + "_type": "ContractMethod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 23, + "end_line": 23, + "column": 2, + "end_column": 43 + }, + "args": [ + { + "_type": "SubroutineArgument", + "name": "stop", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 5, - "end_line": 5, - "column": 6, - "end_column": 7 + "line": 23, + "end_line": 23, + "column": 17, + "end_column": 29 }, "wtype": { "_type": "WType", @@ -69,17 +1386,17 @@ "immutable": true, "ephemeral": false, "scalar_type": 2 - }, - "name": "i" + } }, - "value": { - "_type": "IntegerConstant", + { + "_type": "SubroutineArgument", + "name": "mod", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 5, - "end_line": 5, - "column": 17, - "end_column": 18 + "line": 23, + "end_line": 23, + "column": 31, + "end_column": 42 }, "wtype": { "_type": "WType", @@ -87,309 +1404,992 @@ "immutable": true, "ephemeral": false, "scalar_type": 2 - }, - "value": "0", - "teal_alias": null + } } + ], + "return_type": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 }, - { + "body": { "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 23, + "end_line": 36, + "column": 44, + "end_column": 3 }, "body": [ { - "_type": "WhileLoop", + "_type": "AssignmentStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 24, + "end_line": 24, + "column": 8, + "end_column": 21 }, - "condition": { - "_type": "BoolConstant", + "target": { + "_type": "VarExpression", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 24, + "end_line": 24, + "column": 8, + "end_column": 9 }, "wtype": { "_type": "WType", - "name": "bool", + "name": "uint64", "immutable": true, "ephemeral": false, "scalar_type": 2 }, - "value": true + "name": "i" }, - "loop_body": { - "_type": "Block", + "value": { + "_type": "IntegerConstant", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, + "line": 24, + "end_line": 24, + "column": 19, "end_column": 20 }, - "body": [ - { + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 25, + "end_line": 25, + "column": 8, + "end_column": 25 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 25, + "end_line": 25, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 25, + "end_line": 25, + "column": 23, + "end_column": 24 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "WhileLoop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "BoolConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + }, + "loop_body": { "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 5, - "end_column": 3 + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, "body": [ { - "_type": "AssignmentStatement", + "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 10 - }, - "target": { - "_type": "VarExpression", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 5 - }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 - }, - "name": "i" + "line": 26, + "end_line": 34, + "column": 7, + "end_column": 5 }, - "value": { - "_type": "UInt64BinaryOperation", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 10 - }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "body": [ + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 6, + "end_column": 33 + }, + "condition": { + "_type": "BooleanBinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 10, + "end_column": 32 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 10, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 10, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": ">", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 14, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + "op": "and", + "right": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 19, + "end_column": 32 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 19, + "end_column": 26 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "%", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 23, + "end_column": 26 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "mod" + } + }, + "operator": "==", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 31, + "end_column": 32 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 31, + "column": 34, + "end_column": 7 + }, + "body": [ + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 31, + "column": 34, + "end_column": 7 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 18 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 18 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 17, + "end_column": 18 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "2", + "teal_alias": null + } + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 14 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } + }, + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 30, + "end_line": 30, + "column": 8, + "end_column": 16 + }, + "target": "#loop₁ᶜ" + } + ], + "label": null, + "comment": null + } + ], + "label": null, + "comment": null + }, + "else_branch": null }, - "left": { - "_type": "VarExpression", + { + "_type": "AssignmentStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 5 + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 16 }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" }, - "name": "i" + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 15, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } }, - "op": "+", - "right": { - "_type": "IntegerConstant", + { + "_type": "AssignmentStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 9, - "end_column": 10 + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 12 }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" }, - "value": "1", - "teal_alias": null + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } } - } - } - ], - "label": null, - "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, - { - "_type": "IfElse", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "condition": { - "_type": "Not", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 11, - "end_column": 19 - }, - "wtype": { - "_type": "WType", - "name": "bool", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + ], + "label": null, + "comment": null }, - "expr": { - "_type": "NumericComparisonExpression", + { + "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 11, - "end_column": 19 + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, - "wtype": { - "_type": "WType", - "name": "bool", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "body": [], + "label": "#loop₁ᶜ", + "comment": null + }, + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, - "lhs": { - "_type": "VarExpression", + "condition": { + "_type": "Not", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 11, - "end_column": 12 + "line": 34, + "end_line": 34, + "column": 13, + "end_column": 21 }, "wtype": { "_type": "WType", - "name": "uint64", + "name": "bool", "immutable": true, "ephemeral": false, "scalar_type": 2 }, - "name": "i" + "expr": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 34, + "end_line": 34, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 34, + "end_line": 34, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": "<", + "rhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 34, + "end_line": 34, + "column": 17, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "stop" + } + } }, - "operator": "<", - "rhs": { - "_type": "VarExpression", + "if_branch": { + "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 15, - "end_column": 19 - }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, - "name": "stop" - } + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null } - }, - "if_branch": { - "_type": "Block", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "body": [ - { - "_type": "Goto", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "target": "#loop₁ᵇ" - } - ], - "label": null, - "comment": null - }, - "else_branch": null + ], + "label": null, + "comment": null } - ], - "label": null, - "comment": null - } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "body": [], + "label": "#loop₁ᵇ", + "comment": null + } + ], + "label": null, + "comment": null }, { - "_type": "Block", + "_type": "ReturnStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 35, + "end_line": 35, + "column": 4, + "end_column": 16 }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null + "value": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 35, + "end_line": 35, + "column": 11, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + } } ], "label": null, "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "testDoContinue", + "arc4_method_config": { + "_type": "ARC4ABIMethodConfig", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 23, + "end_line": 23, + "column": 2, + "end_column": 43 + }, + "allowed_completion_types": [ + 0 + ], + "create": 3, + "name": "testDoContinue", + "readonly": false, + "default_args": {} + } + }, + { + "_type": "ContractMethod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 4, + "end_line": 4, + "column": 0, + "end_column": 43 + }, + "args": [], + "return_type": { + "_type": "WType", + "name": "void", + "immutable": true, + "ephemeral": false, + "scalar_type": null + }, + "body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 4, + "end_line": 4, + "column": 0, + "end_column": 43 + }, + "body": [], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": "Implicitly generated create method", + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "__algots__.defaultCreate", + "arc4_method_config": { + "_type": "ARC4BareMethodConfig", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 4, + "end_line": 4, + "column": 0, + "end_column": 43 + }, + "allowed_completion_types": [ + 0 + ], + "create": 2 } - ], - "label": null, - "comment": null - }, - "documentation": { - "_type": "MethodDocumentation", - "description": null, - "args": {}, - "returns": null + } + ], + "app_state": [], + "state_totals": { + "_type": "StateTotals", + "global_uints": null, + "local_uints": null, + "global_bytes": null, + "local_bytes": null }, - "inline": null, - "id": "tests/approvals/do-loops.algo.ts::test_do", - "name": "test_do" + "reserved_scratch_space": [], + "avm_version": null } ] \ No newline at end of file diff --git a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.approval.teal b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.approval.teal index bd394641a..fe70cd6af 100644 --- a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.approval.teal +++ b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.approval.teal @@ -65,18 +65,21 @@ main_while_top@20: < bz main_after_while@24 // tests/approvals/for-loops.algo.ts:36 - // total += j + j - dig 4 + // total += i + j + dig 5 + dup + dig 6 dup - dig 1 + cover 3 + - dig 2 + dig 3 + - bury 2 + bury 3 // tests/approvals/for-loops.algo.ts:38 - // if (j === start) break outer - dig 4 - == + // if (i * j > stop) break outer + * + dig 2 + > bnz main_block@26 // tests/approvals/for-loops.algo.ts:35 // for (let j = start; j < stop; j += step) { diff --git a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.arc32.json b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.arc32.json index d2dca7899..ee0deb09f 100644 --- a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.arc32.json +++ b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.arc32.json @@ -22,7 +22,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHhmODY1NGY3MyAweDI4N2Y0YzAyIDB4NGJkNzc3OGMgMHgzMzY3NWUwNiAvLyBtZXRob2QgInRlc3RfZm9yX2xvb3AodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2JyZWFrKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9jb250aW51ZSh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX2xvb3BfbGFiZWxsZWQodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9sb29wX2JyZWFrX3JvdXRlQDQgbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDUgbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDYKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3BfbGFiZWxsZWRfcm91dGVANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozMgogICAgLy8gdGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGJ1cnkgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzMKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMgogICAgYnVyeSA2CgptYWluX3doaWxlX3RvcEAxODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNAogICAgLy8gb3V0ZXI6IGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZGlnIDUKICAgIGRpZyAyCiAgICA8CiAgICBieiBtYWluX2Jsb2NrQDI2CiAgICBkaWcgMwogICAgYnVyeSA1CgptYWluX3doaWxlX3RvcEAyMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBkaWcgNAogICAgZGlnIDIKICAgIDwKICAgIGJ6IG1haW5fYWZ0ZXJfd2hpbGVAMjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNgogICAgLy8gdG90YWwgKz0gaiArIGoKICAgIGRpZyA0CiAgICBkdXAKICAgIGRpZyAxCiAgICArCiAgICBkaWcgMgogICAgKwogICAgYnVyeSAyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzgKICAgIC8vIGlmIChqID09PSBzdGFydCkgYnJlYWsgb3V0ZXIKICAgIGRpZyA0CiAgICA9PQogICAgYm56IG1haW5fYmxvY2tAMjYKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBkaWcgNAogICAgZGlnIDMKICAgICsKICAgIGJ1cnkgNQogICAgYiBtYWluX3doaWxlX3RvcEAyMAoKbWFpbl9ibG9ja0AyNjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozMgogICAgLy8gdGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgZHVwCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FmdGVyX3doaWxlQDI0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyBvdXRlcjogZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBkaWcgNQogICAgZGlnIDMKICAgICsKICAgIGJ1cnkgNgogICAgYiBtYWluX3doaWxlX3RvcEAxOAoKbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjQKICAgIC8vIHRlc3RfZm9yX2xvb3BfY29udGludWUoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGJ1cnkgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjUKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMgogICAgYnVyeSA2CgptYWluX3doaWxlX3RvcEAyOToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNgogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBkaWcgNQogICAgZGlnIDIKICAgIDwKICAgIGJ6IG1haW5fYWZ0ZXJfd2hpbGVAMzQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNwogICAgLy8gaWYgKGkgJSA1ID09PSAwKSBjb250aW51ZQogICAgZGlnIDUKICAgIHB1c2hpbnQgNSAvLyA1CiAgICAlCiAgICBieiBtYWluX2Jsb2NrQDMzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIHRvdGFsICs9IGkKICAgIGR1cAogICAgZGlnIDYKICAgICsKICAgIGJ1cnkgMQoKbWFpbl9ibG9ja0AzMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNgogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBkaWcgNQogICAgZGlnIDMKICAgICsKICAgIGJ1cnkgNgogICAgYiBtYWluX3doaWxlX3RvcEAyOQoKbWFpbl9hZnRlcl93aGlsZUAzNDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgZHVwCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3BfYnJlYWtfcm91dGVANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgYnVyeSAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICBidXJ5IDQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNAogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCiAgICBidXJ5IDYKCm1haW5fd2hpbGVfdG9wQDM3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE1CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMgogICAgPAogICAgYnogbWFpbl9ibG9ja0A0MgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE2CiAgICAvLyB0b3RhbCArPSBpCiAgICBkdXAKICAgIGRpZyA2CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyBpZiAodG90YWwgPiAxMCkgewogICAgcHVzaGludCAxMCAvLyAxMAogICAgPgogICAgYm56IG1haW5fYmxvY2tANDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBkaWcgNQogICAgZGlnIDMKICAgICsKICAgIGJ1cnkgNgogICAgYiBtYWluX3doaWxlX3RvcEAzNwoKbWFpbl9ibG9ja0A0MjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgZHVwCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3Bfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBidXJ5IDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMgogICAgYnVyeSA2CgptYWluX3doaWxlX3RvcEA0NToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMgogICAgPAogICAgYnogbWFpbl9hZnRlcl93aGlsZUA0NwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRvdGFsICs9IGkKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgYnVyeSAyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBkaWcgMwogICAgKwogICAgYnVyeSA2CiAgICBiIG1haW5fd2hpbGVfdG9wQDQ1CgptYWluX2FmdGVyX3doaWxlQDQ3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAOToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDEzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHhmODY1NGY3MyAweDI4N2Y0YzAyIDB4NGJkNzc3OGMgMHgzMzY3NWUwNiAvLyBtZXRob2QgInRlc3RfZm9yX2xvb3AodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2JyZWFrKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9jb250aW51ZSh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX2xvb3BfbGFiZWxsZWQodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9sb29wX2JyZWFrX3JvdXRlQDQgbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDUgbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDYKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3BfbGFiZWxsZWRfcm91dGVANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozMgogICAgLy8gdGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGJ1cnkgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzMKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMgogICAgYnVyeSA2CgptYWluX3doaWxlX3RvcEAxODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNAogICAgLy8gb3V0ZXI6IGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZGlnIDUKICAgIGRpZyAyCiAgICA8CiAgICBieiBtYWluX2Jsb2NrQDI2CiAgICBkaWcgMwogICAgYnVyeSA1CgptYWluX3doaWxlX3RvcEAyMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBkaWcgNAogICAgZGlnIDIKICAgIDwKICAgIGJ6IG1haW5fYWZ0ZXJfd2hpbGVAMjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNgogICAgLy8gdG90YWwgKz0gaSArIGoKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGRpZyAzCiAgICArCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozOAogICAgLy8gaWYgKGkgKiBqID4gc3RvcCkgYnJlYWsgb3V0ZXIKICAgICoKICAgIGRpZyAyCiAgICA+CiAgICBibnogbWFpbl9ibG9ja0AyNgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyBmb3IgKGxldCBqID0gc3RhcnQ7IGogPCBzdG9wOyBqICs9IHN0ZXApIHsKICAgIGRpZyA0CiAgICBkaWcgMwogICAgKwogICAgYnVyeSA1CiAgICBiIG1haW5fd2hpbGVfdG9wQDIwCgptYWluX2Jsb2NrQDI2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWZ0ZXJfd2hpbGVAMjQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzQKICAgIC8vIG91dGVyOiBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMwogICAgKwogICAgYnVyeSA2CiAgICBiIG1haW5fd2hpbGVfdG9wQDE4CgptYWluX3Rlc3RfZm9yX2xvb3BfY29udGludWVfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgYnVyeSAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICBidXJ5IDQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNQogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCiAgICBidXJ5IDYKCm1haW5fd2hpbGVfdG9wQDI5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMgogICAgPAogICAgYnogbWFpbl9hZnRlcl93aGlsZUAzNAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBpZiAoaSAlIDUgPT09IDApIGNvbnRpbnVlCiAgICBkaWcgNQogICAgcHVzaGludCA1IC8vIDUKICAgICUKICAgIGJ6IG1haW5fYmxvY2tAMzMKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyOAogICAgLy8gdG90YWwgKz0gaQogICAgZHVwCiAgICBkaWcgNgogICAgKwogICAgYnVyeSAxCgptYWluX2Jsb2NrQDMzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMwogICAgKwogICAgYnVyeSA2CiAgICBiIG1haW5fd2hpbGVfdG9wQDI5CgptYWluX2FmdGVyX3doaWxlQDM0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI0CiAgICAvLyB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9icmVha19yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBidXJ5IDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE0CiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDIKICAgIGJ1cnkgNgoKbWFpbl93aGlsZV90b3BAMzc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTUKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZGlnIDUKICAgIGRpZyAyCiAgICA8CiAgICBieiBtYWluX2Jsb2NrQDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTYKICAgIC8vIHRvdGFsICs9IGkKICAgIGR1cAogICAgZGlnIDYKICAgICsKICAgIGR1cAogICAgYnVyeSAyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIGlmICh0b3RhbCA+IDEwKSB7CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICA+CiAgICBibnogbWFpbl9ibG9ja0A0MgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE1CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMwogICAgKwogICAgYnVyeSA2CiAgICBiIG1haW5fd2hpbGVfdG9wQDM3CgptYWluX2Jsb2NrQDQyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGJ1cnkgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NgogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCiAgICBidXJ5IDYKCm1haW5fd2hpbGVfdG9wQDQ1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZGlnIDUKICAgIGRpZyAyCiAgICA8CiAgICBieiBtYWluX2FmdGVyX3doaWxlQDQ3CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OAogICAgLy8gdG90YWwgKz0gaQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBidXJ5IDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyAzCiAgICArCiAgICBidXJ5IDYKICAgIGIgbWFpbl93aGlsZV90b3BANDUKCm1haW5fYWZ0ZXJfd2hpbGVANDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgZHVwCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0A5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMTMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.arc56.json b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.arc56.json index 6913ce3b6..09dcf571b 100644 --- a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.arc56.json +++ b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.arc56.json @@ -158,24 +158,24 @@ { "pc": [ 61, - 157, - 225, - 292 + 161, + 229, + 296 ], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [ - 358 + 362 ], "errorMessage": "can only call when creating" }, { "pc": [ 64, - 160, - 228, - 295 + 164, + 232, + 299 ], "errorMessage": "can only call when not creating" } @@ -188,11 +188,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHhmODY1NGY3MyAweDI4N2Y0YzAyIDB4NGJkNzc3OGMgMHgzMzY3NWUwNiAvLyBtZXRob2QgInRlc3RfZm9yX2xvb3AodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2JyZWFrKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9jb250aW51ZSh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX2xvb3BfbGFiZWxsZWQodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9sb29wX2JyZWFrX3JvdXRlQDQgbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDUgbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDYKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3BfbGFiZWxsZWRfcm91dGVANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozMgogICAgLy8gdGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGJ1cnkgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzMKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMgogICAgYnVyeSA2CgptYWluX3doaWxlX3RvcEAxODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNAogICAgLy8gb3V0ZXI6IGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZGlnIDUKICAgIGRpZyAyCiAgICA8CiAgICBieiBtYWluX2Jsb2NrQDI2CiAgICBkaWcgMwogICAgYnVyeSA1CgptYWluX3doaWxlX3RvcEAyMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBkaWcgNAogICAgZGlnIDIKICAgIDwKICAgIGJ6IG1haW5fYWZ0ZXJfd2hpbGVAMjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNgogICAgLy8gdG90YWwgKz0gaiArIGoKICAgIGRpZyA0CiAgICBkdXAKICAgIGRpZyAxCiAgICArCiAgICBkaWcgMgogICAgKwogICAgYnVyeSAyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzgKICAgIC8vIGlmIChqID09PSBzdGFydCkgYnJlYWsgb3V0ZXIKICAgIGRpZyA0CiAgICA9PQogICAgYm56IG1haW5fYmxvY2tAMjYKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBkaWcgNAogICAgZGlnIDMKICAgICsKICAgIGJ1cnkgNQogICAgYiBtYWluX3doaWxlX3RvcEAyMAoKbWFpbl9ibG9ja0AyNjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozMgogICAgLy8gdGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgZHVwCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FmdGVyX3doaWxlQDI0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyBvdXRlcjogZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBkaWcgNQogICAgZGlnIDMKICAgICsKICAgIGJ1cnkgNgogICAgYiBtYWluX3doaWxlX3RvcEAxOAoKbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjQKICAgIC8vIHRlc3RfZm9yX2xvb3BfY29udGludWUoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGJ1cnkgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjUKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMgogICAgYnVyeSA2CgptYWluX3doaWxlX3RvcEAyOToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNgogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBkaWcgNQogICAgZGlnIDIKICAgIDwKICAgIGJ6IG1haW5fYWZ0ZXJfd2hpbGVAMzQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNwogICAgLy8gaWYgKGkgJSA1ID09PSAwKSBjb250aW51ZQogICAgZGlnIDUKICAgIHB1c2hpbnQgNSAvLyA1CiAgICAlCiAgICBieiBtYWluX2Jsb2NrQDMzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIHRvdGFsICs9IGkKICAgIGR1cAogICAgZGlnIDYKICAgICsKICAgIGJ1cnkgMQoKbWFpbl9ibG9ja0AzMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNgogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBkaWcgNQogICAgZGlnIDMKICAgICsKICAgIGJ1cnkgNgogICAgYiBtYWluX3doaWxlX3RvcEAyOQoKbWFpbl9hZnRlcl93aGlsZUAzNDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgZHVwCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3BfYnJlYWtfcm91dGVANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgYnVyeSAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICBidXJ5IDQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNAogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCiAgICBidXJ5IDYKCm1haW5fd2hpbGVfdG9wQDM3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE1CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMgogICAgPAogICAgYnogbWFpbl9ibG9ja0A0MgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE2CiAgICAvLyB0b3RhbCArPSBpCiAgICBkdXAKICAgIGRpZyA2CiAgICArCiAgICBkdXAKICAgIGJ1cnkgMgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyBpZiAodG90YWwgPiAxMCkgewogICAgcHVzaGludCAxMCAvLyAxMAogICAgPgogICAgYm56IG1haW5fYmxvY2tANDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBkaWcgNQogICAgZGlnIDMKICAgICsKICAgIGJ1cnkgNgogICAgYiBtYWluX3doaWxlX3RvcEAzNwoKbWFpbl9ibG9ja0A0MjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgZHVwCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3Bfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBidXJ5IDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMgogICAgYnVyeSA2CgptYWluX3doaWxlX3RvcEA0NToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMgogICAgPAogICAgYnogbWFpbl9hZnRlcl93aGlsZUA0NwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRvdGFsICs9IGkKICAgIGR1cAogICAgZGlnIDYKICAgIGR1cAogICAgY292ZXIgMgogICAgKwogICAgYnVyeSAyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBkaWcgMwogICAgKwogICAgYnVyeSA2CiAgICBiIG1haW5fd2hpbGVfdG9wQDQ1CgptYWluX2FmdGVyX3doaWxlQDQ3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdAOToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDEzCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiA1CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHhmODY1NGY3MyAweDI4N2Y0YzAyIDB4NGJkNzc3OGMgMHgzMzY3NWUwNiAvLyBtZXRob2QgInRlc3RfZm9yX2xvb3AodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2JyZWFrKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9jb250aW51ZSh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInRlc3RfZm9yX2xvb3BfbGFiZWxsZWQodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9sb29wX2JyZWFrX3JvdXRlQDQgbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDUgbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDYKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICBpbnRjXzAgLy8gMAogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX2xvb3BfbGFiZWxsZWRfcm91dGVANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozMgogICAgLy8gdGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDUKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGJ1cnkgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzMKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGJ1cnkgMgogICAgYnVyeSA2CgptYWluX3doaWxlX3RvcEAxODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNAogICAgLy8gb3V0ZXI6IGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZGlnIDUKICAgIGRpZyAyCiAgICA8CiAgICBieiBtYWluX2Jsb2NrQDI2CiAgICBkaWcgMwogICAgYnVyeSA1CgptYWluX3doaWxlX3RvcEAyMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBkaWcgNAogICAgZGlnIDIKICAgIDwKICAgIGJ6IG1haW5fYWZ0ZXJfd2hpbGVAMjQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNgogICAgLy8gdG90YWwgKz0gaSArIGoKICAgIGRpZyA1CiAgICBkdXAKICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDMKICAgICsKICAgIGRpZyAzCiAgICArCiAgICBidXJ5IDMKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozOAogICAgLy8gaWYgKGkgKiBqID4gc3RvcCkgYnJlYWsgb3V0ZXIKICAgICoKICAgIGRpZyAyCiAgICA+CiAgICBibnogbWFpbl9ibG9ja0AyNgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyBmb3IgKGxldCBqID0gc3RhcnQ7IGogPCBzdG9wOyBqICs9IHN0ZXApIHsKICAgIGRpZyA0CiAgICBkaWcgMwogICAgKwogICAgYnVyeSA1CiAgICBiIG1haW5fd2hpbGVfdG9wQDIwCgptYWluX2Jsb2NrQDI2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWZ0ZXJfd2hpbGVAMjQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzQKICAgIC8vIG91dGVyOiBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMwogICAgKwogICAgYnVyeSA2CiAgICBiIG1haW5fd2hpbGVfdG9wQDE4CgptYWluX3Rlc3RfZm9yX2xvb3BfY29udGludWVfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgYnVyeSAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICBidXJ5IDQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNQogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCiAgICBidXJ5IDYKCm1haW5fd2hpbGVfdG9wQDI5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMgogICAgPAogICAgYnogbWFpbl9hZnRlcl93aGlsZUAzNAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBpZiAoaSAlIDUgPT09IDApIGNvbnRpbnVlCiAgICBkaWcgNQogICAgcHVzaGludCA1IC8vIDUKICAgICUKICAgIGJ6IG1haW5fYmxvY2tAMzMKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyOAogICAgLy8gdG90YWwgKz0gaQogICAgZHVwCiAgICBkaWcgNgogICAgKwogICAgYnVyeSAxCgptYWluX2Jsb2NrQDMzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMwogICAgKwogICAgYnVyeSA2CiAgICBiIG1haW5fd2hpbGVfdG9wQDI5CgptYWluX2FmdGVyX3doaWxlQDM0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI0CiAgICAvLyB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9icmVha19yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICBidXJ5IDMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIGJ1cnkgNAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE0CiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICBidXJ5IDIKICAgIGJ1cnkgNgoKbWFpbl93aGlsZV90b3BAMzc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTUKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZGlnIDUKICAgIGRpZyAyCiAgICA8CiAgICBieiBtYWluX2Jsb2NrQDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTYKICAgIC8vIHRvdGFsICs9IGkKICAgIGR1cAogICAgZGlnIDYKICAgICsKICAgIGR1cAogICAgYnVyeSAyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIGlmICh0b3RhbCA+IDEwKSB7CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICA+CiAgICBibnogbWFpbl9ibG9ja0A0MgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE1CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyA1CiAgICBkaWcgMwogICAgKwogICAgYnVyeSA2CiAgICBiIG1haW5fd2hpbGVfdG9wQDM3CgptYWluX2Jsb2NrQDQyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fdGVzdF9mb3JfbG9vcF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIGJ1cnkgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgYnVyeSA0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NgogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAyCiAgICBidXJ5IDYKCm1haW5fd2hpbGVfdG9wQDQ1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZGlnIDUKICAgIGRpZyAyCiAgICA8CiAgICBieiBtYWluX2FmdGVyX3doaWxlQDQ3CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OAogICAgLy8gdG90YWwgKz0gaQogICAgZHVwCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBidXJ5IDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGRpZyAzCiAgICArCiAgICBidXJ5IDYKICAgIGIgbWFpbl93aGlsZV90b3BANDUKCm1haW5fYWZ0ZXJfd2hpbGVANDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgZHVwCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0A5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMTMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CiACAAEmAQQVH3x1gABHBTEbQQFJggQE+GVPcwQof0wCBEvXd4wEM2deBjYaAI4EAOkApgBiAAIiQzEZFEQxGEQ2GgEXSUUFNhoCF0UDNhoDF0UEIkUCRQZLBUsCDEEAJ0sDRQVLBEsCDEEAI0sESUsBCEsCCEUCSwQSQAAKSwRLAwhFBUL/3UkWKExQsCNDSwVLAwhFBkL/vzEZFEQxGEQ2GgEXNhoCF0UDNhoDF0UEIkUCRQZLBUsCDEEAGEsFgQUYQQAGSUsGCEUBSwVLAwhFBkL/4EkWKExQsCNDMRkURDEYRDYaARc2GgIXRQM2GgMXRQQiRQJFBksFSwIMQQAXSUsGCElFAoEKDUAACksFSwMIRQZC/+FJFihMULAjQzEZFEQxGEQ2GgEXNhoCF0UDNhoDF0UEIkUCRQZLBUsCDEEAEUlLBklOAghFAksDCEUGQv/nSRYoTFCwI0MxGUD+1TEYFEQjQw==", + "approval": "CiACAAEmAQQVH3x1gABHBTEbQQFNggQE+GVPcwQof0wCBEvXd4wEM2deBjYaAI4EAO0AqgBmAAIiQzEZFEQxGEQ2GgEXSUUFNhoCF0UDNhoDF0UEIkUCRQZLBUsCDEEAK0sDRQVLBEsCDEEAJ0sFSUsGSU4DCEsDCEUDC0sCDUAACksESwMIRQVC/9lJFihMULAjQ0sFSwMIRQZC/7sxGRREMRhENhoBFzYaAhdFAzYaAxdFBCJFAkUGSwVLAgxBABhLBYEFGEEABklLBghFAUsFSwMIRQZC/+BJFihMULAjQzEZFEQxGEQ2GgEXNhoCF0UDNhoDF0UEIkUCRQZLBUsCDEEAF0lLBghJRQKBCg1AAApLBUsDCEUGQv/hSRYoTFCwI0MxGRREMRhENhoBFzYaAhdFAzYaAxdFBCJFAkUGSwVLAgxBABFJSwZJTgIIRQJLAwhFBkL/50kWKExQsCNDMRlA/tExGBREI0M=", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir index 81d570a21..4e49d3d8c 100644 --- a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir +++ b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir @@ -109,19 +109,15 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop(start: let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@3) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let total#2: uint64 = (+ total#1 i#1) - goto block@3 - block@3: // L7 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@4: // after_while_L7 - goto block@5 - block@5: // L7 + block@3: // after_while_L7 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -130,26 +126,24 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(s let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L15 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@5) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@6 + goto tmp%0#0 ? block@2 : block@5 block@2: // while_body_L15 let total#2: uint64 = (+ total#1 i#1) let tmp%1#0: bool = (> total#2 10u) goto tmp%1#0 ? block@3 : block@4 block@3: // if_body_L17 - goto block@7 + goto block@6 block@4: // after_if_else_L17 - goto block@5 - block@5: // L15 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@6: // after_while_L15 - goto block@7 - block@7: // L15 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@6) - return total#4 + block@5: // after_while_L15 + goto block@6 + block@6: // L15 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@5) + return total#3 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continue(start: uint64, stop: uint64, step: uint64) -> uint64: block@0: // L24 @@ -175,8 +169,6 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continu let i#3: uint64 = (+ i#1 step#0) goto block@1 block@6: // after_while_L26 - goto block@7 - block@7: // L26 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelled(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -185,42 +177,37 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelle let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L34 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@10) - let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@10) + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@7) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@11 + goto tmp%0#0 ? block@2 : block@8 block@2: // while_body_L34 let j#0: uint64 = start#0 goto block@3 block@3: // while_top_L35 - let j#1: uint64 = φ(j#0 <- block@2, j#3 <- block@7) - let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@7) + let j#1: uint64 = φ(j#0 <- block@2, j#2 <- block@6) + let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@6) let tmp%1#0: bool = (< j#1 stop#0) - goto tmp%1#0 ? block@4 : block@8 + goto tmp%1#0 ? block@4 : block@7 block@4: // while_body_L35 - let tmp%2#0: uint64 = (+ j#1 j#1) + let tmp%2#0: uint64 = (+ i#1 j#1) let total#2: uint64 = (+ total#1 tmp%2#0) - let tmp%3#0: bool = (== j#1 start#0) - goto tmp%3#0 ? block@5 : block@6 + let tmp%3#0: uint64 = (* i#1 j#1) + let tmp%4#0: bool = (> tmp%3#0 stop#0) + goto tmp%4#0 ? block@5 : block@6 block@5: // if_body_L38 - goto block@12 + goto block@9 block@6: // after_if_else_L38 - goto block@7 - block@7: // L35 - let j#3: uint64 = (+ j#1 step#0) + let j#2: uint64 = (+ j#1 step#0) goto block@3 - block@8: // after_while_L35 - goto block@9 - block@9: // L35 - goto block@10 - block@10: // L34 + block@7: // after_while_L35 let i#3: uint64 = (+ i#1 step#0) goto block@1 - block@11: // after_while_L34 - goto block@12 - block@12: // L34 - let total#6: uint64 = φ(total#2 <- block@5, total#3 <- block@11) - return total#6 + block@8: // after_while_L34 + goto block@9 + block@9: // L34 + let total#4: uint64 = φ(total#2 <- block@5, total#3 <- block@8) + return total#4 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__algots__.defaultCreate() -> void: block@0: // L4 diff --git a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir index 6ad22ee61..a417496b4 100644 --- a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir +++ b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir @@ -17,19 +17,19 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let stop#3: uint64 = (btoi reinterpret_bytes[8]%1#0) let reinterpret_bytes[8]%2#0: bytes[8] = (txna ApplicationArgs 3) let step#3: uint64 = (btoi reinterpret_bytes[8]%2#0) - let total#16: uint64 = 0u + let total#13: uint64 = 0u goto block@45 block@45: // while_top_L7 - let i#13: uint64 = φ(start#3 <- block@3, i#15 <- block@46) - let total#17: uint64 = φ(total#16 <- block@3, total#18 <- block@46) - let tmp%0#5: bool = (< i#13 stop#3) + let i#12: uint64 = φ(start#3 <- block@3, i#13 <- block@46) + let total#14: uint64 = φ(total#13 <- block@3, total#15 <- block@46) + let tmp%0#5: bool = (< i#12 stop#3) goto tmp%0#5 ? block@46 : block@47 block@46: // while_body_L7 - let total#18: uint64 = (+ total#17 i#13) - let i#15: uint64 = (+ i#13 step#3) + let total#15: uint64 = (+ total#14 i#12) + let i#13: uint64 = (+ i#12 step#3) goto block@45 block@47: // after_while_L7 - let val_as_bytes%0#0: bytes[8] = (itob total#17) + let val_as_bytes%0#0: bytes[8] = (itob total#14) let tmp%10#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) (log tmp%10#0) let tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__puya_arc4_router__%0#0: bool = 1u @@ -46,27 +46,27 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let stop#2: uint64 = (btoi reinterpret_bytes[8]%4#0) let reinterpret_bytes[8]%5#0: bytes[8] = (txna ApplicationArgs 3) let step#2: uint64 = (btoi reinterpret_bytes[8]%5#0) - let total#11: uint64 = 0u + let total#9: uint64 = 0u goto block@37 block@37: // while_top_L15 - let i#9: uint64 = φ(start#2 <- block@4, i#11 <- block@40) - let total#12: uint64 = φ(total#11 <- block@4, total#13 <- block@40) + let i#9: uint64 = φ(start#2 <- block@4, i#10 <- block@40) + let total#10: uint64 = φ(total#9 <- block@4, total#11 <- block@40) let tmp%0#4: bool = (< i#9 stop#2) goto tmp%0#4 ? block@38 : block@41 block@38: // while_body_L15 - let total#13: uint64 = (+ total#12 i#9) - let tmp%1#3: bool = (> total#13 10u) + let total#11: uint64 = (+ total#10 i#9) + let tmp%1#3: bool = (> total#11 10u) goto tmp%1#3 ? block@39 : block@40 block@39: // if_body_L17 goto block@42 block@40: // after_if_else_L17 - let i#11: uint64 = (+ i#9 step#2) + let i#10: uint64 = (+ i#9 step#2) goto block@37 block@41: // after_while_L15 goto block@42 block@42: // L15 - let total#15: uint64 = φ(total#13 <- block@39, total#12 <- block@41) - let val_as_bytes%1#0: bytes[8] = (itob total#15) + let total#12: uint64 = φ(total#11 <- block@39, total#10 <- block@41) + let val_as_bytes%1#0: bytes[8] = (itob total#12) let tmp%18#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) (log tmp%18#0) let tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__puya_arc4_router__%0#1: bool = 1u @@ -83,11 +83,11 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let stop#1: uint64 = (btoi reinterpret_bytes[8]%7#0) let reinterpret_bytes[8]%8#0: bytes[8] = (txna ApplicationArgs 3) let step#1: uint64 = (btoi reinterpret_bytes[8]%8#0) - let total#7: uint64 = 0u + let total#5: uint64 = 0u goto block@29 block@29: // while_top_L26 let i#5: uint64 = φ(start#1 <- block@5, i#7 <- block@33) - let total#8: uint64 = φ(total#7 <- block@5, total#10 <- block@33) + let total#6: uint64 = φ(total#5 <- block@5, total#8 <- block@33) let tmp%0#3: bool = (< i#5 stop#1) goto tmp%0#3 ? block@30 : block@34 block@30: // while_body_L26 @@ -96,14 +96,14 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@31: // if_body_L27 goto block@33 block@32: // after_if_else_L27 - let total#9: uint64 = (+ total#8 i#5) + let total#7: uint64 = (+ total#6 i#5) goto block@33 block@33: // L26 - let total#10: uint64 = φ(total#8 <- block@31, total#9 <- block@32) + let total#8: uint64 = φ(total#6 <- block@31, total#7 <- block@32) let i#7: uint64 = (+ i#5 step#1) goto block@29 block@34: // after_while_L26 - let val_as_bytes%2#0: bytes[8] = (itob total#8) + let val_as_bytes%2#0: bytes[8] = (itob total#6) let tmp%26#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) (log tmp%26#0) let tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__puya_arc4_router__%0#2: bool = 1u @@ -130,19 +130,20 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@19: // while_body_L34 goto block@20 block@20: // while_top_L35 - let j#1: uint64 = φ(start#0 <- block@19, j#3 <- block@23) + let j#1: uint64 = φ(start#0 <- block@19, j#2 <- block@23) let total#1: uint64 = φ(total#3 <- block@19, total#2 <- block@23) let tmp%1#1: bool = (< j#1 stop#0) goto tmp%1#1 ? block@21 : block@24 block@21: // while_body_L35 - let tmp%2#1: uint64 = (+ j#1 j#1) + let tmp%2#1: uint64 = (+ i#1 j#1) let total#2: uint64 = (+ total#1 tmp%2#1) - let tmp%3#1: bool = (== j#1 start#0) - goto tmp%3#1 ? block@22 : block@23 + let tmp%3#1: uint64 = (* i#1 j#1) + let tmp%4#1: bool = (> tmp%3#1 stop#0) + goto tmp%4#1 ? block@22 : block@23 block@22: // if_body_L38 goto block@26 block@23: // after_if_else_L38 - let j#3: uint64 = (+ j#1 step#0) + let j#2: uint64 = (+ j#1 step#0) goto block@20 block@24: // after_while_L35 let i#3: uint64 = (+ i#1 step#0) @@ -150,8 +151,8 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@25: // after_while_L34 goto block@26 block@26: // L34 - let total#6: uint64 = φ(total#2 <- block@22, total#3 <- block@25) - let val_as_bytes%3#0: bytes[8] = (itob total#6) + let total#4: uint64 = φ(total#2 <- block@22, total#3 <- block@25) + let val_as_bytes%3#0: bytes[8] = (itob total#4) let tmp%34#0: bytes = (concat 0x151f7c75 val_as_bytes%3#0) (log tmp%34#0) let tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__puya_arc4_router__%0#3: bool = 1u diff --git a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir index 6ad22ee61..a417496b4 100644 --- a/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir +++ b/tests/approvals/out/o2/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir @@ -17,19 +17,19 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let stop#3: uint64 = (btoi reinterpret_bytes[8]%1#0) let reinterpret_bytes[8]%2#0: bytes[8] = (txna ApplicationArgs 3) let step#3: uint64 = (btoi reinterpret_bytes[8]%2#0) - let total#16: uint64 = 0u + let total#13: uint64 = 0u goto block@45 block@45: // while_top_L7 - let i#13: uint64 = φ(start#3 <- block@3, i#15 <- block@46) - let total#17: uint64 = φ(total#16 <- block@3, total#18 <- block@46) - let tmp%0#5: bool = (< i#13 stop#3) + let i#12: uint64 = φ(start#3 <- block@3, i#13 <- block@46) + let total#14: uint64 = φ(total#13 <- block@3, total#15 <- block@46) + let tmp%0#5: bool = (< i#12 stop#3) goto tmp%0#5 ? block@46 : block@47 block@46: // while_body_L7 - let total#18: uint64 = (+ total#17 i#13) - let i#15: uint64 = (+ i#13 step#3) + let total#15: uint64 = (+ total#14 i#12) + let i#13: uint64 = (+ i#12 step#3) goto block@45 block@47: // after_while_L7 - let val_as_bytes%0#0: bytes[8] = (itob total#17) + let val_as_bytes%0#0: bytes[8] = (itob total#14) let tmp%10#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) (log tmp%10#0) let tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__puya_arc4_router__%0#0: bool = 1u @@ -46,27 +46,27 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let stop#2: uint64 = (btoi reinterpret_bytes[8]%4#0) let reinterpret_bytes[8]%5#0: bytes[8] = (txna ApplicationArgs 3) let step#2: uint64 = (btoi reinterpret_bytes[8]%5#0) - let total#11: uint64 = 0u + let total#9: uint64 = 0u goto block@37 block@37: // while_top_L15 - let i#9: uint64 = φ(start#2 <- block@4, i#11 <- block@40) - let total#12: uint64 = φ(total#11 <- block@4, total#13 <- block@40) + let i#9: uint64 = φ(start#2 <- block@4, i#10 <- block@40) + let total#10: uint64 = φ(total#9 <- block@4, total#11 <- block@40) let tmp%0#4: bool = (< i#9 stop#2) goto tmp%0#4 ? block@38 : block@41 block@38: // while_body_L15 - let total#13: uint64 = (+ total#12 i#9) - let tmp%1#3: bool = (> total#13 10u) + let total#11: uint64 = (+ total#10 i#9) + let tmp%1#3: bool = (> total#11 10u) goto tmp%1#3 ? block@39 : block@40 block@39: // if_body_L17 goto block@42 block@40: // after_if_else_L17 - let i#11: uint64 = (+ i#9 step#2) + let i#10: uint64 = (+ i#9 step#2) goto block@37 block@41: // after_while_L15 goto block@42 block@42: // L15 - let total#15: uint64 = φ(total#13 <- block@39, total#12 <- block@41) - let val_as_bytes%1#0: bytes[8] = (itob total#15) + let total#12: uint64 = φ(total#11 <- block@39, total#10 <- block@41) + let val_as_bytes%1#0: bytes[8] = (itob total#12) let tmp%18#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) (log tmp%18#0) let tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__puya_arc4_router__%0#1: bool = 1u @@ -83,11 +83,11 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let stop#1: uint64 = (btoi reinterpret_bytes[8]%7#0) let reinterpret_bytes[8]%8#0: bytes[8] = (txna ApplicationArgs 3) let step#1: uint64 = (btoi reinterpret_bytes[8]%8#0) - let total#7: uint64 = 0u + let total#5: uint64 = 0u goto block@29 block@29: // while_top_L26 let i#5: uint64 = φ(start#1 <- block@5, i#7 <- block@33) - let total#8: uint64 = φ(total#7 <- block@5, total#10 <- block@33) + let total#6: uint64 = φ(total#5 <- block@5, total#8 <- block@33) let tmp%0#3: bool = (< i#5 stop#1) goto tmp%0#3 ? block@30 : block@34 block@30: // while_body_L26 @@ -96,14 +96,14 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@31: // if_body_L27 goto block@33 block@32: // after_if_else_L27 - let total#9: uint64 = (+ total#8 i#5) + let total#7: uint64 = (+ total#6 i#5) goto block@33 block@33: // L26 - let total#10: uint64 = φ(total#8 <- block@31, total#9 <- block@32) + let total#8: uint64 = φ(total#6 <- block@31, total#7 <- block@32) let i#7: uint64 = (+ i#5 step#1) goto block@29 block@34: // after_while_L26 - let val_as_bytes%2#0: bytes[8] = (itob total#8) + let val_as_bytes%2#0: bytes[8] = (itob total#6) let tmp%26#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) (log tmp%26#0) let tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__puya_arc4_router__%0#2: bool = 1u @@ -130,19 +130,20 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@19: // while_body_L34 goto block@20 block@20: // while_top_L35 - let j#1: uint64 = φ(start#0 <- block@19, j#3 <- block@23) + let j#1: uint64 = φ(start#0 <- block@19, j#2 <- block@23) let total#1: uint64 = φ(total#3 <- block@19, total#2 <- block@23) let tmp%1#1: bool = (< j#1 stop#0) goto tmp%1#1 ? block@21 : block@24 block@21: // while_body_L35 - let tmp%2#1: uint64 = (+ j#1 j#1) + let tmp%2#1: uint64 = (+ i#1 j#1) let total#2: uint64 = (+ total#1 tmp%2#1) - let tmp%3#1: bool = (== j#1 start#0) - goto tmp%3#1 ? block@22 : block@23 + let tmp%3#1: uint64 = (* i#1 j#1) + let tmp%4#1: bool = (> tmp%3#1 stop#0) + goto tmp%4#1 ? block@22 : block@23 block@22: // if_body_L38 goto block@26 block@23: // after_if_else_L38 - let j#3: uint64 = (+ j#1 step#0) + let j#2: uint64 = (+ j#1 step#0) goto block@20 block@24: // after_while_L35 let i#3: uint64 = (+ i#1 step#0) @@ -150,8 +151,8 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@25: // after_while_L34 goto block@26 block@26: // L34 - let total#6: uint64 = φ(total#2 <- block@22, total#3 <- block@25) - let val_as_bytes%3#0: bytes[8] = (itob total#6) + let total#4: uint64 = φ(total#2 <- block@22, total#3 <- block@25) + let val_as_bytes%3#0: bytes[8] = (itob total#4) let tmp%34#0: bytes = (concat 0x151f7c75 val_as_bytes%3#0) (log tmp%34#0) let tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__puya_arc4_router__%0#3: bool = 1u diff --git a/tests/approvals/out/o2/for-loops/for-loops.awst b/tests/approvals/out/o2/for-loops/for-loops.awst index bc7bac843..615b14884 100644 --- a/tests/approvals/out/o2/for-loops/for-loops.awst +++ b/tests/approvals/out/o2/for-loops/for-loops.awst @@ -16,10 +16,8 @@ contract ForLoopsAlgo i: uint64 = start while (i < stop) { total: uint64 = total + i - #loop₁ᶜ: i: uint64 = i + step } - #loop₁ᵇ: return total } @@ -32,7 +30,6 @@ contract ForLoopsAlgo if (total > 10) { goto #loop₁ᵇ } - #loop₁ᶜ: i: uint64 = i + step } #loop₁ᵇ: @@ -51,7 +48,6 @@ contract ForLoopsAlgo #loop₁ᶜ: i: uint64 = i + step } - #loop₁ᵇ: return total } @@ -62,15 +58,12 @@ contract ForLoopsAlgo while (i < stop) { j: uint64 = start while (j < stop) { - total: uint64 = total + j + j - if (j == start) { + total: uint64 = total + i + j + if (i * j > stop) { goto outer₁ᵇ } - #loop₁ᶜ: j: uint64 = j + step } - #loop₁ᵇ: - outer₁ᶜ: i: uint64 = i + step } outer₁ᵇ: diff --git a/tests/approvals/out/o2/for-loops/for-loops.awst.json b/tests/approvals/out/o2/for-loops/for-loops.awst.json index b6894a1d1..ad319f754 100644 --- a/tests/approvals/out/o2/for-loops/for-loops.awst.json +++ b/tests/approvals/out/o2/for-loops/for-loops.awst.json @@ -507,19 +507,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { @@ -607,19 +594,6 @@ "comment": null } }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null - }, { "_type": "ReturnStatement", "source_location": { @@ -1128,19 +1102,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 15, - "end_line": 15, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { @@ -1872,19 +1833,6 @@ "comment": null } }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 26, - "end_line": 26, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null - }, { "_type": "ReturnStatement", "source_location": { @@ -2425,7 +2373,7 @@ "ephemeral": false, "scalar_type": 2 }, - "name": "j" + "name": "i" }, "op": "+", "right": { @@ -2456,7 +2404,7 @@ "line": 38, "end_line": 38, "column": 8, - "end_column": 24 + "end_column": 25 }, "condition": { "_type": "NumericComparisonExpression", @@ -2465,7 +2413,7 @@ "line": 38, "end_line": 38, "column": 12, - "end_column": 23 + "end_column": 24 }, "wtype": { "_type": "WType", @@ -2475,13 +2423,13 @@ "scalar_type": 2 }, "lhs": { - "_type": "VarExpression", + "_type": "UInt64BinaryOperation", "source_location": { "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, "column": 12, - "end_column": 13 + "end_column": 17 }, "wtype": { "_type": "WType", @@ -2490,17 +2438,53 @@ "ephemeral": false, "scalar_type": 2 }, - "name": "j" + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/for-loops.algo.ts", + "line": 38, + "end_line": 38, + "column": 12, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "*", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/for-loops.algo.ts", + "line": 38, + "end_line": 38, + "column": 16, + "end_column": 17 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "j" + } }, - "operator": "==", + "operator": ">", "rhs": { "_type": "VarExpression", "source_location": { "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, - "column": 18, - "end_column": 23 + "column": 20, + "end_column": 24 }, "wtype": { "_type": "WType", @@ -2509,7 +2493,7 @@ "ephemeral": false, "scalar_type": 2 }, - "name": "start" + "name": "stop" } }, "if_branch": { @@ -2518,8 +2502,8 @@ "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, - "column": 25, - "end_column": 36 + "column": 26, + "end_column": 37 }, "body": [ { @@ -2528,8 +2512,8 @@ "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, - "column": 25, - "end_column": 36 + "column": 26, + "end_column": 37 }, "target": "outer₁ᵇ" } @@ -2543,19 +2527,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 35, - "end_line": 35, - "column": 6, - "end_column": 46 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { @@ -2642,37 +2613,11 @@ "label": null, "comment": null } - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 35, - "end_line": 35, - "column": 6, - "end_column": 46 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null } ], "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 34, - "end_line": 34, - "column": 11, - "end_column": 51 - }, - "body": [], - "label": "outer₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { diff --git a/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir b/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir index 7c65aacf1..0a670fd69 100644 --- a/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir +++ b/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir @@ -115,31 +115,29 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item#0: uint64 = items.0#0 goto block@1 block@1: // for_body_L10 - let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@6, loop_counter%0#3 <- block@7) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6, total#2 <- block@7) - let item#1: uint64 = φ(item#0 <- block@0, item#2 <- block@6, item#3 <- block@7) + let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@5, loop_counter%0#3 <- block@6) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5, total#2 <- block@6) + let item#1: uint64 = φ(item#0 <- block@0, item#2 <- block@5, item#3 <- block@6) let total#2: uint64 = (+ total#1 item#1) let tmp%0#0: bool = (== item#1 42u) goto tmp%0#0 ? block@2 : block@3 block@2: // if_body_L12 - goto block@9 + goto block@8 block@3: // after_if_else_L12 goto block@4 - block@4: // L10 - goto block@5 - block@5: // for_footer_L10 - goto_nth [block@6, block@7][loop_counter%0#1] else goto block@8 - block@6: // for_header_1_L10 + block@4: // for_footer_L10 + goto_nth [block@5, block@6][loop_counter%0#1] else goto block@7 + block@5: // for_header_1_L10 let loop_counter%0#2: uint64 = 1u let item#2: uint64 = items.1#0 goto block@1 - block@7: // for_header_2_L10 + block@6: // for_header_2_L10 let loop_counter%0#3: uint64 = 2u let item#3: uint64 = items.2#0 goto block@1 - block@8: // after_for_L10 - goto block@9 - block@9: // L10 + block@7: // after_for_L10 + goto block@8 + block@8: // L10 return total#2 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_dynamic_array(items: bytes) -> uint64: @@ -150,10 +148,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L19 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L19 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -164,19 +162,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%1#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L21 - goto block@8 + goto block@7 block@4: // after_if_else_L21 goto block@5 - block@5: // L19 - goto block@6 - block@6: // for_footer_L19 + block@5: // for_footer_L19 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L19 - goto block@8 - block@8: // L19 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L19 + goto block@7 + block@7: // L19 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_static_array(items: bytes[40]) -> uint64: block@0: // L26 @@ -186,10 +182,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L28 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L28 let array_head_and_tail%0#0: bytes[40] = items#0 let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -200,19 +196,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%1#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L30 - goto block@8 + goto block@7 block@4: // after_if_else_L30 goto block@5 - block@5: // L28 - goto block@6 - block@6: // for_footer_L28 + block@5: // for_footer_L28 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L28 - goto block@8 - block@8: // L28 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L28 + goto block@7 + block@7: // L28 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_immutable_array(items: uint64[]) -> uint64: block@0: // L35 @@ -222,10 +216,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L37 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L37 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -235,19 +229,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L39 - goto block@8 + goto block@7 block@4: // after_if_else_L39 goto block@5 - block@5: // L37 - goto block@6 - block@6: // for_footer_L37 + block@5: // for_footer_L37 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L37 - goto block@8 - block@8: // L37 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L37 + goto block@7 + block@7: // L37 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_mutable_array(items.0: uint64, items.1: uint64, items.2: uint64) -> uint64: block@0: // L44 @@ -262,10 +254,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L47 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L47 let slot_contents%1#0: uint64[] = read(mutable#0) let item#0: uint64 = slot_contents%1#0[item_index_internal%0#1] @@ -273,19 +265,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L49 - goto block@8 + goto block@7 block@4: // after_if_else_L49 goto block@5 - block@5: // L47 - goto block@6 - block@6: // for_footer_L47 + block@5: // for_footer_L47 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L47 - goto block@8 - block@8: // L47 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L47 + goto block@7 + block@7: // L47 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__algots__.defaultCreate() -> void: block@0: // L7 diff --git a/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir b/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir index 9e8549ac3..6392ad67b 100644 --- a/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir +++ b/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir @@ -15,14 +15,14 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let items.0#1: uint64 = (extract_uint64 reinterpret_bytes[24]%0#0 0u) let items.1#1: uint64 = (extract_uint64 reinterpret_bytes[24]%0#0 8u) let items.2#1: uint64 = (extract_uint64 reinterpret_bytes[24]%0#0 16u) - let total#20: uint64 = 0u + let total#16: uint64 = 0u let loop_counter%0#0: uint64 = 0u goto block@51 block@51: // for_body_L10 let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@3, loop_counter%0#2 <- block@53, loop_counter%0#3 <- block@54) - let total#21: uint64 = φ(total#20 <- block@3, total#22 <- block@53, total#22 <- block@54) + let total#17: uint64 = φ(total#16 <- block@3, total#18 <- block@53, total#18 <- block@54) let item#5: uint64 = φ(items.0#1 <- block@3, items.1#1 <- block@53, items.2#1 <- block@54) - let total#22: uint64 = (+ total#21 item#5) + let total#18: uint64 = (+ total#17 item#5) let tmp%0#6: bool = (== item#5 42u) goto tmp%0#6 ? block@55 : block@52 block@52: // after_if_else_L12 @@ -34,7 +34,7 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let loop_counter%0#3: uint64 = 2u goto block@51 block@55: // L10 - let val_as_bytes%0#0: bytes[8] = (itob total#22) + let val_as_bytes%0#0: bytes[8] = (itob total#18) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) (log tmp%7#0) let tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__puya_arc4_router__%0#0: bool = 1u @@ -46,20 +46,20 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let tmp%10#0: uint64 = (txn ApplicationID) (assert tmp%10#0) // can only call when not creating let items#2: bytes = (txna ApplicationArgs 1) - let total#15: uint64 = 0u + let total#12: uint64 = 0u let array_length%0#2: uint64 = (extract_uint16 items#2 0u) let item_index_internal%0#9: uint64 = 0u goto block@43 block@43: // for_header_L19 let item_index_internal%0#10: uint64 = φ(item_index_internal%0#9 <- block@4, item_index_internal%0#11 <- block@46) - let total#16: uint64 = φ(total#15 <- block@4, total#17 <- block@46) + let total#13: uint64 = φ(total#12 <- block@4, total#14 <- block@46) let continue_looping%0#3: bool = (< item_index_internal%0#10 array_length%0#2) goto continue_looping%0#3 ? block@44 : block@47 block@44: // for_body_L19 let array_head_and_tail%0#1: bytes = ((extract 2 0) items#2) let item_offset%0#2: uint64 = (* item_index_internal%0#10 8u) let tmp%0#5: uint64 = (extract_uint64 array_head_and_tail%0#1 item_offset%0#2) - let total#17: uint64 = (+ total#16 tmp%0#5) + let total#14: uint64 = (+ total#13 tmp%0#5) let tmp%2#2: bool = (== tmp%0#5 42u) goto tmp%2#2 ? block@45 : block@46 block@45: // if_body_L21 @@ -70,8 +70,8 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@47: // after_for_L19 goto block@48 block@48: // L19 - let total#19: uint64 = φ(total#17 <- block@45, total#16 <- block@47) - let val_as_bytes%1#0: bytes[8] = (itob total#19) + let total#15: uint64 = φ(total#14 <- block@45, total#13 <- block@47) + let val_as_bytes%1#0: bytes[8] = (itob total#15) let tmp%13#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) (log tmp%13#0) let tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__puya_arc4_router__%0#1: bool = 1u @@ -83,18 +83,18 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let tmp%16#0: uint64 = (txn ApplicationID) (assert tmp%16#0) // can only call when not creating let items#1: bytes[40] = (txna ApplicationArgs 1) - let total#10: uint64 = 0u + let total#8: uint64 = 0u let item_index_internal%0#6: uint64 = 0u goto block@35 block@35: // for_header_L28 let item_index_internal%0#7: uint64 = φ(item_index_internal%0#6 <- block@5, item_index_internal%0#8 <- block@38) - let total#11: uint64 = φ(total#10 <- block@5, total#12 <- block@38) + let total#9: uint64 = φ(total#8 <- block@5, total#10 <- block@38) let continue_looping%0#2: bool = (< item_index_internal%0#7 5u) goto continue_looping%0#2 ? block@36 : block@39 block@36: // for_body_L28 let item_offset%0#1: uint64 = (* item_index_internal%0#7 8u) let tmp%0#4: uint64 = (extract_uint64 items#1 item_offset%0#1) - let total#12: uint64 = (+ total#11 tmp%0#4) + let total#10: uint64 = (+ total#9 tmp%0#4) let tmp%2#1: bool = (== tmp%0#4 42u) goto tmp%2#1 ? block@37 : block@38 block@37: // if_body_L30 @@ -105,8 +105,8 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@39: // after_for_L28 goto block@40 block@40: // L28 - let total#14: uint64 = φ(total#12 <- block@37, total#11 <- block@39) - let val_as_bytes%2#0: bytes[8] = (itob total#14) + let total#11: uint64 = φ(total#10 <- block@37, total#9 <- block@39) + let val_as_bytes%2#0: bytes[8] = (itob total#11) let tmp%18#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) (log tmp%18#0) let tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__puya_arc4_router__%0#2: bool = 1u @@ -118,20 +118,20 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let tmp%21#0: uint64 = (txn ApplicationID) (assert tmp%21#0) // can only call when not creating let items#0: uint64[] = (txna ApplicationArgs 1) - let total#5: uint64 = 0u + let total#4: uint64 = 0u let array_length%0#1: uint64 = (extract_uint16 items#0 0u) let item_index_internal%0#3: uint64 = 0u goto block@27 block@27: // for_header_L37 let item_index_internal%0#4: uint64 = φ(item_index_internal%0#3 <- block@6, item_index_internal%0#5 <- block@30) - let total#6: uint64 = φ(total#5 <- block@6, total#7 <- block@30) + let total#5: uint64 = φ(total#4 <- block@6, total#6 <- block@30) let continue_looping%0#1: bool = (< item_index_internal%0#4 array_length%0#1) goto continue_looping%0#1 ? block@28 : block@31 block@28: // for_body_L37 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#4 8u) let item#1: uint64 = (extract_uint64 array_head_and_tail%0#0 item_offset%0#0) - let total#7: uint64 = (+ total#6 item#1) + let total#6: uint64 = (+ total#5 item#1) let tmp%0#3: bool = (== item#1 42u) goto tmp%0#3 ? block@29 : block@30 block@29: // if_body_L39 @@ -142,8 +142,8 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@31: // after_for_L37 goto block@32 block@32: // L37 - let total#9: uint64 = φ(total#7 <- block@29, total#6 <- block@31) - let val_as_bytes%3#0: bytes[8] = (itob total#9) + let total#7: uint64 = φ(total#6 <- block@29, total#5 <- block@31) + let val_as_bytes%3#0: bytes[8] = (itob total#7) let tmp%23#0: bytes = (concat 0x151f7c75 val_as_bytes%3#0) (log tmp%23#0) let tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__puya_arc4_router__%0#3: bool = 1u @@ -199,8 +199,8 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@23: // after_for_L47 goto block@24 block@24: // L47 - let total#4: uint64 = φ(total#2 <- block@21, total#1 <- block@23) - let val_as_bytes%4#0: bytes[8] = (itob total#4) + let total#3: uint64 = φ(total#2 <- block@21, total#1 <- block@23) + let val_as_bytes%4#0: bytes[8] = (itob total#3) let tmp%28#0: bytes = (concat 0x151f7c75 val_as_bytes%4#0) (log tmp%28#0) let tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__puya_arc4_router__%0#4: bool = 1u diff --git a/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir index ca1d24ee3..3f483c4ec 100644 --- a/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir +++ b/tests/approvals/out/o2/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir @@ -15,14 +15,14 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let items.0#1: uint64 = (extract_uint64 reinterpret_bytes[24]%0#0 0u) let items.1#1: uint64 = (extract_uint64 reinterpret_bytes[24]%0#0 8u) let items.2#1: uint64 = (extract_uint64 reinterpret_bytes[24]%0#0 16u) - let total#20: uint64 = 0u + let total#16: uint64 = 0u let loop_counter%0#0: uint64 = 0u goto block@51 block@51: // for_body_L10 let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@3, loop_counter%0#2 <- block@53, loop_counter%0#3 <- block@54) - let total#21: uint64 = φ(total#20 <- block@3, total#22 <- block@53, total#22 <- block@54) + let total#17: uint64 = φ(total#16 <- block@3, total#18 <- block@53, total#18 <- block@54) let item#5: uint64 = φ(items.0#1 <- block@3, items.1#1 <- block@53, items.2#1 <- block@54) - let total#22: uint64 = (+ total#21 item#5) + let total#18: uint64 = (+ total#17 item#5) let tmp%0#6: bool = (== item#5 42u) goto tmp%0#6 ? block@55 : block@52 block@52: // after_if_else_L12 @@ -34,7 +34,7 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let loop_counter%0#3: uint64 = 2u goto block@51 block@55: // L10 - let val_as_bytes%0#0: bytes[8] = (itob total#22) + let val_as_bytes%0#0: bytes[8] = (itob total#18) let tmp%7#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) (log tmp%7#0) let tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__puya_arc4_router__%0#0: bool = 1u @@ -46,20 +46,20 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let tmp%10#0: uint64 = (txn ApplicationID) (assert tmp%10#0) // can only call when not creating let items#2: bytes = (txna ApplicationArgs 1) - let total#15: uint64 = 0u + let total#12: uint64 = 0u let array_length%0#2: uint64 = (extract_uint16 items#2 0u) let item_index_internal%0#9: uint64 = 0u goto block@43 block@43: // for_header_L19 let item_index_internal%0#10: uint64 = φ(item_index_internal%0#9 <- block@4, item_index_internal%0#11 <- block@46) - let total#16: uint64 = φ(total#15 <- block@4, total#17 <- block@46) + let total#13: uint64 = φ(total#12 <- block@4, total#14 <- block@46) let continue_looping%0#3: bool = (< item_index_internal%0#10 array_length%0#2) goto continue_looping%0#3 ? block@44 : block@47 block@44: // for_body_L19 let array_head_and_tail%0#1: bytes = ((extract 2 0) items#2) let item_offset%0#2: uint64 = (* item_index_internal%0#10 8u) let tmp%0#5: uint64 = (extract_uint64 array_head_and_tail%0#1 item_offset%0#2) - let total#17: uint64 = (+ total#16 tmp%0#5) + let total#14: uint64 = (+ total#13 tmp%0#5) let tmp%2#2: bool = (== tmp%0#5 42u) goto tmp%2#2 ? block@45 : block@46 block@45: // if_body_L21 @@ -70,8 +70,8 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@47: // after_for_L19 goto block@48 block@48: // L19 - let total#19: uint64 = φ(total#17 <- block@45, total#16 <- block@47) - let val_as_bytes%1#0: bytes[8] = (itob total#19) + let total#15: uint64 = φ(total#14 <- block@45, total#13 <- block@47) + let val_as_bytes%1#0: bytes[8] = (itob total#15) let tmp%13#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) (log tmp%13#0) let tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__puya_arc4_router__%0#1: bool = 1u @@ -83,18 +83,18 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let tmp%16#0: uint64 = (txn ApplicationID) (assert tmp%16#0) // can only call when not creating let items#1: bytes[40] = (txna ApplicationArgs 1) - let total#10: uint64 = 0u + let total#8: uint64 = 0u let item_index_internal%0#6: uint64 = 0u goto block@35 block@35: // for_header_L28 let item_index_internal%0#7: uint64 = φ(item_index_internal%0#6 <- block@5, item_index_internal%0#8 <- block@38) - let total#11: uint64 = φ(total#10 <- block@5, total#12 <- block@38) + let total#9: uint64 = φ(total#8 <- block@5, total#10 <- block@38) let continue_looping%0#2: bool = (< item_index_internal%0#7 5u) goto continue_looping%0#2 ? block@36 : block@39 block@36: // for_body_L28 let item_offset%0#1: uint64 = (* item_index_internal%0#7 8u) let tmp%0#4: uint64 = (extract_uint64 items#1 item_offset%0#1) - let total#12: uint64 = (+ total#11 tmp%0#4) + let total#10: uint64 = (+ total#9 tmp%0#4) let tmp%2#1: bool = (== tmp%0#4 42u) goto tmp%2#1 ? block@37 : block@38 block@37: // if_body_L30 @@ -105,8 +105,8 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@39: // after_for_L28 goto block@40 block@40: // L28 - let total#14: uint64 = φ(total#12 <- block@37, total#11 <- block@39) - let val_as_bytes%2#0: bytes[8] = (itob total#14) + let total#11: uint64 = φ(total#10 <- block@37, total#9 <- block@39) + let val_as_bytes%2#0: bytes[8] = (itob total#11) let tmp%18#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) (log tmp%18#0) let tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__puya_arc4_router__%0#2: bool = 1u @@ -118,20 +118,20 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let tmp%21#0: uint64 = (txn ApplicationID) (assert tmp%21#0) // can only call when not creating let items#0: uint64[] = (txna ApplicationArgs 1) - let total#5: uint64 = 0u + let total#4: uint64 = 0u let array_length%0#1: uint64 = (extract_uint16 items#0 0u) let item_index_internal%0#3: uint64 = 0u goto block@27 block@27: // for_header_L37 let item_index_internal%0#4: uint64 = φ(item_index_internal%0#3 <- block@6, item_index_internal%0#5 <- block@30) - let total#6: uint64 = φ(total#5 <- block@6, total#7 <- block@30) + let total#5: uint64 = φ(total#4 <- block@6, total#6 <- block@30) let continue_looping%0#1: bool = (< item_index_internal%0#4 array_length%0#1) goto continue_looping%0#1 ? block@28 : block@31 block@28: // for_body_L37 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#4 8u) let item#1: uint64 = (extract_uint64 array_head_and_tail%0#0 item_offset%0#0) - let total#7: uint64 = (+ total#6 item#1) + let total#6: uint64 = (+ total#5 item#1) let tmp%0#3: bool = (== item#1 42u) goto tmp%0#3 ? block@29 : block@30 block@29: // if_body_L39 @@ -142,8 +142,8 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@31: // after_for_L37 goto block@32 block@32: // L37 - let total#9: uint64 = φ(total#7 <- block@29, total#6 <- block@31) - let val_as_bytes%3#0: bytes[8] = (itob total#9) + let total#7: uint64 = φ(total#6 <- block@29, total#5 <- block@31) + let val_as_bytes%3#0: bytes[8] = (itob total#7) let tmp%23#0: bytes = (concat 0x151f7c75 val_as_bytes%3#0) (log tmp%23#0) let tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__puya_arc4_router__%0#3: bool = 1u @@ -190,8 +190,8 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP block@23: // after_for_L47 goto block@24 block@24: // L47 - let total#4: uint64 = φ(total#2 <- block@21, total#1 <- block@23) - let val_as_bytes%4#0: bytes[8] = (itob total#4) + let total#3: uint64 = φ(total#2 <- block@21, total#1 <- block@23) + let val_as_bytes%4#0: bytes[8] = (itob total#3) let tmp%28#0: bytes = (concat 0x151f7c75 val_as_bytes%4#0) (log tmp%28#0) let tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__puya_arc4_router__%0#4: bool = 1u diff --git a/tests/approvals/out/o2/for-of-loops/for-of-loops.awst b/tests/approvals/out/o2/for-of-loops/for-of-loops.awst index 1f8cb3e92..62b88a2d1 100644 --- a/tests/approvals/out/o2/for-of-loops/for-of-loops.awst +++ b/tests/approvals/out/o2/for-of-loops/for-of-loops.awst @@ -18,7 +18,6 @@ contract ForOfLoopsAlgo if (item == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -32,7 +31,6 @@ contract ForOfLoopsAlgo if (ARC4_DECODE(item) == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -46,7 +44,6 @@ contract ForOfLoopsAlgo if (ARC4_DECODE(item) == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -60,7 +57,6 @@ contract ForOfLoopsAlgo if (item == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -75,7 +71,6 @@ contract ForOfLoopsAlgo if (item == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total diff --git a/tests/approvals/out/o2/for-of-loops/for-of-loops.awst.json b/tests/approvals/out/o2/for-of-loops/for-of-loops.awst.json index 5aba22a18..af7ff3ae2 100644 --- a/tests/approvals/out/o2/for-of-loops/for-of-loops.awst.json +++ b/tests/approvals/out/o2/for-of-loops/for-of-loops.awst.json @@ -553,19 +553,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 10, - "end_line": 10, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -1091,19 +1078,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 19, - "end_line": 19, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -1631,19 +1605,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 28, - "end_line": 28, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -2086,19 +2047,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 37, - "end_line": 37, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -2796,19 +2744,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 47, - "end_line": 47, - "column": 4, - "end_column": 31 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, diff --git a/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir b/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir index a1ac95fbd..3f8bf1fc6 100644 --- a/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir +++ b/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir @@ -82,21 +82,17 @@ subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length let i#0: uint64 = 0u goto block@1 block@1: // while_top_L8 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 length#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L8 let encoded%1#0: uint64[] = encode(i#1) let slot_contents%0#0: uint64[] = read(ma#0) let extended%0#0: uint64[] = slot_contents%0#0.concat(encoded%1#0) write(ma#0, extended%0#0) - goto block@3 - block@3: // L8 - let i#3: uint64 = (+ i#1 1u) + let i#2: uint64 = (+ i#1 1u) goto block@1 - block@4: // after_while_L8 - goto block@5 - block@5: // L8 + block@3: // after_while_L8 let slot_contents%1#0: uint64[] = read(ma#0) let tmp%1#0: uint64 = slot_contents%1#0.length let tmp%2#0: bool = (== tmp%1#0 length#0) diff --git a/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir b/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir index 49733dca4..4d7774575 100644 --- a/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir +++ b/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir @@ -34,7 +34,7 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let i#0: uint64 = 0u goto block@19 block@19: // while_top_L8 - let i#1: uint64 = φ(i#0 <- block@18, i#3 <- block@20) + let i#1: uint64 = φ(i#0 <- block@18, i#2 <- block@20) let tmp%0#2: bool = (< i#1 length#0) goto tmp%0#2 ? block@20 : block@21 block@20: // while_body_L8 @@ -46,7 +46,7 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let array%array_contents%0#1: bytes = (concat slot_contents%0#0 encoded%1#0) // on error: max array length exceeded let extended%0#0: uint64[] = array%array_contents%0#1 write(ma#0, extended%0#0) - let i#3: uint64 = (+ i#1 1u) + let i#2: uint64 = (+ i#1 1u) goto block@19 block@21: // after_while_L8 let slot_contents%1#0: uint64[] = read(ma#0) diff --git a/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir index 3f951438b..fe8af320e 100644 --- a/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir +++ b/tests/approvals/out/o2/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir @@ -32,7 +32,7 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let i#0: uint64 = 0u goto block@19 block@19: // while_top_L8 - let i#1: uint64 = φ(i#0 <- block@18, i#3 <- block@20) + let i#1: uint64 = φ(i#0 <- block@18, i#2 <- block@20) let tmp%0#2: bool = (< i#1 length#0) goto tmp%0#2 ? block@20 : block@21 block@20: // while_body_L8 @@ -40,7 +40,7 @@ main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalP let slot_contents%0#0: uint64[] = read(local.0) let array%array_contents%0#1: bytes = (concat slot_contents%0#0 array%sub_item%0#1) // on error: max array length exceeded write(local.0, array%array_contents%0#1) - let i#3: uint64 = (+ i#1 1u) + let i#2: uint64 = (+ i#1 1u) goto block@19 block@21: // after_while_L8 let slot_contents%1#0: uint64[] = read(local.0) diff --git a/tests/approvals/out/o2/mutable-arrays/mutable-arrays.awst b/tests/approvals/out/o2/mutable-arrays/mutable-arrays.awst index 634eaf6c7..4fe61999a 100644 --- a/tests/approvals/out/o2/mutable-arrays/mutable-arrays.awst +++ b/tests/approvals/out/o2/mutable-arrays/mutable-arrays.awst @@ -17,10 +17,8 @@ contract MutableArraysAlgo i: uint64 = 0 while (i < length) { ma.push(...[i] - #loop₁ᶜ: i++ } - #loop₁ᵇ: assert(ma.length == length) assert(Boolean(length), comment=has length) popped: uint64 = ma.pop() diff --git a/tests/approvals/out/o2/mutable-arrays/mutable-arrays.awst.json b/tests/approvals/out/o2/mutable-arrays/mutable-arrays.awst.json index e59246822..5d597e292 100644 --- a/tests/approvals/out/o2/mutable-arrays/mutable-arrays.awst.json +++ b/tests/approvals/out/o2/mutable-arrays/mutable-arrays.awst.json @@ -580,19 +580,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/mutable-arrays.algo.ts", - "line": 8, - "end_line": 8, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "ExpressionStatement", "source_location": { @@ -644,19 +631,6 @@ "comment": null } }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/mutable-arrays.algo.ts", - "line": 8, - "end_line": 8, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null - }, { "_type": "ExpressionStatement", "source_location": { diff --git a/tests/approvals/out/o2/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir b/tests/approvals/out/o2/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir index 5fb1dc0de..6c590eaee 100644 --- a/tests/approvals/out/o2/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir +++ b/tests/approvals/out/o2/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir @@ -50,17 +50,13 @@ subroutine tests/approvals/while-loops.algo.ts::DemoContract.testWhile(stop: uin let i#0: uint64 = 0u goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let i#2: uint64 = (+ i#1 1u) - goto block@3 - block@3: // L7 goto block@1 - block@4: // after_while_L7 - goto block@5 - block@5: // L7 + block@3: // after_while_L7 return i#1 subroutine tests/approvals/while-loops.algo.ts::DemoContract.__algots__.defaultCreate() -> void: diff --git a/tests/approvals/out/o2/while-loops/while-loops.awst b/tests/approvals/out/o2/while-loops/while-loops.awst index 79148559d..1cd04ef6a 100644 --- a/tests/approvals/out/o2/while-loops/while-loops.awst +++ b/tests/approvals/out/o2/while-loops/while-loops.awst @@ -15,9 +15,7 @@ contract DemoContract i: uint64 = 0 while (i < stop) { i: uint64 = i + 1 - #loop₁ᶜ: } - #loop₁ᵇ: return i } diff --git a/tests/approvals/out/o2/while-loops/while-loops.awst.json b/tests/approvals/out/o2/while-loops/while-loops.awst.json index 6642b04a6..2ce9e84fe 100644 --- a/tests/approvals/out/o2/while-loops/while-loops.awst.json +++ b/tests/approvals/out/o2/while-loops/while-loops.awst.json @@ -435,37 +435,11 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/while-loops.algo.ts", - "line": 7, - "end_line": 9, - "column": 4, - "end_column": 5 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, "comment": null } - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/while-loops.algo.ts", - "line": 7, - "end_line": 9, - "column": 4, - "end_column": 5 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null } ], "label": null, diff --git a/tests/approvals/out/unoptimized/destructuring-iterators/destructuring-iterators.awst b/tests/approvals/out/unoptimized/destructuring-iterators/destructuring-iterators.awst index 8fcb30d70..8cabe95d5 100644 --- a/tests/approvals/out/unoptimized/destructuring-iterators/destructuring-iterators.awst +++ b/tests/approvals/out/unoptimized/destructuring-iterators/destructuring-iterators.awst @@ -4,8 +4,6 @@ subroutine test(): void total: uint64 = 0 for ({ a: a, b: _ } in items) { total: uint64 = total + a - #loop₁ᶜ: } - #loop₁ᵇ: assert(total == 6) } \ No newline at end of file diff --git a/tests/approvals/out/unoptimized/destructuring-iterators/destructuring-iterators.awst.json b/tests/approvals/out/unoptimized/destructuring-iterators/destructuring-iterators.awst.json index 435f7b368..63c8b326b 100644 --- a/tests/approvals/out/unoptimized/destructuring-iterators/destructuring-iterators.awst.json +++ b/tests/approvals/out/unoptimized/destructuring-iterators/destructuring-iterators.awst.json @@ -817,37 +817,11 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/destructuring-iterators.algo.ts", - "line": 11, - "end_line": 11, - "column": 2, - "end_column": 28 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, "comment": null } - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/destructuring-iterators.algo.ts", - "line": 11, - "end_line": 11, - "column": 2, - "end_column": 28 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null } ], "label": null, diff --git a/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.approval.teal b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.approval.teal new file mode 100644 index 000000000..5911c4762 --- /dev/null +++ b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.approval.teal @@ -0,0 +1,377 @@ +#pragma version 10 +#pragma typetrack false + +// @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram() -> uint64: +main: + intcblock 0 1 + bytecblock 0x151f7c75 + +main_block@1: + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txn NumAppArgs + intc_0 // 0 + != + bz main_bare_routing@8 + +main_abi_routing@2: + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txna ApplicationArgs 0 + pushbytes 0x39239792 // method "testDo(uint64)uint64" + pushbytes 0xace2eb21 // method "testDoBreak(uint64,uint64)uint64" + pushbytes 0x78e8d516 // method "testDoContinue(uint64,uint64)uint64" + uncover 3 + match main_testDo_route@3 main_testDoBreak_route@4 main_testDoContinue_route@5 + +main_switch_case_default@6: + +main_switch_case_next@7: + +main_after_if_else@12: + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + intc_0 // 0 + +main_after_inlined_tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__@13: + return + +main_testDoContinue_route@5: + // tests/approvals/do-loops.algo.ts:23 + // testDoContinue(stop: uint64, mod: uint64) { + txn OnCompletion + intc_0 // NoOp + == + assert // OnCompletion is not NoOp + txn ApplicationID + intc_0 // 0 + != + assert // can only call when not creating + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txna ApplicationArgs 1 + btoi + txna ApplicationArgs 2 + btoi + // tests/approvals/do-loops.algo.ts:23 + // testDoContinue(stop: uint64, mod: uint64) { + callsub testDoContinue + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + b main_after_inlined_tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__@13 + +main_testDoBreak_route@4: + // tests/approvals/do-loops.algo.ts:12 + // testDoBreak(stop: uint64, breakMod: uint64) { + txn OnCompletion + intc_0 // NoOp + == + assert // OnCompletion is not NoOp + txn ApplicationID + intc_0 // 0 + != + assert // can only call when not creating + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txna ApplicationArgs 1 + btoi + txna ApplicationArgs 2 + btoi + // tests/approvals/do-loops.algo.ts:12 + // testDoBreak(stop: uint64, breakMod: uint64) { + callsub testDoBreak + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + b main_after_inlined_tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__@13 + +main_testDo_route@3: + // tests/approvals/do-loops.algo.ts:5 + // testDo(stop: uint64) { + txn OnCompletion + intc_0 // NoOp + == + assert // OnCompletion is not NoOp + txn ApplicationID + intc_0 // 0 + != + assert // can only call when not creating + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txna ApplicationArgs 1 + btoi + // tests/approvals/do-loops.algo.ts:5 + // testDo(stop: uint64) { + callsub testDo + itob + bytec_0 // 0x151f7c75 + swap + concat + log + intc_1 // 1 + b main_after_inlined_tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__@13 + +main_bare_routing@8: + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txn OnCompletion + intc_0 // 0 + swap + match main___algots__.defaultCreate@9 + +main_switch_case_default@10: + +main_switch_case_next@11: + b main_after_if_else@12 + +main___algots__.defaultCreate@9: + // tests/approvals/do-loops.algo.ts:4 + // export class DoLoopsAlgo extends Contract { + txn ApplicationID + intc_0 // 0 + == + assert // can only call when creating + callsub __algots__.defaultCreate + intc_1 // 1 + b main_after_inlined_tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__@13 + + +// tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(stop: uint64) -> uint64: +testDo: + // tests/approvals/do-loops.algo.ts:5 + // testDo(stop: uint64) { + proto 1 1 + // tests/approvals/do-loops.algo.ts:6 + // let i = Uint64(0) + intc_0 // 0 + +testDo_while_top@1: + // tests/approvals/do-loops.algo.ts:7-9 + // do { + // i += 1 + // } while (i < stop) + intc_1 // 1 + bz testDo_after_while@5 + +testDo_while_body@2: + // tests/approvals/do-loops.algo.ts:8 + // i += 1 + frame_dig 0 + intc_1 // 1 + + + dup + frame_bury 0 + // tests/approvals/do-loops.algo.ts:9 + // } while (i < stop) + frame_dig -1 + < + bnz testDo_after_if_else@4 + +testDo_if_body@3: + +testDo_block@6: + // tests/approvals/do-loops.algo.ts:10 + // return i + frame_dig 0 + swap + retsub + +testDo_after_if_else@4: + b testDo_while_top@1 + +testDo_after_while@5: + b testDo_block@6 + + +// tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(stop: uint64, breakMod: uint64) -> uint64: +testDoBreak: + // tests/approvals/do-loops.algo.ts:12 + // testDoBreak(stop: uint64, breakMod: uint64) { + proto 2 1 + // tests/approvals/do-loops.algo.ts:13 + // let total = Uint64(0) + intc_0 // 0 + // tests/approvals/do-loops.algo.ts:14 + // let i = Uint64(0) + dup + +testDoBreak_while_top@1: + // tests/approvals/do-loops.algo.ts:15-20 + // do { + // if (i > 0 && i % breakMod === 0) break + // + // i += 1 + // total += i + // } while (i < stop) + intc_1 // 1 + bz testDoBreak_after_while@8 + +testDoBreak_while_body@2: + // tests/approvals/do-loops.algo.ts:16 + // if (i > 0 && i % breakMod === 0) break + frame_dig 1 + intc_0 // 0 + > + bz testDoBreak_after_if_else@5 + +testDoBreak_and_contd@3: + // tests/approvals/do-loops.algo.ts:16 + // if (i > 0 && i % breakMod === 0) break + frame_dig 1 + frame_dig -1 + % + intc_0 // 0 + == + bz testDoBreak_after_if_else@5 + +testDoBreak_if_body@4: + +testDoBreak_block@9: + // tests/approvals/do-loops.algo.ts:21 + // return total + retsub + +testDoBreak_after_if_else@5: + // tests/approvals/do-loops.algo.ts:18 + // i += 1 + frame_dig 1 + intc_1 // 1 + + + dup + frame_bury 1 + // tests/approvals/do-loops.algo.ts:19 + // total += i + frame_dig 0 + dig 1 + + + frame_bury 0 + // tests/approvals/do-loops.algo.ts:20 + // } while (i < stop) + frame_dig -2 + < + bnz testDoBreak_after_if_else@7 + +testDoBreak_if_body@6: + // tests/approvals/do-loops.algo.ts:15-20 + // do { + // if (i > 0 && i % breakMod === 0) break + // + // i += 1 + // total += i + // } while (i < stop) + b testDoBreak_block@9 + +testDoBreak_after_if_else@7: + b testDoBreak_while_top@1 + +testDoBreak_after_while@8: + b testDoBreak_block@9 + + +// tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(stop: uint64, mod: uint64) -> uint64: +testDoContinue: + // tests/approvals/do-loops.algo.ts:23 + // testDoContinue(stop: uint64, mod: uint64) { + proto 2 1 + // tests/approvals/do-loops.algo.ts:24 + // let i = Uint64(0) + intc_0 // 0 + // tests/approvals/do-loops.algo.ts:25 + // let total = Uint64(0) + dup + +testDoContinue_while_top@1: + // tests/approvals/do-loops.algo.ts:26-34 + // do { + // if (i > 0 && i % mod === 0) { + // total += 2 + // i += 1 + // continue + // } + // total += 1 + // i += 1 + // } while (i < stop) + intc_1 // 1 + bz testDoContinue_after_while@9 + +testDoContinue_while_body@2: + // tests/approvals/do-loops.algo.ts:27 + // if (i > 0 && i % mod === 0) { + frame_dig 0 + intc_0 // 0 + > + bz testDoContinue_after_if_else@5 + +testDoContinue_and_contd@3: + // tests/approvals/do-loops.algo.ts:27 + // if (i > 0 && i % mod === 0) { + frame_dig 0 + frame_dig -1 + % + intc_0 // 0 + == + bz testDoContinue_after_if_else@5 + +testDoContinue_if_body@4: + // tests/approvals/do-loops.algo.ts:28 + // total += 2 + frame_dig 1 + pushint 2 // 2 + + + frame_bury 1 + // tests/approvals/do-loops.algo.ts:29 + // i += 1 + frame_dig 0 + intc_1 // 1 + + + frame_bury 0 + +testDoContinue_block@6: + // tests/approvals/do-loops.algo.ts:34 + // } while (i < stop) + frame_dig 0 + frame_dig -2 + < + bnz testDoContinue_after_if_else@8 + +testDoContinue_if_body@7: + +testDoContinue_block@10: + // tests/approvals/do-loops.algo.ts:35 + // return total + frame_dig 1 + frame_bury 0 + retsub + +testDoContinue_after_if_else@8: + b testDoContinue_while_top@1 + +testDoContinue_after_if_else@5: + // tests/approvals/do-loops.algo.ts:32 + // total += 1 + frame_dig 1 + intc_1 // 1 + + + frame_bury 1 + // tests/approvals/do-loops.algo.ts:33 + // i += 1 + frame_dig 0 + intc_1 // 1 + + + frame_bury 0 + b testDoContinue_block@6 + +testDoContinue_after_while@9: + b testDoContinue_block@10 + + +// tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__algots__.defaultCreate() -> void: +__algots__.defaultCreate: + retsub diff --git a/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.arc32.json b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.arc32.json new file mode 100644 index 000000000..3055c22ed --- /dev/null +++ b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.arc32.json @@ -0,0 +1,99 @@ +{ + "hints": { + "testDo(uint64)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "testDoBreak(uint64,uint64)uint64": { + "call_config": { + "no_op": "CALL" + } + }, + "testDoContinue(uint64,uint64)uint64": { + "call_config": { + "no_op": "CALL" + } + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKCm1haW5fYmxvY2tAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDgKCm1haW5fYWJpX3JvdXRpbmdAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIHB1c2hieXRlcyAweDM5MjM5NzkyIC8vIG1ldGhvZCAidGVzdERvKHVpbnQ2NCl1aW50NjQiCiAgICBwdXNoYnl0ZXMgMHhhY2UyZWIyMSAvLyBtZXRob2QgInRlc3REb0JyZWFrKHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgcHVzaGJ5dGVzIDB4NzhlOGQ1MTYgLy8gbWV0aG9kICJ0ZXN0RG9Db250aW51ZSh1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHVuY292ZXIgMwogICAgbWF0Y2ggbWFpbl90ZXN0RG9fcm91dGVAMyBtYWluX3Rlc3REb0JyZWFrX3JvdXRlQDQgbWFpbl90ZXN0RG9Db250aW51ZV9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX2RlZmF1bHRANjoKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA3OgoKbWFpbl9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo6RG9Mb29wc0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTM6CiAgICByZXR1cm4KCm1haW5fdGVzdERvQ29udGludWVfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjIzCiAgICAvLyB0ZXN0RG9Db250aW51ZShzdG9wOiB1aW50NjQsIG1vZDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgRG9Mb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyMwogICAgLy8gdGVzdERvQ29udGludWUoc3RvcDogdWludDY0LCBtb2Q6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0RG9Db250aW51ZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxMwoKbWFpbl90ZXN0RG9CcmVha19yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIHRlc3REb0JyZWFrKHN0b3A6IHVpbnQ2NCwgYnJlYWtNb2Q6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIHRlc3REb0JyZWFrKHN0b3A6IHVpbnQ2NCwgYnJlYWtNb2Q6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0RG9CcmVhawogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxMwoKbWFpbl90ZXN0RG9fcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3REbyhzdG9wOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3REbyhzdG9wOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdERvCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6OkRvTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDEzCgptYWluX2JhcmVfcm91dGluZ0A4OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIG1hdGNoIG1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDkKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEAxMDoKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEAxMToKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDEyCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBfX2FsZ290c19fLmRlZmF1bHRDcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo6RG9Mb29wc0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTMKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo6RG9Mb29wc0FsZ28udGVzdERvKHN0b3A6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0RG86CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0RG8oc3RvcDogdWludDY0KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKdGVzdERvX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6Ny05CiAgICAvLyBkbyB7CiAgICAvLyAgIGkgKz0gMQogICAgLy8gfSB3aGlsZSAoaSA8IHN0b3ApCiAgICBpbnRjXzEgLy8gMQogICAgYnogdGVzdERvX2FmdGVyX3doaWxlQDUKCnRlc3REb193aGlsZV9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo4CiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjkKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBibnogdGVzdERvX2FmdGVyX2lmX2Vsc2VANAoKdGVzdERvX2lmX2JvZHlAMzoKCnRlc3REb19ibG9ja0A2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTAKICAgIC8vIHJldHVybiBpCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgp0ZXN0RG9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgYiB0ZXN0RG9fd2hpbGVfdG9wQDEKCnRlc3REb19hZnRlcl93aGlsZUA1OgogICAgYiB0ZXN0RG9fYmxvY2tANgoKCi8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby50ZXN0RG9CcmVhayhzdG9wOiB1aW50NjQsIGJyZWFrTW9kOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdERvQnJlYWs6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxMgogICAgLy8gdGVzdERvQnJlYWsoc3RvcDogdWludDY0LCBicmVha01vZDogdWludDY0KSB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNAogICAgLy8gbGV0IGkgPSBVaW50NjQoMCkKICAgIGR1cAoKdGVzdERvQnJlYWtfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNS0yMAogICAgLy8gZG8gewogICAgLy8gICBpZiAoaSA+IDAgJiYgaSAlIGJyZWFrTW9kID09PSAwKSBicmVhawogICAgLy8gCiAgICAvLyAgIGkgKz0gMQogICAgLy8gICB0b3RhbCArPSBpCiAgICAvLyB9IHdoaWxlIChpIDwgc3RvcCkKICAgIGludGNfMSAvLyAxCiAgICBieiB0ZXN0RG9CcmVha19hZnRlcl93aGlsZUA4Cgp0ZXN0RG9CcmVha193aGlsZV9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNgogICAgLy8gaWYgKGkgPiAwICYmIGkgJSBicmVha01vZCA9PT0gMCkgYnJlYWsKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgPgogICAgYnogdGVzdERvQnJlYWtfYWZ0ZXJfaWZfZWxzZUA1Cgp0ZXN0RG9CcmVha19hbmRfY29udGRAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE2CiAgICAvLyBpZiAoaSA+IDAgJiYgaSAlIGJyZWFrTW9kID09PSAwKSBicmVhawogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgJQogICAgaW50Y18wIC8vIDAKICAgID09CiAgICBieiB0ZXN0RG9CcmVha19hZnRlcl9pZl9lbHNlQDUKCnRlc3REb0JyZWFrX2lmX2JvZHlANDoKCnRlc3REb0JyZWFrX2Jsb2NrQDk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyMQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCnRlc3REb0JyZWFrX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE4CiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE5CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjAKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBibnogdGVzdERvQnJlYWtfYWZ0ZXJfaWZfZWxzZUA3Cgp0ZXN0RG9CcmVha19pZl9ib2R5QDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNS0yMAogICAgLy8gZG8gewogICAgLy8gICBpZiAoaSA+IDAgJiYgaSAlIGJyZWFrTW9kID09PSAwKSBicmVhawogICAgLy8gCiAgICAvLyAgIGkgKz0gMQogICAgLy8gICB0b3RhbCArPSBpCiAgICAvLyB9IHdoaWxlIChpIDwgc3RvcCkKICAgIGIgdGVzdERvQnJlYWtfYmxvY2tAOQoKdGVzdERvQnJlYWtfYWZ0ZXJfaWZfZWxzZUA3OgogICAgYiB0ZXN0RG9CcmVha193aGlsZV90b3BAMQoKdGVzdERvQnJlYWtfYWZ0ZXJfd2hpbGVAODoKICAgIGIgdGVzdERvQnJlYWtfYmxvY2tAOQoKCi8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby50ZXN0RG9Db250aW51ZShzdG9wOiB1aW50NjQsIG1vZDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3REb0NvbnRpbnVlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHRlc3REb0NvbnRpbnVlKHN0b3A6IHVpbnQ2NCwgbW9kOiB1aW50NjQpIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjQKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjUKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgZHVwCgp0ZXN0RG9Db250aW51ZV93aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI2LTM0CiAgICAvLyBkbyB7CiAgICAvLyAgIGlmIChpID4gMCAmJiBpICUgbW9kID09PSAwKSB7CiAgICAvLyAgICAgdG90YWwgKz0gMgogICAgLy8gICAgIGkgKz0gMQogICAgLy8gICAgIGNvbnRpbnVlCiAgICAvLyAgIH0KICAgIC8vICAgdG90YWwgKz0gMQogICAgLy8gICBpICs9IDEKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgaW50Y18xIC8vIDEKICAgIGJ6IHRlc3REb0NvbnRpbnVlX2FmdGVyX3doaWxlQDkKCnRlc3REb0NvbnRpbnVlX3doaWxlX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBpZiAoaSA+IDAgJiYgaSAlIG1vZCA9PT0gMCkgewogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMCAvLyAwCiAgICA+CiAgICBieiB0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDUKCnRlc3REb0NvbnRpbnVlX2FuZF9jb250ZEAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGlmIChpID4gMCAmJiBpICUgbW9kID09PSAwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICAlCiAgICBpbnRjXzAgLy8gMAogICAgPT0KICAgIGJ6IHRlc3REb0NvbnRpbnVlX2FmdGVyX2lmX2Vsc2VANQoKdGVzdERvQ29udGludWVfaWZfYm9keUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIHRvdGFsICs9IDIKICAgIGZyYW1lX2RpZyAxCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyOQogICAgLy8gaSArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKdGVzdERvQ29udGludWVfYmxvY2tANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyB9IHdoaWxlIChpIDwgc3RvcCkKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJueiB0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDgKCnRlc3REb0NvbnRpbnVlX2lmX2JvZHlANzoKCnRlc3REb0NvbnRpbnVlX2Jsb2NrQDEwOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHJldHVybiB0b3RhbAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDg6CiAgICBiIHRlc3REb0NvbnRpbnVlX3doaWxlX3RvcEAxCgp0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czozMgogICAgLy8gdG90YWwgKz0gMQogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjMzCiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHRlc3REb0NvbnRpbnVlX2Jsb2NrQDYKCnRlc3REb0NvbnRpbnVlX2FmdGVyX3doaWxlQDk6CiAgICBiIHRlc3REb0NvbnRpbnVlX2Jsb2NrQDEwCgoKLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6OkRvTG9vcHNBbGdvLl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZSgpIC0+IHZvaWQ6Cl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZToKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "state": { + "global": { + "num_byte_slices": 0, + "num_uints": 0 + }, + "local": { + "num_byte_slices": 0, + "num_uints": 0 + } + }, + "schema": { + "global": { + "declared": {}, + "reserved": {} + }, + "local": { + "declared": {}, + "reserved": {} + } + }, + "contract": { + "name": "DoLoopsAlgo", + "methods": [ + { + "name": "testDo", + "args": [ + { + "type": "uint64", + "name": "stop" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + }, + { + "name": "testDoBreak", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "breakMod" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + }, + { + "name": "testDoContinue", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "mod" + } + ], + "readonly": false, + "returns": { + "type": "uint64" + } + } + ], + "networks": {} + }, + "bare_call_config": { + "no_op": "CREATE" + } +} \ No newline at end of file diff --git a/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.arc56.json b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.arc56.json new file mode 100644 index 000000000..a564c5e22 --- /dev/null +++ b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.arc56.json @@ -0,0 +1,161 @@ +{ + "name": "DoLoopsAlgo", + "structs": {}, + "methods": [ + { + "name": "testDo", + "args": [ + { + "type": "uint64", + "name": "stop" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "testDoBreak", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "breakMod" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "testDoContinue", + "args": [ + { + "type": "uint64", + "name": "stop" + }, + { + "type": "uint64", + "name": "mod" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "arcs": [ + 22, + 28 + ], + "networks": {}, + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 56, + 86, + 116 + ], + "errorMessage": "OnCompletion is not NoOp" + }, + { + "pc": [ + 153 + ], + "errorMessage": "can only call when creating" + }, + { + "pc": [ + 61, + 91, + 121 + ], + "errorMessage": "can only call when not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKCm1haW5fYmxvY2tAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDgKCm1haW5fYWJpX3JvdXRpbmdAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIHB1c2hieXRlcyAweDM5MjM5NzkyIC8vIG1ldGhvZCAidGVzdERvKHVpbnQ2NCl1aW50NjQiCiAgICBwdXNoYnl0ZXMgMHhhY2UyZWIyMSAvLyBtZXRob2QgInRlc3REb0JyZWFrKHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgcHVzaGJ5dGVzIDB4NzhlOGQ1MTYgLy8gbWV0aG9kICJ0ZXN0RG9Db250aW51ZSh1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHVuY292ZXIgMwogICAgbWF0Y2ggbWFpbl90ZXN0RG9fcm91dGVAMyBtYWluX3Rlc3REb0JyZWFrX3JvdXRlQDQgbWFpbl90ZXN0RG9Db250aW51ZV9yb3V0ZUA1CgptYWluX3N3aXRjaF9jYXNlX2RlZmF1bHRANjoKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA3OgoKbWFpbl9hZnRlcl9pZl9lbHNlQDEyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo6RG9Mb29wc0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTM6CiAgICByZXR1cm4KCm1haW5fdGVzdERvQ29udGludWVfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjIzCiAgICAvLyB0ZXN0RG9Db250aW51ZShzdG9wOiB1aW50NjQsIG1vZDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo0CiAgICAvLyBleHBvcnQgY2xhc3MgRG9Mb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyMwogICAgLy8gdGVzdERvQ29udGludWUoc3RvcDogdWludDY0LCBtb2Q6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0RG9Db250aW51ZQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxMwoKbWFpbl90ZXN0RG9CcmVha19yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIHRlc3REb0JyZWFrKHN0b3A6IHVpbnQ2NCwgYnJlYWtNb2Q6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIHRlc3REb0JyZWFrKHN0b3A6IHVpbnQ2NCwgYnJlYWtNb2Q6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0RG9CcmVhawogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxMwoKbWFpbl90ZXN0RG9fcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3REbyhzdG9wOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGV4cG9ydCBjbGFzcyBEb0xvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3REbyhzdG9wOiB1aW50NjQpIHsKICAgIGNhbGxzdWIgdGVzdERvCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6OkRvTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDEzCgptYWluX2JhcmVfcm91dGluZ0A4OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIG1hdGNoIG1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDkKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEAxMDoKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEAxMToKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDEyCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6NAogICAgLy8gZXhwb3J0IGNsYXNzIERvTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBfX2FsZ290c19fLmRlZmF1bHRDcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo6RG9Mb29wc0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTMKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo6RG9Mb29wc0FsZ28udGVzdERvKHN0b3A6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0RG86CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0RG8oc3RvcDogdWludDY0KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKdGVzdERvX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6Ny05CiAgICAvLyBkbyB7CiAgICAvLyAgIGkgKz0gMQogICAgLy8gfSB3aGlsZSAoaSA8IHN0b3ApCiAgICBpbnRjXzEgLy8gMQogICAgYnogdGVzdERvX2FmdGVyX3doaWxlQDUKCnRlc3REb193aGlsZV9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czo4CiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjkKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBibnogdGVzdERvX2FmdGVyX2lmX2Vsc2VANAoKdGVzdERvX2lmX2JvZHlAMzoKCnRlc3REb19ibG9ja0A2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MTAKICAgIC8vIHJldHVybiBpCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgp0ZXN0RG9fYWZ0ZXJfaWZfZWxzZUA0OgogICAgYiB0ZXN0RG9fd2hpbGVfdG9wQDEKCnRlc3REb19hZnRlcl93aGlsZUA1OgogICAgYiB0ZXN0RG9fYmxvY2tANgoKCi8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby50ZXN0RG9CcmVhayhzdG9wOiB1aW50NjQsIGJyZWFrTW9kOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdERvQnJlYWs6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxMgogICAgLy8gdGVzdERvQnJlYWsoc3RvcDogdWludDY0LCBicmVha01vZDogdWludDY0KSB7CiAgICBwcm90byAyIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNAogICAgLy8gbGV0IGkgPSBVaW50NjQoMCkKICAgIGR1cAoKdGVzdERvQnJlYWtfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNS0yMAogICAgLy8gZG8gewogICAgLy8gICBpZiAoaSA+IDAgJiYgaSAlIGJyZWFrTW9kID09PSAwKSBicmVhawogICAgLy8gCiAgICAvLyAgIGkgKz0gMQogICAgLy8gICB0b3RhbCArPSBpCiAgICAvLyB9IHdoaWxlIChpIDwgc3RvcCkKICAgIGludGNfMSAvLyAxCiAgICBieiB0ZXN0RG9CcmVha19hZnRlcl93aGlsZUA4Cgp0ZXN0RG9CcmVha193aGlsZV9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNgogICAgLy8gaWYgKGkgPiAwICYmIGkgJSBicmVha01vZCA9PT0gMCkgYnJlYWsKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgPgogICAgYnogdGVzdERvQnJlYWtfYWZ0ZXJfaWZfZWxzZUA1Cgp0ZXN0RG9CcmVha19hbmRfY29udGRAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE2CiAgICAvLyBpZiAoaSA+IDAgJiYgaSAlIGJyZWFrTW9kID09PSAwKSBicmVhawogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgJQogICAgaW50Y18wIC8vIDAKICAgID09CiAgICBieiB0ZXN0RG9CcmVha19hZnRlcl9pZl9lbHNlQDUKCnRlc3REb0JyZWFrX2lmX2JvZHlANDoKCnRlc3REb0JyZWFrX2Jsb2NrQDk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyMQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCnRlc3REb0JyZWFrX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE4CiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjE5CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjAKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBibnogdGVzdERvQnJlYWtfYWZ0ZXJfaWZfZWxzZUA3Cgp0ZXN0RG9CcmVha19pZl9ib2R5QDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoxNS0yMAogICAgLy8gZG8gewogICAgLy8gICBpZiAoaSA+IDAgJiYgaSAlIGJyZWFrTW9kID09PSAwKSBicmVhawogICAgLy8gCiAgICAvLyAgIGkgKz0gMQogICAgLy8gICB0b3RhbCArPSBpCiAgICAvLyB9IHdoaWxlIChpIDwgc3RvcCkKICAgIGIgdGVzdERvQnJlYWtfYmxvY2tAOQoKdGVzdERvQnJlYWtfYWZ0ZXJfaWZfZWxzZUA3OgogICAgYiB0ZXN0RG9CcmVha193aGlsZV90b3BAMQoKdGVzdERvQnJlYWtfYWZ0ZXJfd2hpbGVAODoKICAgIGIgdGVzdERvQnJlYWtfYmxvY2tAOQoKCi8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjpEb0xvb3BzQWxnby50ZXN0RG9Db250aW51ZShzdG9wOiB1aW50NjQsIG1vZDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3REb0NvbnRpbnVlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHRlc3REb0NvbnRpbnVlKHN0b3A6IHVpbnQ2NCwgbW9kOiB1aW50NjQpIHsKICAgIHByb3RvIDIgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjQKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjUKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgZHVwCgp0ZXN0RG9Db250aW51ZV93aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI2LTM0CiAgICAvLyBkbyB7CiAgICAvLyAgIGlmIChpID4gMCAmJiBpICUgbW9kID09PSAwKSB7CiAgICAvLyAgICAgdG90YWwgKz0gMgogICAgLy8gICAgIGkgKz0gMQogICAgLy8gICAgIGNvbnRpbnVlCiAgICAvLyAgIH0KICAgIC8vICAgdG90YWwgKz0gMQogICAgLy8gICBpICs9IDEKICAgIC8vIH0gd2hpbGUgKGkgPCBzdG9wKQogICAgaW50Y18xIC8vIDEKICAgIGJ6IHRlc3REb0NvbnRpbnVlX2FmdGVyX3doaWxlQDkKCnRlc3REb0NvbnRpbnVlX3doaWxlX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBpZiAoaSA+IDAgJiYgaSAlIG1vZCA9PT0gMCkgewogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMCAvLyAwCiAgICA+CiAgICBieiB0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDUKCnRlc3REb0NvbnRpbnVlX2FuZF9jb250ZEAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGlmIChpID4gMCAmJiBpICUgbW9kID09PSAwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICAlCiAgICBpbnRjXzAgLy8gMAogICAgPT0KICAgIGJ6IHRlc3REb0NvbnRpbnVlX2FmdGVyX2lmX2Vsc2VANQoKdGVzdERvQ29udGludWVfaWZfYm9keUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIHRvdGFsICs9IDIKICAgIGZyYW1lX2RpZyAxCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czoyOQogICAgLy8gaSArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKdGVzdERvQ29udGludWVfYmxvY2tANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyB9IHdoaWxlIChpIDwgc3RvcCkKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJueiB0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDgKCnRlc3REb0NvbnRpbnVlX2lmX2JvZHlANzoKCnRlc3REb0NvbnRpbnVlX2Jsb2NrQDEwOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHJldHVybiB0b3RhbAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDg6CiAgICBiIHRlc3REb0NvbnRpbnVlX3doaWxlX3RvcEAxCgp0ZXN0RG9Db250aW51ZV9hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZG8tbG9vcHMuYWxnby50czozMgogICAgLy8gdG90YWwgKz0gMQogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9kby1sb29wcy5hbGdvLnRzOjMzCiAgICAvLyBpICs9IDEKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHRlc3REb0NvbnRpbnVlX2Jsb2NrQDYKCnRlc3REb0NvbnRpbnVlX2FmdGVyX3doaWxlQDk6CiAgICBiIHRlc3REb0NvbnRpbnVlX2Jsb2NrQDEwCgoKLy8gdGVzdHMvYXBwcm92YWxzL2RvLWxvb3BzLmFsZ28udHM6OkRvTG9vcHNBbGdvLl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZSgpIC0+IHZvaWQ6Cl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZToKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAEmAQQVH3x1MRsiE0EAdzYaAIAEOSOXkoAErOLrIYAEeOjVFk8DjgMAPgAgAAIiQzEZIhJEMRgiE0Q2GgEXNhoCF4gArxYoTFCwI0L/4TEZIhJEMRgiE0Q2GgEXNhoCF4gAWRYoTFCwI0L/wzEZIhJEMRgiE0Q2GgEXiAAgFihMULAjQv+pMRkiTI4BAANC/50xGCISRIgApCNC/5KKAQEiI0EAFIsAIwhJjACL/wxAAASLAEyJQv/oQv/2igIBIkkjQQAsiwEiDUEAC4sBi/8YIhJBAAGJiwEjCEmMAYsASwEIjACL/gxAAANC/+hC/9BC/+KKAgEiSSNBAD2LACINQQAniwCL/xgiEkEAHYsBgQIIjAGLACMIjACLAIv+DEAABYsBjACJQv/OiwEjCIwBiwAjCIwAQv/hQv/miQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 4, + "minor": 3, + "patch": 3 + } + }, + "events": [], + "templateVariables": {} +} \ No newline at end of file diff --git a/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.clear.teal b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.clear.teal new file mode 100644 index 000000000..a4d580477 --- /dev/null +++ b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.clear.teal @@ -0,0 +1,7 @@ +#pragma version 10 +#pragma typetrack false + +// @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram() -> uint64: +main: + pushint 1 // 1 + return diff --git a/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.0.ssa.ir b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.0.ssa.ir new file mode 100644 index 000000000..c453cbd01 --- /dev/null +++ b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.0.ssa.ir @@ -0,0 +1,175 @@ +main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram: + block@0: // L1 + let tmp%0#0: bool = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__() + return tmp%0#0 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__() -> bool: + block@0: // L4 + let tmp%0#0: uint64 = (txn NumAppArgs) + let tmp%1#0: bool = (!= tmp%0#0 0u) + goto tmp%1#0 ? block@1 : block@7 + block@1: // abi_routing_L4 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "testDo(uint64)uint64" => block@2, method "testDoBreak(uint64,uint64)uint64" => block@3, method "testDoContinue(uint64,uint64)uint64" => block@4, * => block@5} + block@2: // testDo_route_L5 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: bool = (== tmp%3#0 NoOp) + (assert tmp%4#0) // OnCompletion is not NoOp + let tmp%5#0: uint64 = (txn ApplicationID) + let tmp%6#0: bool = (!= tmp%5#0 0u) + (assert tmp%6#0) // can only call when not creating + let reinterpret_bytes[8]%0#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%7#0: uint64 = (btoi reinterpret_bytes[8]%0#0) + let to_encode%0#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(tmp%7#0) + let val_as_bytes%0#0: bytes[8] = (itob to_encode%0#0) + let tmp%8#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%8#0) + return 1u + block@3: // testDoBreak_route_L12 + let tmp%9#0: uint64 = (txn OnCompletion) + let tmp%10#0: bool = (== tmp%9#0 NoOp) + (assert tmp%10#0) // OnCompletion is not NoOp + let tmp%11#0: uint64 = (txn ApplicationID) + let tmp%12#0: bool = (!= tmp%11#0 0u) + (assert tmp%12#0) // can only call when not creating + let reinterpret_bytes[8]%1#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%13#0: uint64 = (btoi reinterpret_bytes[8]%1#0) + let reinterpret_bytes[8]%2#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%14#0: uint64 = (btoi reinterpret_bytes[8]%2#0) + let to_encode%1#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(tmp%13#0, tmp%14#0) + let val_as_bytes%1#0: bytes[8] = (itob to_encode%1#0) + let tmp%15#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) + (log tmp%15#0) + return 1u + block@4: // testDoContinue_route_L23 + let tmp%16#0: uint64 = (txn OnCompletion) + let tmp%17#0: bool = (== tmp%16#0 NoOp) + (assert tmp%17#0) // OnCompletion is not NoOp + let tmp%18#0: uint64 = (txn ApplicationID) + let tmp%19#0: bool = (!= tmp%18#0 0u) + (assert tmp%19#0) // can only call when not creating + let reinterpret_bytes[8]%3#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%20#0: uint64 = (btoi reinterpret_bytes[8]%3#0) + let reinterpret_bytes[8]%4#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%21#0: uint64 = (btoi reinterpret_bytes[8]%4#0) + let to_encode%2#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(tmp%20#0, tmp%21#0) + let val_as_bytes%2#0: bytes[8] = (itob to_encode%2#0) + let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) + (log tmp%22#0) + return 1u + block@5: // switch_case_default_L4 + goto block@6 + block@6: // switch_case_next_L4 + goto block@11 + block@7: // bare_routing_L4 + let tmp%23#0: uint64 = (txn OnCompletion) + switch tmp%23#0 {0u => block@8, * => block@9} + block@8: // __algots__.defaultCreate_L4 + let tmp%24#0: uint64 = (txn ApplicationID) + let tmp%25#0: bool = (== tmp%24#0 0u) + (assert tmp%25#0) // can only call when creating + tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__algots__.defaultCreate() + return 1u + block@9: // switch_case_default_L4 + goto block@10 + block@10: // switch_case_next_L4 + goto block@11 + block@11: // after_if_else_L4 + return 0u + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(stop: uint64) -> uint64: + block@0: // L5 + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L7 + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + goto 1u ? block@2 : block@5 + block@2: // while_body_L7 + let i#2: uint64 = (+ i#1 1u) + let tmp%0#0: bool = (< i#2 stop#0) + goto tmp%0#0 ? block@4 : block@3 + block@3: // if_body_L7 + goto block@6 + block@4: // after_if_else_L7 + goto block@1 + block@5: // after_while_L7 + goto block@6 + block@6: // L7 + let i#3: uint64 = φ(i#2 <- block@3, i#1 <- block@5) + return i#3 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(stop: uint64, breakMod: uint64) -> uint64: + block@0: // L12 + let total#0: uint64 = 0u + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L15 + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#2: uint64 = φ(total#0 <- block@0, total#3 <- block@7) + goto 1u ? block@2 : block@8 + block@2: // while_body_L15 + let tmp%0#0: bool = (> i#1 0u) + goto tmp%0#0 ? block@3 : block@5 + block@3: // and_contd_L16 + let tmp%1#0: uint64 = (% i#1 breakMod#0) + let tmp%2#0: bool = (== tmp%1#0 0u) + goto tmp%2#0 ? block@4 : block@5 + block@4: // if_body_L16 + goto block@9 + block@5: // after_if_else_L16 + let i#3: uint64 = (+ i#1 1u) + let total#3: uint64 = (+ total#2 i#3) + let tmp%3#0: bool = (< i#3 stop#0) + goto tmp%3#0 ? block@7 : block@6 + block@6: // if_body_L15 + goto block@9 + block@7: // after_if_else_L15 + goto block@1 + block@8: // after_while_L15 + goto block@9 + block@9: // L15 + let total#4: uint64 = φ(total#2 <- block@4, total#3 <- block@6, total#2 <- block@8) + return total#4 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(stop: uint64, mod: uint64) -> uint64: + block@0: // L23 + let i#0: uint64 = 0u + let total#0: uint64 = 0u + goto block@1 + block@1: // while_top_L26 + let i#1: uint64 = φ(i#0 <- block@0, i#5 <- block@8) + let total#1: uint64 = φ(total#0 <- block@0, total#5 <- block@8) + goto 1u ? block@2 : block@9 + block@2: // while_body_L26 + let tmp%0#0: bool = (> i#1 0u) + goto tmp%0#0 ? block@3 : block@5 + block@3: // and_contd_L27 + let tmp%1#0: uint64 = (% i#1 mod#0) + let tmp%2#0: bool = (== tmp%1#0 0u) + goto tmp%2#0 ? block@4 : block@5 + block@4: // if_body_L27 + let total#2: uint64 = (+ total#1 2u) + let i#2: uint64 = (+ i#1 1u) + goto block@6 + block@5: // after_if_else_L27 + let total#4: uint64 = (+ total#1 1u) + let i#4: uint64 = (+ i#1 1u) + goto block@6 + block@6: // L26 + let i#5: uint64 = φ(i#2 <- block@4, i#4 <- block@5) + let total#5: uint64 = φ(total#2 <- block@4, total#4 <- block@5) + let tmp%3#0: bool = (< i#5 stop#0) + goto tmp%3#0 ? block@8 : block@7 + block@7: // if_body_L26 + goto block@10 + block@8: // after_if_else_L26 + goto block@1 + block@9: // after_while_L26 + goto block@10 + block@10: // L26 + let total#6: uint64 = φ(total#5 <- block@7, total#1 <- block@9) + return total#6 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__algots__.defaultCreate() -> void: + block@0: // L4 + return \ No newline at end of file diff --git a/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.1.ssa.array.ir b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.1.ssa.array.ir new file mode 100644 index 000000000..f32eb3e21 --- /dev/null +++ b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.1.ssa.array.ir @@ -0,0 +1,180 @@ +main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram: + block@0: // L1 + goto block@1 + block@1: // L4 + let tmp%0#1: uint64 = (txn NumAppArgs) + let tmp%1#0: bool = (!= tmp%0#1 0u) + goto tmp%1#0 ? block@2 : block@8 + block@2: // abi_routing_L4 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "testDo(uint64)uint64" => block@3, method "testDoBreak(uint64,uint64)uint64" => block@4, method "testDoContinue(uint64,uint64)uint64" => block@5, * => block@6} + block@3: // testDo_route_L5 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: bool = (== tmp%3#0 NoOp) + (assert tmp%4#0) // OnCompletion is not NoOp + let tmp%5#0: uint64 = (txn ApplicationID) + let tmp%6#0: bool = (!= tmp%5#0 0u) + (assert tmp%6#0) // can only call when not creating + let reinterpret_bytes[8]%0#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%7#0: uint64 = (btoi reinterpret_bytes[8]%0#0) + let to_encode%0#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(tmp%7#0) + let val_as_bytes%0#0: bytes[8] = (itob to_encode%0#0) + let tmp%8#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%8#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0: bool = 1u + goto block@13 + block@4: // testDoBreak_route_L12 + let tmp%9#0: uint64 = (txn OnCompletion) + let tmp%10#0: bool = (== tmp%9#0 NoOp) + (assert tmp%10#0) // OnCompletion is not NoOp + let tmp%11#0: uint64 = (txn ApplicationID) + let tmp%12#0: bool = (!= tmp%11#0 0u) + (assert tmp%12#0) // can only call when not creating + let reinterpret_bytes[8]%1#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%13#0: uint64 = (btoi reinterpret_bytes[8]%1#0) + let reinterpret_bytes[8]%2#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%14#0: uint64 = (btoi reinterpret_bytes[8]%2#0) + let to_encode%1#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(tmp%13#0, tmp%14#0) + let val_as_bytes%1#0: bytes[8] = (itob to_encode%1#0) + let tmp%15#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) + (log tmp%15#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1: bool = 1u + goto block@13 + block@5: // testDoContinue_route_L23 + let tmp%16#0: uint64 = (txn OnCompletion) + let tmp%17#0: bool = (== tmp%16#0 NoOp) + (assert tmp%17#0) // OnCompletion is not NoOp + let tmp%18#0: uint64 = (txn ApplicationID) + let tmp%19#0: bool = (!= tmp%18#0 0u) + (assert tmp%19#0) // can only call when not creating + let reinterpret_bytes[8]%3#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%20#0: uint64 = (btoi reinterpret_bytes[8]%3#0) + let reinterpret_bytes[8]%4#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%21#0: uint64 = (btoi reinterpret_bytes[8]%4#0) + let to_encode%2#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(tmp%20#0, tmp%21#0) + let val_as_bytes%2#0: bytes[8] = (itob to_encode%2#0) + let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) + (log tmp%22#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2: bool = 1u + goto block@13 + block@6: // switch_case_default_L4 + goto block@7 + block@7: // switch_case_next_L4 + goto block@12 + block@8: // bare_routing_L4 + let tmp%23#0: uint64 = (txn OnCompletion) + switch tmp%23#0 {0u => block@9, * => block@10} + block@9: // __algots__.defaultCreate_L4 + let tmp%24#0: uint64 = (txn ApplicationID) + let tmp%25#0: bool = (== tmp%24#0 0u) + (assert tmp%25#0) // can only call when creating + tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__algots__.defaultCreate() + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3: bool = 1u + goto block@13 + block@10: // switch_case_default_L4 + goto block@11 + block@11: // switch_case_next_L4 + goto block@12 + block@12: // after_if_else_L4 + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4: bool = 0u + goto block@13 + block@13: // after_inlined_tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router___L1 + let tmp%0#0: bool = φ(tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0 <- block@3, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1 <- block@4, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2 <- block@5, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3 <- block@9, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4 <- block@12) + return tmp%0#0 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(stop: uint64) -> uint64: + block@0: // L5 + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L7 + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + goto 1u ? block@2 : block@5 + block@2: // while_body_L7 + let i#2: uint64 = (+ i#1 1u) + let tmp%0#0: bool = (< i#2 stop#0) + goto tmp%0#0 ? block@4 : block@3 + block@3: // if_body_L7 + goto block@6 + block@4: // after_if_else_L7 + goto block@1 + block@5: // after_while_L7 + goto block@6 + block@6: // L7 + let i#3: uint64 = φ(i#2 <- block@3, i#1 <- block@5) + return i#3 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(stop: uint64, breakMod: uint64) -> uint64: + block@0: // L12 + let total#0: uint64 = 0u + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L15 + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#2: uint64 = φ(total#0 <- block@0, total#3 <- block@7) + goto 1u ? block@2 : block@8 + block@2: // while_body_L15 + let tmp%0#0: bool = (> i#1 0u) + goto tmp%0#0 ? block@3 : block@5 + block@3: // and_contd_L16 + let tmp%1#0: uint64 = (% i#1 breakMod#0) + let tmp%2#0: bool = (== tmp%1#0 0u) + goto tmp%2#0 ? block@4 : block@5 + block@4: // if_body_L16 + goto block@9 + block@5: // after_if_else_L16 + let i#3: uint64 = (+ i#1 1u) + let total#3: uint64 = (+ total#2 i#3) + let tmp%3#0: bool = (< i#3 stop#0) + goto tmp%3#0 ? block@7 : block@6 + block@6: // if_body_L15 + goto block@9 + block@7: // after_if_else_L15 + goto block@1 + block@8: // after_while_L15 + goto block@9 + block@9: // L15 + let total#4: uint64 = φ(total#2 <- block@4, total#3 <- block@6, total#2 <- block@8) + return total#4 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(stop: uint64, mod: uint64) -> uint64: + block@0: // L23 + let i#0: uint64 = 0u + let total#0: uint64 = 0u + goto block@1 + block@1: // while_top_L26 + let i#1: uint64 = φ(i#0 <- block@0, i#5 <- block@8) + let total#1: uint64 = φ(total#0 <- block@0, total#5 <- block@8) + goto 1u ? block@2 : block@9 + block@2: // while_body_L26 + let tmp%0#0: bool = (> i#1 0u) + goto tmp%0#0 ? block@3 : block@5 + block@3: // and_contd_L27 + let tmp%1#0: uint64 = (% i#1 mod#0) + let tmp%2#0: bool = (== tmp%1#0 0u) + goto tmp%2#0 ? block@4 : block@5 + block@4: // if_body_L27 + let total#2: uint64 = (+ total#1 2u) + let i#2: uint64 = (+ i#1 1u) + goto block@6 + block@5: // after_if_else_L27 + let total#4: uint64 = (+ total#1 1u) + let i#4: uint64 = (+ i#1 1u) + goto block@6 + block@6: // L26 + let i#5: uint64 = φ(i#2 <- block@4, i#4 <- block@5) + let total#5: uint64 = φ(total#2 <- block@4, total#4 <- block@5) + let tmp%3#0: bool = (< i#5 stop#0) + goto tmp%3#0 ? block@8 : block@7 + block@7: // if_body_L26 + goto block@10 + block@8: // after_if_else_L26 + goto block@1 + block@9: // after_while_L26 + goto block@10 + block@10: // L26 + let total#6: uint64 = φ(total#5 <- block@7, total#1 <- block@9) + return total#6 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__algots__.defaultCreate() -> void: + block@0: // L4 + return \ No newline at end of file diff --git a/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.2.ssa.slot.ir new file mode 100644 index 000000000..f32eb3e21 --- /dev/null +++ b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.approval.2.ssa.slot.ir @@ -0,0 +1,180 @@ +main @algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract.approvalProgram: + block@0: // L1 + goto block@1 + block@1: // L4 + let tmp%0#1: uint64 = (txn NumAppArgs) + let tmp%1#0: bool = (!= tmp%0#1 0u) + goto tmp%1#0 ? block@2 : block@8 + block@2: // abi_routing_L4 + let tmp%2#0: bytes = (txna ApplicationArgs 0) + switch tmp%2#0 {method "testDo(uint64)uint64" => block@3, method "testDoBreak(uint64,uint64)uint64" => block@4, method "testDoContinue(uint64,uint64)uint64" => block@5, * => block@6} + block@3: // testDo_route_L5 + let tmp%3#0: uint64 = (txn OnCompletion) + let tmp%4#0: bool = (== tmp%3#0 NoOp) + (assert tmp%4#0) // OnCompletion is not NoOp + let tmp%5#0: uint64 = (txn ApplicationID) + let tmp%6#0: bool = (!= tmp%5#0 0u) + (assert tmp%6#0) // can only call when not creating + let reinterpret_bytes[8]%0#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%7#0: uint64 = (btoi reinterpret_bytes[8]%0#0) + let to_encode%0#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(tmp%7#0) + let val_as_bytes%0#0: bytes[8] = (itob to_encode%0#0) + let tmp%8#0: bytes = (concat 0x151f7c75 val_as_bytes%0#0) + (log tmp%8#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0: bool = 1u + goto block@13 + block@4: // testDoBreak_route_L12 + let tmp%9#0: uint64 = (txn OnCompletion) + let tmp%10#0: bool = (== tmp%9#0 NoOp) + (assert tmp%10#0) // OnCompletion is not NoOp + let tmp%11#0: uint64 = (txn ApplicationID) + let tmp%12#0: bool = (!= tmp%11#0 0u) + (assert tmp%12#0) // can only call when not creating + let reinterpret_bytes[8]%1#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%13#0: uint64 = (btoi reinterpret_bytes[8]%1#0) + let reinterpret_bytes[8]%2#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%14#0: uint64 = (btoi reinterpret_bytes[8]%2#0) + let to_encode%1#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(tmp%13#0, tmp%14#0) + let val_as_bytes%1#0: bytes[8] = (itob to_encode%1#0) + let tmp%15#0: bytes = (concat 0x151f7c75 val_as_bytes%1#0) + (log tmp%15#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1: bool = 1u + goto block@13 + block@5: // testDoContinue_route_L23 + let tmp%16#0: uint64 = (txn OnCompletion) + let tmp%17#0: bool = (== tmp%16#0 NoOp) + (assert tmp%17#0) // OnCompletion is not NoOp + let tmp%18#0: uint64 = (txn ApplicationID) + let tmp%19#0: bool = (!= tmp%18#0 0u) + (assert tmp%19#0) // can only call when not creating + let reinterpret_bytes[8]%3#0: bytes[8] = (txna ApplicationArgs 1) + let tmp%20#0: uint64 = (btoi reinterpret_bytes[8]%3#0) + let reinterpret_bytes[8]%4#0: bytes[8] = (txna ApplicationArgs 2) + let tmp%21#0: uint64 = (btoi reinterpret_bytes[8]%4#0) + let to_encode%2#0: uint64 = tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(tmp%20#0, tmp%21#0) + let val_as_bytes%2#0: bytes[8] = (itob to_encode%2#0) + let tmp%22#0: bytes = (concat 0x151f7c75 val_as_bytes%2#0) + (log tmp%22#0) + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2: bool = 1u + goto block@13 + block@6: // switch_case_default_L4 + goto block@7 + block@7: // switch_case_next_L4 + goto block@12 + block@8: // bare_routing_L4 + let tmp%23#0: uint64 = (txn OnCompletion) + switch tmp%23#0 {0u => block@9, * => block@10} + block@9: // __algots__.defaultCreate_L4 + let tmp%24#0: uint64 = (txn ApplicationID) + let tmp%25#0: bool = (== tmp%24#0 0u) + (assert tmp%25#0) // can only call when creating + tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__algots__.defaultCreate() + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3: bool = 1u + goto block@13 + block@10: // switch_case_default_L4 + goto block@11 + block@11: // switch_case_next_L4 + goto block@12 + block@12: // after_if_else_L4 + let tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4: bool = 0u + goto block@13 + block@13: // after_inlined_tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router___L1 + let tmp%0#0: bool = φ(tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#0 <- block@3, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#1 <- block@4, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#2 <- block@5, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#3 <- block@9, tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__puya_arc4_router__%0#4 <- block@12) + return tmp%0#0 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDo(stop: uint64) -> uint64: + block@0: // L5 + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L7 + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + goto 1u ? block@2 : block@5 + block@2: // while_body_L7 + let i#2: uint64 = (+ i#1 1u) + let tmp%0#0: bool = (< i#2 stop#0) + goto tmp%0#0 ? block@4 : block@3 + block@3: // if_body_L7 + goto block@6 + block@4: // after_if_else_L7 + goto block@1 + block@5: // after_while_L7 + goto block@6 + block@6: // L7 + let i#3: uint64 = φ(i#2 <- block@3, i#1 <- block@5) + return i#3 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoBreak(stop: uint64, breakMod: uint64) -> uint64: + block@0: // L12 + let total#0: uint64 = 0u + let i#0: uint64 = 0u + goto block@1 + block@1: // while_top_L15 + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#2: uint64 = φ(total#0 <- block@0, total#3 <- block@7) + goto 1u ? block@2 : block@8 + block@2: // while_body_L15 + let tmp%0#0: bool = (> i#1 0u) + goto tmp%0#0 ? block@3 : block@5 + block@3: // and_contd_L16 + let tmp%1#0: uint64 = (% i#1 breakMod#0) + let tmp%2#0: bool = (== tmp%1#0 0u) + goto tmp%2#0 ? block@4 : block@5 + block@4: // if_body_L16 + goto block@9 + block@5: // after_if_else_L16 + let i#3: uint64 = (+ i#1 1u) + let total#3: uint64 = (+ total#2 i#3) + let tmp%3#0: bool = (< i#3 stop#0) + goto tmp%3#0 ? block@7 : block@6 + block@6: // if_body_L15 + goto block@9 + block@7: // after_if_else_L15 + goto block@1 + block@8: // after_while_L15 + goto block@9 + block@9: // L15 + let total#4: uint64 = φ(total#2 <- block@4, total#3 <- block@6, total#2 <- block@8) + return total#4 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.testDoContinue(stop: uint64, mod: uint64) -> uint64: + block@0: // L23 + let i#0: uint64 = 0u + let total#0: uint64 = 0u + goto block@1 + block@1: // while_top_L26 + let i#1: uint64 = φ(i#0 <- block@0, i#5 <- block@8) + let total#1: uint64 = φ(total#0 <- block@0, total#5 <- block@8) + goto 1u ? block@2 : block@9 + block@2: // while_body_L26 + let tmp%0#0: bool = (> i#1 0u) + goto tmp%0#0 ? block@3 : block@5 + block@3: // and_contd_L27 + let tmp%1#0: uint64 = (% i#1 mod#0) + let tmp%2#0: bool = (== tmp%1#0 0u) + goto tmp%2#0 ? block@4 : block@5 + block@4: // if_body_L27 + let total#2: uint64 = (+ total#1 2u) + let i#2: uint64 = (+ i#1 1u) + goto block@6 + block@5: // after_if_else_L27 + let total#4: uint64 = (+ total#1 1u) + let i#4: uint64 = (+ i#1 1u) + goto block@6 + block@6: // L26 + let i#5: uint64 = φ(i#2 <- block@4, i#4 <- block@5) + let total#5: uint64 = φ(total#2 <- block@4, total#4 <- block@5) + let tmp%3#0: bool = (< i#5 stop#0) + goto tmp%3#0 ? block@8 : block@7 + block@7: // if_body_L26 + goto block@10 + block@8: // after_if_else_L26 + goto block@1 + block@9: // after_while_L26 + goto block@10 + block@10: // L26 + let total#6: uint64 = φ(total#5 <- block@7, total#1 <- block@9) + return total#6 + +subroutine tests/approvals/do-loops.algo.ts::DoLoopsAlgo.__algots__.defaultCreate() -> void: + block@0: // L4 + return \ No newline at end of file diff --git a/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.0.ssa.ir b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.0.ssa.ir new file mode 100644 index 000000000..1253eaad9 --- /dev/null +++ b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.0.ssa.ir @@ -0,0 +1,3 @@ +main @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.1.ssa.array.ir b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.1.ssa.array.ir new file mode 100644 index 000000000..1253eaad9 --- /dev/null +++ b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.1.ssa.array.ir @@ -0,0 +1,3 @@ +main @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.2.ssa.slot.ir b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.2.ssa.slot.ir new file mode 100644 index 000000000..1253eaad9 --- /dev/null +++ b/tests/approvals/out/unoptimized/do-loops/DoLoopsAlgo.ir/DoLoopsAlgo.clear.2.ssa.slot.ir @@ -0,0 +1,3 @@ +main @algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract.clearStateProgram: + block@0: // L1 + return 1u \ No newline at end of file diff --git a/tests/approvals/out/unoptimized/do-loops/do-loops.awst b/tests/approvals/out/unoptimized/do-loops/do-loops.awst index 7c51ebfb7..eafa96dd5 100644 --- a/tests/approvals/out/unoptimized/do-loops/do-loops.awst +++ b/tests/approvals/out/unoptimized/do-loops/do-loops.awst @@ -1,12 +1,69 @@ -subroutine test_do(stop: uint64): void +contract DoLoopsAlgo { - i: uint64 = 0 - while (True) { - i: uint64 = i + 1 - #loop₁ᶜ: - if (!i < stop) { - goto #loop₁ᵇ + approvalProgram(): bool + { + return arc4Router() + } + + clearProgram(): bool + { + return True + } + + testDo(stop: uint64): uint64 + { + i: uint64 = 0 + while (True) { + i: uint64 = i + 1 + if (!i < stop) { + goto #loop₁ᵇ + } + } + #loop₁ᵇ: + return i + } + + testDoBreak(stop: uint64, breakMod: uint64): uint64 + { + total: uint64 = 0 + i: uint64 = 0 + while (True) { + if (i > 0 and i % breakMod == 0) { + goto #loop₁ᵇ + } + i: uint64 = i + 1 + total: uint64 = total + i + if (!i < stop) { + goto #loop₁ᵇ + } } + #loop₁ᵇ: + return total + } + + testDoContinue(stop: uint64, mod: uint64): uint64 + { + i: uint64 = 0 + total: uint64 = 0 + while (True) { + if (i > 0 and i % mod == 0) { + total: uint64 = total + 2 + i: uint64 = i + 1 + goto #loop₁ᶜ + } + total: uint64 = total + 1 + i: uint64 = i + 1 + #loop₁ᶜ: + if (!i < stop) { + goto #loop₁ᵇ + } + } + #loop₁ᵇ: + return total + } + + __algots__.defaultCreate(): void + { } - #loop₁ᵇ: + } \ No newline at end of file diff --git a/tests/approvals/out/unoptimized/do-loops/do-loops.awst.json b/tests/approvals/out/unoptimized/do-loops/do-loops.awst.json index 290dd6bbe..a982373dc 100644 --- a/tests/approvals/out/unoptimized/do-loops/do-loops.awst.json +++ b/tests/approvals/out/unoptimized/do-loops/do-loops.awst.json @@ -1,67 +1,1384 @@ [ { - "_type": "Subroutine", + "_type": "Contract", "source_location": { "file": "tests/approvals/do-loops.algo.ts", "line": 4, "end_line": 4, "column": 0, - "end_column": 30 + "end_column": 43 }, - "args": [ + "id": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "name": "DoLoopsAlgo", + "description": null, + "method_resolution_order": [ + "@algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract", + "@algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract" + ], + "approval_program": { + "_type": "ContractMethod", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "args": [], + "return_type": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "body": [ + { + "_type": "ReturnStatement", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "value": { + "_type": "ARC4Router", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + } + } + ], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "@algorandfoundation/algorand-typescript/arc4/index.d.ts::Contract", + "member_name": "approvalProgram", + "arc4_method_config": null + }, + "clear_program": { + "_type": "ContractMethod", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "args": [], + "return_type": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "body": [ + { + "_type": "ReturnStatement", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "value": { + "_type": "BoolConstant", + "source_location": { + "_type": "SourceLocation", + "file": null, + "line": 1, + "end_line": 1, + "column": 0, + "end_column": 1 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + } + } + ], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "@algorandfoundation/algorand-typescript/base-contract.d.ts::BaseContract", + "member_name": "clearStateProgram", + "arc4_method_config": null + }, + "methods": [ { - "_type": "SubroutineArgument", - "name": "stop", + "_type": "ContractMethod", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 4, - "end_line": 4, - "column": 17, - "end_column": 29 + "line": 5, + "end_line": 5, + "column": 2, + "end_column": 22 + }, + "args": [ + { + "_type": "SubroutineArgument", + "name": "stop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 5, + "end_line": 5, + "column": 9, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + } + ], + "return_type": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 5, + "end_line": 11, + "column": 23, + "end_column": 3 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 6, + "end_line": 6, + "column": 8, + "end_column": 21 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 6, + "end_line": 6, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 6, + "end_line": 6, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "WhileLoop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "BoolConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + }, + "loop_body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 7, + "end_column": 5 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 12 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 8, + "end_line": 8, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } + } + ], + "label": null, + "comment": null + }, + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "Not", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "expr": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": "<", + "rhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 9, + "end_line": 9, + "column": 17, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "stop" + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null + } + ], + "label": null, + "comment": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 7, + "end_line": 9, + "column": 4, + "end_column": 22 + }, + "body": [], + "label": "#loop₁ᵇ", + "comment": null + } + ], + "label": null, + "comment": null + }, + { + "_type": "ReturnStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 10, + "end_line": 10, + "column": 4, + "end_column": 12 + }, + "value": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 10, + "end_line": 10, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + } + } + ], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "testDo", + "arc4_method_config": { + "_type": "ARC4ABIMethodConfig", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 5, + "end_line": 5, + "column": 2, + "end_column": 22 + }, + "allowed_completion_types": [ + 0 + ], + "create": 3, + "name": "testDo", + "readonly": false, + "default_args": {} + } + }, + { + "_type": "ContractMethod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 12, + "column": 2, + "end_column": 45 + }, + "args": [ + { + "_type": "SubroutineArgument", + "name": "stop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 12, + "column": 14, + "end_column": 26 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + }, + { + "_type": "SubroutineArgument", + "name": "breakMod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 12, + "column": 28, + "end_column": 44 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + } + } + ], + "return_type": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 12, + "end_line": 22, + "column": 46, + "end_column": 3 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 13, + "end_line": 13, + "column": 8, + "end_column": 25 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 13, + "end_line": 13, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 13, + "end_line": 13, + "column": 23, + "end_column": 24 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 14, + "end_line": 14, + "column": 8, + "end_column": 21 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 14, + "end_line": 14, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 14, + "end_line": 14, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "WhileLoop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "BoolConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + }, + "loop_body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 7, + "end_column": 5 + }, + "body": [ + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 6, + "end_column": 38 + }, + "condition": { + "_type": "BooleanBinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 10, + "end_column": 37 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 10, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 10, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": ">", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 14, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + "op": "and", + "right": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 19, + "end_column": 37 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 19, + "end_column": 31 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "%", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 23, + "end_column": 31 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "breakMod" + } + }, + "operator": "==", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 36, + "end_column": 37 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 39, + "end_column": 44 + }, + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 16, + "end_line": 16, + "column": 39, + "end_column": 44 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 12 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 18, + "end_line": 18, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 16 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "op": "+", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 19, + "end_line": 19, + "column": 15, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + } + } + } + ], + "label": null, + "comment": null + }, + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "Not", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "expr": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": "<", + "rhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 20, + "end_line": 20, + "column": 17, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "stop" + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null + } + ], + "label": null, + "comment": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 15, + "end_line": 20, + "column": 4, + "end_column": 22 + }, + "body": [], + "label": "#loop₁ᵇ", + "comment": null + } + ], + "label": null, + "comment": null + }, + { + "_type": "ReturnStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 21, + "end_line": 21, + "column": 4, + "end_column": 16 + }, + "value": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 21, + "end_line": 21, + "column": 11, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + } + } + ], + "label": null, + "comment": null }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 - } - } - ], - "return_type": { - "_type": "WType", - "name": "void", - "immutable": true, - "ephemeral": false, - "scalar_type": null - }, - "body": { - "_type": "Block", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 4, - "end_line": 9, - "column": 31, - "end_column": 1 - }, - "body": [ - { - "_type": "AssignmentStatement", + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "testDoBreak", + "arc4_method_config": { + "_type": "ARC4ABIMethodConfig", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 5, - "end_line": 5, - "column": 6, - "end_column": 19 + "line": 12, + "end_line": 12, + "column": 2, + "end_column": 45 }, - "target": { - "_type": "VarExpression", + "allowed_completion_types": [ + 0 + ], + "create": 3, + "name": "testDoBreak", + "readonly": false, + "default_args": {} + } + }, + { + "_type": "ContractMethod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 23, + "end_line": 23, + "column": 2, + "end_column": 43 + }, + "args": [ + { + "_type": "SubroutineArgument", + "name": "stop", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 5, - "end_line": 5, - "column": 6, - "end_column": 7 + "line": 23, + "end_line": 23, + "column": 17, + "end_column": 29 }, "wtype": { "_type": "WType", @@ -69,17 +1386,17 @@ "immutable": true, "ephemeral": false, "scalar_type": 2 - }, - "name": "i" + } }, - "value": { - "_type": "IntegerConstant", + { + "_type": "SubroutineArgument", + "name": "mod", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 5, - "end_line": 5, - "column": 17, - "end_column": 18 + "line": 23, + "end_line": 23, + "column": 31, + "end_column": 42 }, "wtype": { "_type": "WType", @@ -87,309 +1404,992 @@ "immutable": true, "ephemeral": false, "scalar_type": 2 - }, - "value": "0", - "teal_alias": null + } } + ], + "return_type": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 }, - { + "body": { "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 23, + "end_line": 36, + "column": 44, + "end_column": 3 }, "body": [ { - "_type": "WhileLoop", + "_type": "AssignmentStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 24, + "end_line": 24, + "column": 8, + "end_column": 21 }, - "condition": { - "_type": "BoolConstant", + "target": { + "_type": "VarExpression", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 24, + "end_line": 24, + "column": 8, + "end_column": 9 }, "wtype": { "_type": "WType", - "name": "bool", + "name": "uint64", "immutable": true, "ephemeral": false, "scalar_type": 2 }, - "value": true + "name": "i" }, - "loop_body": { - "_type": "Block", + "value": { + "_type": "IntegerConstant", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, + "line": 24, + "end_line": 24, + "column": 19, "end_column": 20 }, - "body": [ - { + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 25, + "end_line": 25, + "column": 8, + "end_column": 25 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 25, + "end_line": 25, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 25, + "end_line": 25, + "column": 23, + "end_column": 24 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "body": [ + { + "_type": "WhileLoop", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "condition": { + "_type": "BoolConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": true + }, + "loop_body": { "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 5, - "end_column": 3 + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, "body": [ { - "_type": "AssignmentStatement", + "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 10 - }, - "target": { - "_type": "VarExpression", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 5 - }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 - }, - "name": "i" + "line": 26, + "end_line": 34, + "column": 7, + "end_column": 5 }, - "value": { - "_type": "UInt64BinaryOperation", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 10 - }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "body": [ + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 6, + "end_column": 33 + }, + "condition": { + "_type": "BooleanBinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 10, + "end_column": 32 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 10, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 10, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": ">", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 14, + "end_column": 15 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + }, + "op": "and", + "right": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 19, + "end_column": 32 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 19, + "end_column": 26 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 19, + "end_column": 20 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "%", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 23, + "end_column": 26 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "mod" + } + }, + "operator": "==", + "rhs": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 27, + "column": 31, + "end_column": 32 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "0", + "teal_alias": null + } + } + }, + "if_branch": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 31, + "column": 34, + "end_column": 7 + }, + "body": [ + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 27, + "end_line": 31, + "column": 34, + "end_column": 7 + }, + "body": [ + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 18 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 18 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 8, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 28, + "end_line": 28, + "column": 17, + "end_column": 18 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "2", + "teal_alias": null + } + } + }, + { + "_type": "AssignmentStatement", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 14 + }, + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 8, + "end_column": 9 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 29, + "end_line": 29, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } + }, + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 30, + "end_line": 30, + "column": 8, + "end_column": 16 + }, + "target": "#loop₁ᶜ" + } + ], + "label": null, + "comment": null + } + ], + "label": null, + "comment": null + }, + "else_branch": null }, - "left": { - "_type": "VarExpression", + { + "_type": "AssignmentStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 5 + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 16 }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" }, - "name": "i" + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 6, + "end_column": 11 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 32, + "end_line": 32, + "column": 15, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } }, - "op": "+", - "right": { - "_type": "IntegerConstant", + { + "_type": "AssignmentStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 9, - "end_column": 10 + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 12 }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "target": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" }, - "value": "1", - "teal_alias": null + "value": { + "_type": "UInt64BinaryOperation", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 6, + "end_column": 7 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "+", + "right": { + "_type": "IntegerConstant", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 33, + "end_line": 33, + "column": 11, + "end_column": 12 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "value": "1", + "teal_alias": null + } + } } - } - } - ], - "label": null, - "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, - { - "_type": "IfElse", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "condition": { - "_type": "Not", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 11, - "end_column": 19 - }, - "wtype": { - "_type": "WType", - "name": "bool", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + ], + "label": null, + "comment": null }, - "expr": { - "_type": "NumericComparisonExpression", + { + "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 11, - "end_column": 19 + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, - "wtype": { - "_type": "WType", - "name": "bool", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "body": [], + "label": "#loop₁ᶜ", + "comment": null + }, + { + "_type": "IfElse", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, - "lhs": { - "_type": "VarExpression", + "condition": { + "_type": "Not", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 11, - "end_column": 12 + "line": 34, + "end_line": 34, + "column": 13, + "end_column": 21 }, "wtype": { "_type": "WType", - "name": "uint64", + "name": "bool", "immutable": true, "ephemeral": false, "scalar_type": 2 }, - "name": "i" + "expr": { + "_type": "NumericComparisonExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 34, + "end_line": 34, + "column": 13, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "bool", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "lhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 34, + "end_line": 34, + "column": 13, + "end_column": 14 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "operator": "<", + "rhs": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 34, + "end_line": 34, + "column": 17, + "end_column": 21 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "stop" + } + } }, - "operator": "<", - "rhs": { - "_type": "VarExpression", + "if_branch": { + "_type": "Block", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 8, - "end_line": 8, - "column": 15, - "end_column": 19 - }, - "wtype": { - "_type": "WType", - "name": "uint64", - "immutable": true, - "ephemeral": false, - "scalar_type": 2 + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 }, - "name": "stop" - } + "body": [ + { + "_type": "Goto", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "target": "#loop₁ᵇ" + } + ], + "label": null, + "comment": null + }, + "else_branch": null } - }, - "if_branch": { - "_type": "Block", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "body": [ - { - "_type": "Goto", - "source_location": { - "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 - }, - "target": "#loop₁ᵇ" - } - ], - "label": null, - "comment": null - }, - "else_branch": null + ], + "label": null, + "comment": null } - ], - "label": null, - "comment": null - } + }, + { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 26, + "end_line": 34, + "column": 4, + "end_column": 22 + }, + "body": [], + "label": "#loop₁ᵇ", + "comment": null + } + ], + "label": null, + "comment": null }, { - "_type": "Block", + "_type": "ReturnStatement", "source_location": { "file": "tests/approvals/do-loops.algo.ts", - "line": 6, - "end_line": 8, - "column": 2, - "end_column": 20 + "line": 35, + "end_line": 35, + "column": 4, + "end_column": 16 }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null + "value": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 35, + "end_line": 35, + "column": 11, + "end_column": 16 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "total" + } } ], "label": null, "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": null, + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "testDoContinue", + "arc4_method_config": { + "_type": "ARC4ABIMethodConfig", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 23, + "end_line": 23, + "column": 2, + "end_column": 43 + }, + "allowed_completion_types": [ + 0 + ], + "create": 3, + "name": "testDoContinue", + "readonly": false, + "default_args": {} + } + }, + { + "_type": "ContractMethod", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 4, + "end_line": 4, + "column": 0, + "end_column": 43 + }, + "args": [], + "return_type": { + "_type": "WType", + "name": "void", + "immutable": true, + "ephemeral": false, + "scalar_type": null + }, + "body": { + "_type": "Block", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 4, + "end_line": 4, + "column": 0, + "end_column": 43 + }, + "body": [], + "label": null, + "comment": null + }, + "documentation": { + "_type": "MethodDocumentation", + "description": "Implicitly generated create method", + "args": {}, + "returns": null + }, + "inline": null, + "cref": "tests/approvals/do-loops.algo.ts::DoLoopsAlgo", + "member_name": "__algots__.defaultCreate", + "arc4_method_config": { + "_type": "ARC4BareMethodConfig", + "source_location": { + "file": "tests/approvals/do-loops.algo.ts", + "line": 4, + "end_line": 4, + "column": 0, + "end_column": 43 + }, + "allowed_completion_types": [ + 0 + ], + "create": 2 } - ], - "label": null, - "comment": null - }, - "documentation": { - "_type": "MethodDocumentation", - "description": null, - "args": {}, - "returns": null + } + ], + "app_state": [], + "state_totals": { + "_type": "StateTotals", + "global_uints": null, + "local_uints": null, + "global_bytes": null, + "local_bytes": null }, - "inline": null, - "id": "tests/approvals/do-loops.algo.ts::test_do", - "name": "test_do" + "reserved_scratch_space": [], + "avm_version": null } ] \ No newline at end of file diff --git a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.approval.teal b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.approval.teal index 553ebc55c..f200f8da2 100644 --- a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.approval.teal +++ b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.approval.teal @@ -212,28 +212,25 @@ test_for_loop_while_top@1: frame_dig 1 frame_dig -2 < - bz test_for_loop_after_while@4 + bz test_for_loop_after_while@3 test_for_loop_while_body@2: // tests/approvals/for-loops.algo.ts:8 // total += i frame_dig 0 frame_dig 1 + dup + cover 2 + frame_bury 0 - -test_for_loop_block@3: // tests/approvals/for-loops.algo.ts:7 // for (let i = start; i < stop; i += step) { - frame_dig 1 frame_dig -1 + frame_bury 1 b test_for_loop_while_top@1 -test_for_loop_after_while@4: - -test_for_loop_block@5: +test_for_loop_after_while@3: // tests/approvals/for-loops.algo.ts:10 // return total retsub @@ -257,7 +254,7 @@ test_for_loop_break_while_top@1: frame_dig 1 frame_dig -2 < - bz test_for_loop_break_after_while@6 + bz test_for_loop_break_after_while@5 test_for_loop_break_while_body@2: // tests/approvals/for-loops.algo.ts:16 @@ -275,14 +272,12 @@ test_for_loop_break_while_body@2: test_for_loop_break_if_body@3: -test_for_loop_break_block@7: +test_for_loop_break_block@6: // tests/approvals/for-loops.algo.ts:21 // return total retsub test_for_loop_break_after_if_else@4: - -test_for_loop_break_block@5: // tests/approvals/for-loops.algo.ts:15 // for (let i = start; i < stop; i += step) { frame_dig 1 @@ -291,8 +286,8 @@ test_for_loop_break_block@5: frame_bury 1 b test_for_loop_break_while_top@1 -test_for_loop_break_after_while@6: - b test_for_loop_break_block@7 +test_for_loop_break_after_while@5: + b test_for_loop_break_block@6 // tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continue(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -346,8 +341,6 @@ test_for_loop_continue_after_if_else@4: b test_for_loop_continue_block@5 test_for_loop_continue_after_while@6: - -test_for_loop_continue_block@7: // tests/approvals/for-loops.algo.ts:30 // return total retsub @@ -372,7 +365,7 @@ test_for_loop_labelled_while_top@1: frame_dig 2 frame_dig -2 < - bz test_for_loop_labelled_after_while@11 + bz test_for_loop_labelled_after_while@8 test_for_loop_labelled_while_body@2: // tests/approvals/for-loops.algo.ts:35 @@ -386,27 +379,30 @@ test_for_loop_labelled_while_top@3: frame_dig 0 frame_dig -2 < - bz test_for_loop_labelled_after_while@8 + bz test_for_loop_labelled_after_while@7 test_for_loop_labelled_while_body@4: // tests/approvals/for-loops.algo.ts:36 - // total += j + j + // total += i + j + frame_dig 2 + dup frame_dig 0 dup - dig 1 + cover 3 + frame_dig 1 + frame_bury 1 // tests/approvals/for-loops.algo.ts:38 - // if (j === start) break outer - frame_dig -3 - == + // if (i * j > stop) break outer + * + frame_dig -2 + > bz test_for_loop_labelled_after_if_else@6 test_for_loop_labelled_if_body@5: -test_for_loop_labelled_block@12: +test_for_loop_labelled_block@9: // tests/approvals/for-loops.algo.ts:41 // return total frame_dig 1 @@ -414,8 +410,6 @@ test_for_loop_labelled_block@12: retsub test_for_loop_labelled_after_if_else@6: - -test_for_loop_labelled_block@7: // tests/approvals/for-loops.algo.ts:35 // for (let j = start; j < stop; j += step) { frame_dig 0 @@ -424,11 +418,7 @@ test_for_loop_labelled_block@7: frame_bury 0 b test_for_loop_labelled_while_top@3 -test_for_loop_labelled_after_while@8: - -test_for_loop_labelled_block@9: - -test_for_loop_labelled_block@10: +test_for_loop_labelled_after_while@7: // tests/approvals/for-loops.algo.ts:34 // outer: for (let i = start; i < stop; i += step) { frame_dig 2 @@ -437,8 +427,8 @@ test_for_loop_labelled_block@10: frame_bury 2 b test_for_loop_labelled_while_top@1 -test_for_loop_labelled_after_while@11: - b test_for_loop_labelled_block@12 +test_for_loop_labelled_after_while@8: + b test_for_loop_labelled_block@9 // tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__algots__.defaultCreate() -> void: diff --git a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.arc32.json b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.arc32.json index 35fa977c0..8064390c6 100644 --- a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.arc32.json +++ b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.arc32.json @@ -22,7 +22,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKCm1haW5fYmxvY2tAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A5CgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgcHVzaGJ5dGVzIDB4Zjg2NTRmNzMgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9sb29wKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweDI4N2Y0YzAyIC8vIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9icmVhayh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBwdXNoYnl0ZXMgMHg0YmQ3Nzc4YyAvLyBtZXRob2QgInRlc3RfZm9yX2xvb3BfY29udGludWUodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgcHVzaGJ5dGVzIDB4MzM2NzVlMDYgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHVuY292ZXIgNAogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9sb29wX2JyZWFrX3JvdXRlQDQgbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDUgbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDYKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEA3OgoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDg6CgptYWluX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNDoKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE0CgptYWluX3Rlc3RfZm9yX2xvb3BfY29udGludWVfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTQKCm1haW5fdGVzdF9mb3JfbG9vcF9icmVha19yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3BfYnJlYWsKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNAoKbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3AKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNAoKbWFpbl9iYXJlX3JvdXRpbmdAOToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgbWF0Y2ggbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTAKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEAxMToKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEAxMjoKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDEzCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgID09CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBjYWxsc3ViIF9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE0CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF93aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfYWZ0ZXJfd2hpbGVANAoKdGVzdF9mb3JfbG9vcF93aGlsZV9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OAogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKCnRlc3RfZm9yX2xvb3BfYmxvY2tAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2FmdGVyX3doaWxlQDQ6Cgp0ZXN0X2Zvcl9sb29wX2Jsb2NrQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTAKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2JyZWFrOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNAogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE1CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF9icmVha193aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2JyZWFrX2FmdGVyX3doaWxlQDYKCnRlc3RfZm9yX2xvb3BfYnJlYWtfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE2CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIGlmICh0b3RhbCA+IDEwKSB7CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICA+CiAgICBieiB0ZXN0X2Zvcl9sb29wX2JyZWFrX2FmdGVyX2lmX2Vsc2VANAoKdGVzdF9mb3JfbG9vcF9icmVha19pZl9ib2R5QDM6Cgp0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgp0ZXN0X2Zvcl9sb29wX2JyZWFrX2FmdGVyX2lmX2Vsc2VANDoKCnRlc3RfZm9yX2xvb3BfYnJlYWtfYmxvY2tANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGVzdF9mb3JfbG9vcF9icmVha193aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9icmVha19hZnRlcl93aGlsZUA2OgogICAgYiB0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDcKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby50ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX2xvb3BfY29udGludWU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjQKICAgIC8vIHRlc3RfZm9yX2xvb3BfY29udGludWUoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI1CiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjYKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfY29udGludWVfYWZ0ZXJfd2hpbGVANgoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV93aGlsZV9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGlmIChpICUgNSA9PT0gMCkgY29udGludWUKICAgIGZyYW1lX2RpZyAxCiAgICBwdXNoaW50IDUgLy8gNQogICAgJQogICAgaW50Y18wIC8vIDAKICAgID09CiAgICBieiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX2lmX2Vsc2VANAoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV9pZl9ib2R5QDM6Cgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2Jsb2NrQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjYKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3RfZm9yX2xvb3BfY29udGludWVfd2hpbGVfdG9wQDEKCnRlc3RfZm9yX2xvb3BfY29udGludWVfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2Jsb2NrQDUKCnRlc3RfZm9yX2xvb3BfY29udGludWVfYWZ0ZXJfd2hpbGVANjoKCnRlc3RfZm9yX2xvb3BfY29udGludWVfYmxvY2tANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozMAogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby50ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX2xvb3BfbGFiZWxsZWQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHByb3RvIDMgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzMKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNAogICAgLy8gb3V0ZXI6IGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyBvdXRlcjogZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX3doaWxlQDExCgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3doaWxlX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2J1cnkgMAoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX3doaWxlQDgKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfYm9keUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM2CiAgICAvLyB0b3RhbCArPSBqICsgagogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozOAogICAgLy8gaWYgKGogPT09IHN0YXJ0KSBicmVhayBvdXRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYnogdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl9pZl9lbHNlQDYKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfaWZfYm9keUA1OgoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9ibG9ja0AxMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYWZ0ZXJfaWZfZWxzZUA2OgoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9ibG9ja0A3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyBmb3IgKGxldCBqID0gc3RhcnQ7IGogPCBzdG9wOyBqICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3doaWxlX3RvcEAzCgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX3doaWxlQDg6Cgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2Jsb2NrQDk6Cgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2Jsb2NrQDEwOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyBvdXRlcjogZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUAxMToKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9ibG9ja0AxMgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZSgpIC0+IHZvaWQ6Cl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZToKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKCm1haW5fYmxvY2tAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A5CgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgcHVzaGJ5dGVzIDB4Zjg2NTRmNzMgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9sb29wKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweDI4N2Y0YzAyIC8vIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9icmVhayh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBwdXNoYnl0ZXMgMHg0YmQ3Nzc4YyAvLyBtZXRob2QgInRlc3RfZm9yX2xvb3BfY29udGludWUodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgcHVzaGJ5dGVzIDB4MzM2NzVlMDYgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHVuY292ZXIgNAogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9sb29wX2JyZWFrX3JvdXRlQDQgbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDUgbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDYKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEA3OgoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDg6CgptYWluX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNDoKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE0CgptYWluX3Rlc3RfZm9yX2xvb3BfY29udGludWVfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTQKCm1haW5fdGVzdF9mb3JfbG9vcF9icmVha19yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3BfYnJlYWsKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNAoKbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3AKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNAoKbWFpbl9iYXJlX3JvdXRpbmdAOToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgbWF0Y2ggbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTAKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEAxMToKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEAxMjoKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDEzCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgID09CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBjYWxsc3ViIF9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE0CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF93aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfYWZ0ZXJfd2hpbGVAMwoKdGVzdF9mb3JfbG9vcF93aGlsZV9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OAogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGVzdF9mb3JfbG9vcF93aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9hZnRlcl93aGlsZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLnRlc3RfZm9yX2xvb3BfYnJlYWsoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdF9mb3JfbG9vcF9icmVhazoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTQKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgLTMKCnRlc3RfZm9yX2xvb3BfYnJlYWtfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTUKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMgogICAgPAogICAgYnogdGVzdF9mb3JfbG9vcF9icmVha19hZnRlcl93aGlsZUA1Cgp0ZXN0X2Zvcl9sb29wX2JyZWFrX3doaWxlX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNgogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyBpZiAodG90YWwgPiAxMCkgewogICAgcHVzaGludCAxMCAvLyAxMAogICAgPgogICAgYnogdGVzdF9mb3JfbG9vcF9icmVha19hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX2xvb3BfYnJlYWtfaWZfYm9keUAzOgoKdGVzdF9mb3JfbG9vcF9icmVha19ibG9ja0A2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjIxCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKdGVzdF9mb3JfbG9vcF9icmVha19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTUKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3RfZm9yX2xvb3BfYnJlYWtfd2hpbGVfdG9wQDEKCnRlc3RfZm9yX2xvb3BfYnJlYWtfYWZ0ZXJfd2hpbGVANToKICAgIGIgdGVzdF9mb3JfbG9vcF9icmVha19ibG9ja0A2CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI0CiAgICAvLyB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNQogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV93aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNgogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX3doaWxlQDYKCnRlc3RfZm9yX2xvb3BfY29udGludWVfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBpZiAoaSAlIDUgPT09IDApIGNvbnRpbnVlCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCA1IC8vIDUKICAgICUKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYnogdGVzdF9mb3JfbG9vcF9jb250aW51ZV9hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX2xvb3BfY29udGludWVfaWZfYm9keUAzOgoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV9ibG9ja0A1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyOAogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgdGVzdF9mb3JfbG9vcF9jb250aW51ZV9ibG9ja0A1Cgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX3doaWxlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzAKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzQKICAgIC8vIG91dGVyOiBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNAogICAgLy8gb3V0ZXI6IGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAtMgogICAgPAogICAgYnogdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUA4Cgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3doaWxlX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2J1cnkgMAoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX3doaWxlQDcKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfYm9keUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM2CiAgICAvLyB0b3RhbCArPSBpICsgagogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM4CiAgICAvLyBpZiAoaSAqIGogPiBzdG9wKSBicmVhayBvdXRlcgogICAgKgogICAgZnJhbWVfZGlnIC0yCiAgICA+CiAgICBieiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX2lmX2Vsc2VANgoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9pZl9ib2R5QDU6Cgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2Jsb2NrQDk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NDEKICAgIC8vIHJldHVybiB0b3RhbAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMwoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUA3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyBvdXRlcjogZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUA4OgogICAgYiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2Jsb2NrQDkKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX2FsZ290c19fLmRlZmF1bHRDcmVhdGUoKSAtPiB2b2lkOgpfX2FsZ290c19fLmRlZmF1bHRDcmVhdGU6CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.arc56.json b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.arc56.json index c2f2a3007..9c1248ae5 100644 --- a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.arc56.json +++ b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.arc56.json @@ -188,11 +188,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKCm1haW5fYmxvY2tAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A5CgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgcHVzaGJ5dGVzIDB4Zjg2NTRmNzMgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9sb29wKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweDI4N2Y0YzAyIC8vIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9icmVhayh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBwdXNoYnl0ZXMgMHg0YmQ3Nzc4YyAvLyBtZXRob2QgInRlc3RfZm9yX2xvb3BfY29udGludWUodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgcHVzaGJ5dGVzIDB4MzM2NzVlMDYgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHVuY292ZXIgNAogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9sb29wX2JyZWFrX3JvdXRlQDQgbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDUgbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDYKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEA3OgoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDg6CgptYWluX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNDoKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE0CgptYWluX3Rlc3RfZm9yX2xvb3BfY29udGludWVfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTQKCm1haW5fdGVzdF9mb3JfbG9vcF9icmVha19yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3BfYnJlYWsKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNAoKbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3AKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNAoKbWFpbl9iYXJlX3JvdXRpbmdAOToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgbWF0Y2ggbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTAKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEAxMToKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEAxMjoKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDEzCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgID09CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBjYWxsc3ViIF9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE0CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF93aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfYWZ0ZXJfd2hpbGVANAoKdGVzdF9mb3JfbG9vcF93aGlsZV9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OAogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKCnRlc3RfZm9yX2xvb3BfYmxvY2tAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2FmdGVyX3doaWxlQDQ6Cgp0ZXN0X2Zvcl9sb29wX2Jsb2NrQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTAKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2JyZWFrOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNAogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE1CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF9icmVha193aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2JyZWFrX2FmdGVyX3doaWxlQDYKCnRlc3RfZm9yX2xvb3BfYnJlYWtfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE2CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIGlmICh0b3RhbCA+IDEwKSB7CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICA+CiAgICBieiB0ZXN0X2Zvcl9sb29wX2JyZWFrX2FmdGVyX2lmX2Vsc2VANAoKdGVzdF9mb3JfbG9vcF9icmVha19pZl9ib2R5QDM6Cgp0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgp0ZXN0X2Zvcl9sb29wX2JyZWFrX2FmdGVyX2lmX2Vsc2VANDoKCnRlc3RfZm9yX2xvb3BfYnJlYWtfYmxvY2tANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGVzdF9mb3JfbG9vcF9icmVha193aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9icmVha19hZnRlcl93aGlsZUA2OgogICAgYiB0ZXN0X2Zvcl9sb29wX2JyZWFrX2Jsb2NrQDcKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby50ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX2xvb3BfY29udGludWU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjQKICAgIC8vIHRlc3RfZm9yX2xvb3BfY29udGludWUoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI1CiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjYKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfY29udGludWVfYWZ0ZXJfd2hpbGVANgoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV93aGlsZV9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGlmIChpICUgNSA9PT0gMCkgY29udGludWUKICAgIGZyYW1lX2RpZyAxCiAgICBwdXNoaW50IDUgLy8gNQogICAgJQogICAgaW50Y18wIC8vIDAKICAgID09CiAgICBieiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX2lmX2Vsc2VANAoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV9pZl9ib2R5QDM6Cgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2Jsb2NrQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MjYKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3RfZm9yX2xvb3BfY29udGludWVfd2hpbGVfdG9wQDEKCnRlc3RfZm9yX2xvb3BfY29udGludWVfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyB0b3RhbCArPSBpCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2Jsb2NrQDUKCnRlc3RfZm9yX2xvb3BfY29udGludWVfYWZ0ZXJfd2hpbGVANjoKCnRlc3RfZm9yX2xvb3BfY29udGludWVfYmxvY2tANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozMAogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby50ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX2xvb3BfbGFiZWxsZWQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHByb3RvIDMgMQogICAgcHVzaGJ5dGVzICIiCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzMKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNAogICAgLy8gb3V0ZXI6IGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIC0zCgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyBvdXRlcjogZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX3doaWxlQDExCgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3doaWxlX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2J1cnkgMAoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX3doaWxlQDgKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfYm9keUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM2CiAgICAvLyB0b3RhbCArPSBqICsgagogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgZGlnIDEKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozOAogICAgLy8gaWYgKGogPT09IHN0YXJ0KSBicmVhayBvdXRlcgogICAgZnJhbWVfZGlnIC0zCiAgICA9PQogICAgYnogdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl9pZl9lbHNlQDYKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfaWZfYm9keUA1OgoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9ibG9ja0AxMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfYWZ0ZXJfaWZfZWxzZUA2OgoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9ibG9ja0A3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyBmb3IgKGxldCBqID0gc3RhcnQ7IGogPCBzdG9wOyBqICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3doaWxlX3RvcEAzCgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX3doaWxlQDg6Cgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2Jsb2NrQDk6Cgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2Jsb2NrQDEwOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyBvdXRlcjogZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUAxMToKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9ibG9ja0AxMgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZSgpIC0+IHZvaWQ6Cl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZToKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUKCm1haW5fYmxvY2tAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A5CgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgcHVzaGJ5dGVzIDB4Zjg2NTRmNzMgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9sb29wKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweDI4N2Y0YzAyIC8vIG1ldGhvZCAidGVzdF9mb3JfbG9vcF9icmVhayh1aW50NjQsdWludDY0LHVpbnQ2NCl1aW50NjQiCiAgICBwdXNoYnl0ZXMgMHg0YmQ3Nzc4YyAvLyBtZXRob2QgInRlc3RfZm9yX2xvb3BfY29udGludWUodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgcHVzaGJ5dGVzIDB4MzM2NzVlMDYgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHVpbnQ2NCx1aW50NjQsdWludDY0KXVpbnQ2NCIKICAgIHVuY292ZXIgNAogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9sb29wX2JyZWFrX3JvdXRlQDQgbWFpbl90ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3JvdXRlQDUgbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDYKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEA3OgoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDg6CgptYWluX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNDoKICAgIHJldHVybgoKbWFpbl90ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3JvdXRlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzIKICAgIC8vIHRlc3RfZm9yX2xvb3BfbGFiZWxsZWQoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE0CgptYWluX3Rlc3RfZm9yX2xvb3BfY29udGludWVfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNAogICAgLy8gdGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTQKCm1haW5fdGVzdF9mb3JfbG9vcF9icmVha19yb3V0ZUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRm9yTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEzCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2JyZWFrKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3BfYnJlYWsKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNAoKbWFpbl90ZXN0X2Zvcl9sb29wX3JvdXRlQDM6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NQogICAgLy8gdGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIEZvckxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo1CiAgICAvLyB0ZXN0X2Zvcl9sb29wKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX2xvb3AKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNAoKbWFpbl9iYXJlX3JvdXRpbmdAOToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgbWF0Y2ggbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTAKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEAxMToKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEAxMjoKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDEzCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBGb3JMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgID09CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBjYWxsc3ViIF9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE0CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHRlc3RfZm9yX2xvb3Aoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF93aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo3CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX2xvb3BfYWZ0ZXJfd2hpbGVAMwoKdGVzdF9mb3JfbG9vcF93aGlsZV9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OAogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGVzdF9mb3JfbG9vcF93aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9hZnRlcl93aGlsZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czo6Rm9yTG9vcHNBbGdvLnRlc3RfZm9yX2xvb3BfYnJlYWsoc3RhcnQ6IHVpbnQ2NCwgc3RvcDogdWludDY0LCBzdGVwOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdF9mb3JfbG9vcF9icmVhazoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxMwogICAgLy8gdGVzdF9mb3JfbG9vcF9icmVhayhzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgewogICAgcHJvdG8gMyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTQKICAgIC8vIGxldCB0b3RhbCA9IFVpbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNQogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgLTMKCnRlc3RfZm9yX2xvb3BfYnJlYWtfd2hpbGVfdG9wQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTUKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMgogICAgPAogICAgYnogdGVzdF9mb3JfbG9vcF9icmVha19hZnRlcl93aGlsZUA1Cgp0ZXN0X2Zvcl9sb29wX2JyZWFrX3doaWxlX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoxNgogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjE3CiAgICAvLyBpZiAodG90YWwgPiAxMCkgewogICAgcHVzaGludCAxMCAvLyAxMAogICAgPgogICAgYnogdGVzdF9mb3JfbG9vcF9icmVha19hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX2xvb3BfYnJlYWtfaWZfYm9keUAzOgoKdGVzdF9mb3JfbG9vcF9icmVha19ibG9ja0A2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjIxCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKdGVzdF9mb3JfbG9vcF9icmVha19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MTUKICAgIC8vIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAtMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3RfZm9yX2xvb3BfYnJlYWtfd2hpbGVfdG9wQDEKCnRlc3RfZm9yX2xvb3BfYnJlYWtfYWZ0ZXJfd2hpbGVANToKICAgIGIgdGVzdF9mb3JfbG9vcF9icmVha19ibG9ja0A2CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9jb250aW51ZShzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI0CiAgICAvLyB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNQogICAgLy8gbGV0IHRvdGFsID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV93aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyNgogICAgLy8gZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX3doaWxlQDYKCnRlc3RfZm9yX2xvb3BfY29udGludWVfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBpZiAoaSAlIDUgPT09IDApIGNvbnRpbnVlCiAgICBmcmFtZV9kaWcgMQogICAgcHVzaGludCA1IC8vIDUKICAgICUKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYnogdGVzdF9mb3JfbG9vcF9jb250aW51ZV9hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX2xvb3BfY29udGludWVfaWZfYm9keUAzOgoKdGVzdF9mb3JfbG9vcF9jb250aW51ZV9ibG9ja0A1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX3doaWxlX3RvcEAxCgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czoyOAogICAgLy8gdG90YWwgKz0gaQogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgdGVzdF9mb3JfbG9vcF9jb250aW51ZV9ibG9ja0A1Cgp0ZXN0X2Zvcl9sb29wX2NvbnRpbnVlX2FmdGVyX3doaWxlQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzAKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjpGb3JMb29wc0FsZ28udGVzdF9mb3JfbG9vcF9sYWJlbGxlZChzdGFydDogdWludDY0LCBzdG9wOiB1aW50NjQsIHN0ZXA6IHVpbnQ2NCkgLT4gdWludDY0Ogp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkKHN0YXJ0OiB1aW50NjQsIHN0b3A6IHVpbnQ2NCwgc3RlcDogdWludDY0KSB7CiAgICBwcm90byAzIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjMzCiAgICAvLyBsZXQgdG90YWwgPSBVaW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6MzQKICAgIC8vIG91dGVyOiBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IHN0ZXApIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNAogICAgLy8gb3V0ZXI6IGZvciAobGV0IGkgPSBzdGFydDsgaSA8IHN0b3A7IGkgKz0gc3RlcCkgewogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAtMgogICAgPAogICAgYnogdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUA4Cgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX3doaWxlX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2J1cnkgMAoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0yCiAgICA8CiAgICBieiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX3doaWxlQDcKCnRlc3RfZm9yX2xvb3BfbGFiZWxsZWRfd2hpbGVfYm9keUA0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM2CiAgICAvLyB0b3RhbCArPSBpICsgagogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgKwogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM4CiAgICAvLyBpZiAoaSAqIGogPiBzdG9wKSBicmVhayBvdXRlcgogICAgKgogICAgZnJhbWVfZGlnIC0yCiAgICA+CiAgICBieiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX2lmX2Vsc2VANgoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9pZl9ib2R5QDU6Cgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2Jsb2NrQDk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6NDEKICAgIC8vIHJldHVybiB0b3RhbAogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3ItbG9vcHMuYWxnby50czozNQogICAgLy8gZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDwgc3RvcDsgaiArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMwoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUA3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1sb29wcy5hbGdvLnRzOjM0CiAgICAvLyBvdXRlcjogZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBzdGVwKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF93aGlsZV90b3BAMQoKdGVzdF9mb3JfbG9vcF9sYWJlbGxlZF9hZnRlcl93aGlsZUA4OgogICAgYiB0ZXN0X2Zvcl9sb29wX2xhYmVsbGVkX2Jsb2NrQDkKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLWxvb3BzLmFsZ28udHM6OkZvckxvb3BzQWxnby5fX2FsZ290c19fLmRlZmF1bHRDcmVhdGUoKSAtPiB2b2lkOgpfX2FsZ290c19fLmRlZmF1bHRDcmVhdGU6CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CiACAAEmAQQVH3x1MRsiE0EAyTYaAIAE+GVPc4AEKH9MAoAES9d3jIAEM2deBk8EjgQAegBSACoAAiJDMRkiEkQxGCITRDYaARc2GgIXNhoDF08CTwJPAogBDxYoTFCwI0L/1zEZIhJEMRgiE0Q2GgEXNhoCFzYaAxdPAk8CTwKIALoWKExQsCNC/68xGSISRDEYIhNENhoBFzYaAhc2GgMXTwJPAk8CiABoFihMULAjQv+HMRkiEkQxGCITRDYaARc2GgIXNhoDF08CTwJPAogAIBYoTFCwI0L/XzEZIkyOAQADQv9TMRgiEkSIAMQjQv9IigMBIov9iwGL/gxBABGLAIsBCIwAiwGL/wiMAUL/54mKAwEii/2LAYv+DEEAGYsAiwEISYwAgQoNQQABiYsBi/8IjAFC/99C//KKAwEii/2LAYv+DEEAHosBgQUYIhJBAAqLAYv/CIwBQv/kiwCLAQiMAEL/7ImKAwGAACKL/YsCi/4MQQA2i/2MAIsAi/4MQQAgiwBJSwEIiwEIjAGL/RJBAAWLAYwAiYsAi/8IjABC/9iLAov/CIwCQv/CQv/kiQ==", + "approval": "CiACAAEmAQQVH3x1MRsiE0EAyTYaAIAE+GVPc4AEKH9MAoAES9d3jIAEM2deBk8EjgQAegBSACoAAiJDMRkiEkQxGCITRDYaARc2GgIXNhoDF08CTwJPAogBEBYoTFCwI0L/1zEZIhJEMRgiE0Q2GgEXNhoCFzYaAxdPAk8CTwKIALsWKExQsCNC/68xGSISRDEYIhNENhoBFzYaAhc2GgMXTwJPAk8CiABpFihMULAjQv+HMRkiEkQxGCITRDYaARc2GgIXNhoDF08CTwJPAogAIBYoTFCwI0L/XzEZIkyOAQADQv9TMRgiEkSIAMkjQv9IigMBIov9iwGL/gxBABKLAIsBSU4CCIwAi/8IjAFC/+aJigMBIov9iwGL/gxBABmLAIsBCEmMAIEKDUEAAYmLAYv/CIwBQv/fQv/yigMBIov9iwGL/gxBAB6LAYEFGCISQQAKiwGL/wiMAUL/5IsAiwEIjABC/+yJigMBgAAii/2LAov+DEEAOov9jACLAIv+DEEAJIsCSYsASU4DCIsBCIwBC4v+DUEABYsBjACJiwCL/wiMAEL/1IsCi/8IjAJC/75C/+SJ", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir index 81d570a21..4e49d3d8c 100644 --- a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir +++ b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.0.ssa.ir @@ -109,19 +109,15 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop(start: let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@3) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let total#2: uint64 = (+ total#1 i#1) - goto block@3 - block@3: // L7 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@4: // after_while_L7 - goto block@5 - block@5: // L7 + block@3: // after_while_L7 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -130,26 +126,24 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(s let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L15 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@5) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@6 + goto tmp%0#0 ? block@2 : block@5 block@2: // while_body_L15 let total#2: uint64 = (+ total#1 i#1) let tmp%1#0: bool = (> total#2 10u) goto tmp%1#0 ? block@3 : block@4 block@3: // if_body_L17 - goto block@7 + goto block@6 block@4: // after_if_else_L17 - goto block@5 - block@5: // L15 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@6: // after_while_L15 - goto block@7 - block@7: // L15 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@6) - return total#4 + block@5: // after_while_L15 + goto block@6 + block@6: // L15 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@5) + return total#3 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continue(start: uint64, stop: uint64, step: uint64) -> uint64: block@0: // L24 @@ -175,8 +169,6 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continu let i#3: uint64 = (+ i#1 step#0) goto block@1 block@6: // after_while_L26 - goto block@7 - block@7: // L26 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelled(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -185,42 +177,37 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelle let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L34 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@10) - let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@10) + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@7) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@11 + goto tmp%0#0 ? block@2 : block@8 block@2: // while_body_L34 let j#0: uint64 = start#0 goto block@3 block@3: // while_top_L35 - let j#1: uint64 = φ(j#0 <- block@2, j#3 <- block@7) - let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@7) + let j#1: uint64 = φ(j#0 <- block@2, j#2 <- block@6) + let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@6) let tmp%1#0: bool = (< j#1 stop#0) - goto tmp%1#0 ? block@4 : block@8 + goto tmp%1#0 ? block@4 : block@7 block@4: // while_body_L35 - let tmp%2#0: uint64 = (+ j#1 j#1) + let tmp%2#0: uint64 = (+ i#1 j#1) let total#2: uint64 = (+ total#1 tmp%2#0) - let tmp%3#0: bool = (== j#1 start#0) - goto tmp%3#0 ? block@5 : block@6 + let tmp%3#0: uint64 = (* i#1 j#1) + let tmp%4#0: bool = (> tmp%3#0 stop#0) + goto tmp%4#0 ? block@5 : block@6 block@5: // if_body_L38 - goto block@12 + goto block@9 block@6: // after_if_else_L38 - goto block@7 - block@7: // L35 - let j#3: uint64 = (+ j#1 step#0) + let j#2: uint64 = (+ j#1 step#0) goto block@3 - block@8: // after_while_L35 - goto block@9 - block@9: // L35 - goto block@10 - block@10: // L34 + block@7: // after_while_L35 let i#3: uint64 = (+ i#1 step#0) goto block@1 - block@11: // after_while_L34 - goto block@12 - block@12: // L34 - let total#6: uint64 = φ(total#2 <- block@5, total#3 <- block@11) - return total#6 + block@8: // after_while_L34 + goto block@9 + block@9: // L34 + let total#4: uint64 = φ(total#2 <- block@5, total#3 <- block@8) + return total#4 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__algots__.defaultCreate() -> void: block@0: // L4 diff --git a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir index f38af809b..d4e1dfc23 100644 --- a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir +++ b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.1.ssa.array.ir @@ -115,19 +115,15 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop(start: let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@3) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let total#2: uint64 = (+ total#1 i#1) - goto block@3 - block@3: // L7 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@4: // after_while_L7 - goto block@5 - block@5: // L7 + block@3: // after_while_L7 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -136,26 +132,24 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(s let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L15 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@5) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@6 + goto tmp%0#0 ? block@2 : block@5 block@2: // while_body_L15 let total#2: uint64 = (+ total#1 i#1) let tmp%1#0: bool = (> total#2 10u) goto tmp%1#0 ? block@3 : block@4 block@3: // if_body_L17 - goto block@7 + goto block@6 block@4: // after_if_else_L17 - goto block@5 - block@5: // L15 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@6: // after_while_L15 - goto block@7 - block@7: // L15 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@6) - return total#4 + block@5: // after_while_L15 + goto block@6 + block@6: // L15 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@5) + return total#3 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continue(start: uint64, stop: uint64, step: uint64) -> uint64: block@0: // L24 @@ -181,8 +175,6 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continu let i#3: uint64 = (+ i#1 step#0) goto block@1 block@6: // after_while_L26 - goto block@7 - block@7: // L26 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelled(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -191,42 +183,37 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelle let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L34 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@10) - let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@10) + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@7) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@11 + goto tmp%0#0 ? block@2 : block@8 block@2: // while_body_L34 let j#0: uint64 = start#0 goto block@3 block@3: // while_top_L35 - let j#1: uint64 = φ(j#0 <- block@2, j#3 <- block@7) - let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@7) + let j#1: uint64 = φ(j#0 <- block@2, j#2 <- block@6) + let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@6) let tmp%1#0: bool = (< j#1 stop#0) - goto tmp%1#0 ? block@4 : block@8 + goto tmp%1#0 ? block@4 : block@7 block@4: // while_body_L35 - let tmp%2#0: uint64 = (+ j#1 j#1) + let tmp%2#0: uint64 = (+ i#1 j#1) let total#2: uint64 = (+ total#1 tmp%2#0) - let tmp%3#0: bool = (== j#1 start#0) - goto tmp%3#0 ? block@5 : block@6 + let tmp%3#0: uint64 = (* i#1 j#1) + let tmp%4#0: bool = (> tmp%3#0 stop#0) + goto tmp%4#0 ? block@5 : block@6 block@5: // if_body_L38 - goto block@12 + goto block@9 block@6: // after_if_else_L38 - goto block@7 - block@7: // L35 - let j#3: uint64 = (+ j#1 step#0) + let j#2: uint64 = (+ j#1 step#0) goto block@3 - block@8: // after_while_L35 - goto block@9 - block@9: // L35 - goto block@10 - block@10: // L34 + block@7: // after_while_L35 let i#3: uint64 = (+ i#1 step#0) goto block@1 - block@11: // after_while_L34 - goto block@12 - block@12: // L34 - let total#6: uint64 = φ(total#2 <- block@5, total#3 <- block@11) - return total#6 + block@8: // after_while_L34 + goto block@9 + block@9: // L34 + let total#4: uint64 = φ(total#2 <- block@5, total#3 <- block@8) + return total#4 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__algots__.defaultCreate() -> void: block@0: // L4 diff --git a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir index f38af809b..d4e1dfc23 100644 --- a/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir +++ b/tests/approvals/out/unoptimized/for-loops/ForLoopsAlgo.ir/ForLoopsAlgo.approval.2.ssa.slot.ir @@ -115,19 +115,15 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop(start: let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@3) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let total#2: uint64 = (+ total#1 i#1) - goto block@3 - block@3: // L7 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@4: // after_while_L7 - goto block@5 - block@5: // L7 + block@3: // after_while_L7 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -136,26 +132,24 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_break(s let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L15 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@5) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@4) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@4) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@6 + goto tmp%0#0 ? block@2 : block@5 block@2: // while_body_L15 let total#2: uint64 = (+ total#1 i#1) let tmp%1#0: bool = (> total#2 10u) goto tmp%1#0 ? block@3 : block@4 block@3: // if_body_L17 - goto block@7 + goto block@6 block@4: // after_if_else_L17 - goto block@5 - block@5: // L15 - let i#3: uint64 = (+ i#1 step#0) + let i#2: uint64 = (+ i#1 step#0) goto block@1 - block@6: // after_while_L15 - goto block@7 - block@7: // L15 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@6) - return total#4 + block@5: // after_while_L15 + goto block@6 + block@6: // L15 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@5) + return total#3 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continue(start: uint64, stop: uint64, step: uint64) -> uint64: block@0: // L24 @@ -181,8 +175,6 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_continu let i#3: uint64 = (+ i#1 step#0) goto block@1 block@6: // after_while_L26 - goto block@7 - block@7: // L26 return total#1 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelled(start: uint64, stop: uint64, step: uint64) -> uint64: @@ -191,42 +183,37 @@ subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.test_for_loop_labelle let i#0: uint64 = start#0 goto block@1 block@1: // while_top_L34 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@10) - let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@10) + let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@7) + let total#3: uint64 = φ(total#0 <- block@0, total#1 <- block@7) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@11 + goto tmp%0#0 ? block@2 : block@8 block@2: // while_body_L34 let j#0: uint64 = start#0 goto block@3 block@3: // while_top_L35 - let j#1: uint64 = φ(j#0 <- block@2, j#3 <- block@7) - let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@7) + let j#1: uint64 = φ(j#0 <- block@2, j#2 <- block@6) + let total#1: uint64 = φ(total#3 <- block@2, total#2 <- block@6) let tmp%1#0: bool = (< j#1 stop#0) - goto tmp%1#0 ? block@4 : block@8 + goto tmp%1#0 ? block@4 : block@7 block@4: // while_body_L35 - let tmp%2#0: uint64 = (+ j#1 j#1) + let tmp%2#0: uint64 = (+ i#1 j#1) let total#2: uint64 = (+ total#1 tmp%2#0) - let tmp%3#0: bool = (== j#1 start#0) - goto tmp%3#0 ? block@5 : block@6 + let tmp%3#0: uint64 = (* i#1 j#1) + let tmp%4#0: bool = (> tmp%3#0 stop#0) + goto tmp%4#0 ? block@5 : block@6 block@5: // if_body_L38 - goto block@12 + goto block@9 block@6: // after_if_else_L38 - goto block@7 - block@7: // L35 - let j#3: uint64 = (+ j#1 step#0) + let j#2: uint64 = (+ j#1 step#0) goto block@3 - block@8: // after_while_L35 - goto block@9 - block@9: // L35 - goto block@10 - block@10: // L34 + block@7: // after_while_L35 let i#3: uint64 = (+ i#1 step#0) goto block@1 - block@11: // after_while_L34 - goto block@12 - block@12: // L34 - let total#6: uint64 = φ(total#2 <- block@5, total#3 <- block@11) - return total#6 + block@8: // after_while_L34 + goto block@9 + block@9: // L34 + let total#4: uint64 = φ(total#2 <- block@5, total#3 <- block@8) + return total#4 subroutine tests/approvals/for-loops.algo.ts::ForLoopsAlgo.__algots__.defaultCreate() -> void: block@0: // L4 diff --git a/tests/approvals/out/unoptimized/for-loops/for-loops.awst b/tests/approvals/out/unoptimized/for-loops/for-loops.awst index bc7bac843..615b14884 100644 --- a/tests/approvals/out/unoptimized/for-loops/for-loops.awst +++ b/tests/approvals/out/unoptimized/for-loops/for-loops.awst @@ -16,10 +16,8 @@ contract ForLoopsAlgo i: uint64 = start while (i < stop) { total: uint64 = total + i - #loop₁ᶜ: i: uint64 = i + step } - #loop₁ᵇ: return total } @@ -32,7 +30,6 @@ contract ForLoopsAlgo if (total > 10) { goto #loop₁ᵇ } - #loop₁ᶜ: i: uint64 = i + step } #loop₁ᵇ: @@ -51,7 +48,6 @@ contract ForLoopsAlgo #loop₁ᶜ: i: uint64 = i + step } - #loop₁ᵇ: return total } @@ -62,15 +58,12 @@ contract ForLoopsAlgo while (i < stop) { j: uint64 = start while (j < stop) { - total: uint64 = total + j + j - if (j == start) { + total: uint64 = total + i + j + if (i * j > stop) { goto outer₁ᵇ } - #loop₁ᶜ: j: uint64 = j + step } - #loop₁ᵇ: - outer₁ᶜ: i: uint64 = i + step } outer₁ᵇ: diff --git a/tests/approvals/out/unoptimized/for-loops/for-loops.awst.json b/tests/approvals/out/unoptimized/for-loops/for-loops.awst.json index b6894a1d1..ad319f754 100644 --- a/tests/approvals/out/unoptimized/for-loops/for-loops.awst.json +++ b/tests/approvals/out/unoptimized/for-loops/for-loops.awst.json @@ -507,19 +507,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { @@ -607,19 +594,6 @@ "comment": null } }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 7, - "end_line": 7, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null - }, { "_type": "ReturnStatement", "source_location": { @@ -1128,19 +1102,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 15, - "end_line": 15, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { @@ -1872,19 +1833,6 @@ "comment": null } }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 26, - "end_line": 26, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null - }, { "_type": "ReturnStatement", "source_location": { @@ -2425,7 +2373,7 @@ "ephemeral": false, "scalar_type": 2 }, - "name": "j" + "name": "i" }, "op": "+", "right": { @@ -2456,7 +2404,7 @@ "line": 38, "end_line": 38, "column": 8, - "end_column": 24 + "end_column": 25 }, "condition": { "_type": "NumericComparisonExpression", @@ -2465,7 +2413,7 @@ "line": 38, "end_line": 38, "column": 12, - "end_column": 23 + "end_column": 24 }, "wtype": { "_type": "WType", @@ -2475,13 +2423,13 @@ "scalar_type": 2 }, "lhs": { - "_type": "VarExpression", + "_type": "UInt64BinaryOperation", "source_location": { "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, "column": 12, - "end_column": 13 + "end_column": 17 }, "wtype": { "_type": "WType", @@ -2490,17 +2438,53 @@ "ephemeral": false, "scalar_type": 2 }, - "name": "j" + "left": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/for-loops.algo.ts", + "line": 38, + "end_line": 38, + "column": 12, + "end_column": 13 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "i" + }, + "op": "*", + "right": { + "_type": "VarExpression", + "source_location": { + "file": "tests/approvals/for-loops.algo.ts", + "line": 38, + "end_line": 38, + "column": 16, + "end_column": 17 + }, + "wtype": { + "_type": "WType", + "name": "uint64", + "immutable": true, + "ephemeral": false, + "scalar_type": 2 + }, + "name": "j" + } }, - "operator": "==", + "operator": ">", "rhs": { "_type": "VarExpression", "source_location": { "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, - "column": 18, - "end_column": 23 + "column": 20, + "end_column": 24 }, "wtype": { "_type": "WType", @@ -2509,7 +2493,7 @@ "ephemeral": false, "scalar_type": 2 }, - "name": "start" + "name": "stop" } }, "if_branch": { @@ -2518,8 +2502,8 @@ "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, - "column": 25, - "end_column": 36 + "column": 26, + "end_column": 37 }, "body": [ { @@ -2528,8 +2512,8 @@ "file": "tests/approvals/for-loops.algo.ts", "line": 38, "end_line": 38, - "column": 25, - "end_column": 36 + "column": 26, + "end_column": 37 }, "target": "outer₁ᵇ" } @@ -2543,19 +2527,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 35, - "end_line": 35, - "column": 6, - "end_column": 46 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { @@ -2642,37 +2613,11 @@ "label": null, "comment": null } - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 35, - "end_line": 35, - "column": 6, - "end_column": 46 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null } ], "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-loops.algo.ts", - "line": 34, - "end_line": 34, - "column": 11, - "end_column": 51 - }, - "body": [], - "label": "outer₁ᶜ", - "comment": null - }, { "_type": "AssignmentStatement", "source_location": { diff --git a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.approval.teal b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.approval.teal index d384ae2d7..e65d11c59 100644 --- a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.approval.teal +++ b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.approval.teal @@ -260,25 +260,23 @@ test_for_of_loop_tuple_for_body@1: test_for_of_loop_tuple_if_body@2: -test_for_of_loop_tuple_block@9: +test_for_of_loop_tuple_block@8: // tests/approvals/for-of-loops.algo.ts:14 // return total retsub test_for_of_loop_tuple_after_if_else@3: -test_for_of_loop_tuple_block@4: - -test_for_of_loop_tuple_for_footer@5: +test_for_of_loop_tuple_for_footer@4: // tests/approvals/for-of-loops.algo.ts:10 // for (const item of items) { frame_dig 1 - switch test_for_of_loop_tuple_for_header_1@6 test_for_of_loop_tuple_for_header_2@7 + switch test_for_of_loop_tuple_for_header_1@5 test_for_of_loop_tuple_for_header_2@6 -test_for_of_loop_tuple_after_for@8: - b test_for_of_loop_tuple_block@9 +test_for_of_loop_tuple_after_for@7: + b test_for_of_loop_tuple_block@8 -test_for_of_loop_tuple_for_header_2@7: +test_for_of_loop_tuple_for_header_2@6: pushint 2 // 2 frame_bury 1 // tests/approvals/for-of-loops.algo.ts:10 @@ -286,7 +284,7 @@ test_for_of_loop_tuple_for_header_2@7: frame_dig -1 b test_for_of_loop_tuple_for_body@1 -test_for_of_loop_tuple_for_header_1@6: +test_for_of_loop_tuple_for_header_1@5: intc_2 // 1 frame_bury 1 // tests/approvals/for-of-loops.algo.ts:10 @@ -316,7 +314,7 @@ test_for_of_loop_arc4_dynamic_array_for_header@1: frame_dig 2 frame_dig 1 < - bz test_for_of_loop_arc4_dynamic_array_after_for@7 + bz test_for_of_loop_arc4_dynamic_array_after_for@6 test_for_of_loop_arc4_dynamic_array_for_body@2: // tests/approvals/for-of-loops.algo.ts:19 @@ -348,24 +346,22 @@ test_for_of_loop_arc4_dynamic_array_for_body@2: test_for_of_loop_arc4_dynamic_array_if_body@3: -test_for_of_loop_arc4_dynamic_array_block@8: +test_for_of_loop_arc4_dynamic_array_block@7: // tests/approvals/for-of-loops.algo.ts:23 // return total retsub test_for_of_loop_arc4_dynamic_array_after_if_else@4: -test_for_of_loop_arc4_dynamic_array_block@5: - -test_for_of_loop_arc4_dynamic_array_for_footer@6: +test_for_of_loop_arc4_dynamic_array_for_footer@5: frame_dig 2 intc_2 // 1 + frame_bury 2 b test_for_of_loop_arc4_dynamic_array_for_header@1 -test_for_of_loop_arc4_dynamic_array_after_for@7: - b test_for_of_loop_arc4_dynamic_array_block@8 +test_for_of_loop_arc4_dynamic_array_after_for@6: + b test_for_of_loop_arc4_dynamic_array_block@7 // tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_static_array(items: bytes) -> uint64: @@ -384,7 +380,7 @@ test_for_of_loop_arc4_static_array_for_header@1: frame_dig 1 pushint 5 // 5 < - bz test_for_of_loop_arc4_static_array_after_for@7 + bz test_for_of_loop_arc4_static_array_after_for@6 test_for_of_loop_arc4_static_array_for_body@2: // tests/approvals/for-of-loops.algo.ts:28 @@ -415,24 +411,22 @@ test_for_of_loop_arc4_static_array_for_body@2: test_for_of_loop_arc4_static_array_if_body@3: -test_for_of_loop_arc4_static_array_block@8: +test_for_of_loop_arc4_static_array_block@7: // tests/approvals/for-of-loops.algo.ts:32 // return total retsub test_for_of_loop_arc4_static_array_after_if_else@4: -test_for_of_loop_arc4_static_array_block@5: - -test_for_of_loop_arc4_static_array_for_footer@6: +test_for_of_loop_arc4_static_array_for_footer@5: frame_dig 1 intc_2 // 1 + frame_bury 1 b test_for_of_loop_arc4_static_array_for_header@1 -test_for_of_loop_arc4_static_array_after_for@7: - b test_for_of_loop_arc4_static_array_block@8 +test_for_of_loop_arc4_static_array_after_for@6: + b test_for_of_loop_arc4_static_array_block@7 // tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_immutable_array(items: bytes) -> uint64: @@ -456,7 +450,7 @@ test_for_of_loop_native_immutable_array_for_header@1: frame_dig 2 frame_dig 1 < - bz test_for_of_loop_native_immutable_array_after_for@7 + bz test_for_of_loop_native_immutable_array_after_for@6 test_for_of_loop_native_immutable_array_for_body@2: // tests/approvals/for-of-loops.algo.ts:37 @@ -485,24 +479,22 @@ test_for_of_loop_native_immutable_array_for_body@2: test_for_of_loop_native_immutable_array_if_body@3: -test_for_of_loop_native_immutable_array_block@8: +test_for_of_loop_native_immutable_array_block@7: // tests/approvals/for-of-loops.algo.ts:41 // return total retsub test_for_of_loop_native_immutable_array_after_if_else@4: -test_for_of_loop_native_immutable_array_block@5: - -test_for_of_loop_native_immutable_array_for_footer@6: +test_for_of_loop_native_immutable_array_for_footer@5: frame_dig 2 intc_2 // 1 + frame_bury 2 b test_for_of_loop_native_immutable_array_for_header@1 -test_for_of_loop_native_immutable_array_after_for@7: - b test_for_of_loop_native_immutable_array_block@8 +test_for_of_loop_native_immutable_array_after_for@6: + b test_for_of_loop_native_immutable_array_block@7 // tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_mutable_array(items.0: uint64, items.1: uint64, items.2: uint64) -> uint64: @@ -563,7 +555,7 @@ test_for_of_loop_native_mutable_array_for_header@1: frame_dig 3 frame_dig 2 < - bz test_for_of_loop_native_mutable_array_after_for@7 + bz test_for_of_loop_native_mutable_array_after_for@6 test_for_of_loop_native_mutable_array_for_body@2: // tests/approvals/for-of-loops.algo.ts:47 @@ -595,7 +587,7 @@ test_for_of_loop_native_mutable_array_for_body@2: test_for_of_loop_native_mutable_array_if_body@3: -test_for_of_loop_native_mutable_array_block@8: +test_for_of_loop_native_mutable_array_block@7: // tests/approvals/for-of-loops.algo.ts:51 // return total frame_dig 1 @@ -604,17 +596,15 @@ test_for_of_loop_native_mutable_array_block@8: test_for_of_loop_native_mutable_array_after_if_else@4: -test_for_of_loop_native_mutable_array_block@5: - -test_for_of_loop_native_mutable_array_for_footer@6: +test_for_of_loop_native_mutable_array_for_footer@5: frame_dig 3 intc_2 // 1 + frame_bury 3 b test_for_of_loop_native_mutable_array_for_header@1 -test_for_of_loop_native_mutable_array_after_for@7: - b test_for_of_loop_native_mutable_array_block@8 +test_for_of_loop_native_mutable_array_after_for@6: + b test_for_of_loop_native_mutable_array_block@7 // tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__algots__.defaultCreate() -> void: diff --git a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.arc32.json b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.arc32.json index 2d564ced6..e1a5f3b96 100644 --- a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.arc32.json +++ b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.arc32.json @@ -27,7 +27,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEgNDIKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweAogICAgcHVzaGJ5dGVzIDB4N2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgc3RvcmUgMAoKbWFpbl9ibG9ja0AxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDEwCgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgcHVzaGJ5dGVzIDB4Y2YxZjIwYjggLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IgogICAgcHVzaGJ5dGVzIDB4OGMxNmVlODcgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheSh1aW50NjRbXSl1aW50NjQiCiAgICBwdXNoYnl0ZXMgMHhiMmM3NTNiZiAvLyBtZXRob2QgInRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkodWludDY0WzVdKXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweGQxYjViZWVlIC8vIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweGExY2MwZDk0IC8vIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheSgodWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKICAgIHVuY292ZXIgNQogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9yb3V0ZUA0IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9yb3V0ZUA1IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X3JvdXRlQDYgbWFpbl90ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X3JvdXRlQDcKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEA4OgoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDk6CgptYWluX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1OgogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfcm91dGVANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZHVwCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IEFycmF5PHVpbnQ2ND4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgY2FsbHN1YiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjYKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkoaXRlbXM6IFN0YXRpY0FycmF5PFVpbnRONjQsIDU+KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfdHVwbGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBzd2FwCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBkdXAKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNQoKbWFpbl9iYXJlX3JvdXRpbmdAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIG1hdGNoIG1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDExCgptYWluX3N3aXRjaF9jYXNlX2RlZmF1bHRAMTI6CgptYWluX3N3aXRjaF9jYXNlX25leHRAMTM6CiAgICBiIG1haW5fYWZ0ZXJfaWZfZWxzZUAxNAoKbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBfX2FsZ290c19fLmRlZmF1bHRDcmVhdGUKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zLjA6IHVpbnQ2NCwgaXRlbXMuMTogdWludDY0LCBpdGVtcy4yOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjkKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjExCiAgICAvLyB0b3RhbCArPSBpdGVtCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfaWZfZWxzZUAzCgp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2lmX2JvZHlAMjoKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYmxvY2tAOToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxNAogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfaWZfZWxzZUAzOgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9ibG9ja0A0OgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfZm9vdGVyQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTAKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDEKICAgIHN3aXRjaCB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9oZWFkZXJfMUA2IHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8yQDcKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfZm9yQDg6CiAgICBiIHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYmxvY2tAOQoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANzoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMAogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxCgp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9oZWFkZXJfMUA2OgogICAgaW50Y18yIC8vIDEKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9ib2R5QDEKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxNwogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkoaXRlbXM6IER5bmFtaWNBcnJheTxVaW50TjY0PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTgKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxOQogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Zvcl9oZWFkZXJAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxOQogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2FmdGVyX2ZvckA3Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE5CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjIwCiAgICAvLyB0b3RhbCArPSBpdGVtLm5hdGl2ZQogICAgZHVwCiAgICBidG9pCiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgID09CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2lmX2JvZHlAMzoKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Jsb2NrQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9hZnRlcl9pZl9lbHNlQDQ6Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A1OgoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXlfZm9yX2Zvb3RlckA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9hZnRlcl9mb3JANzoKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXlfYmxvY2tAOAoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo6Rm9yT2ZMb29wc0FsZ28udGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogYnl0ZXMpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAxCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9hZnRlcl9mb3JANwoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9mb3JfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjkKICAgIC8vIHRvdGFsICs9IGl0ZW0ubmF0aXZlCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozMAogICAgLy8gaWYgKGl0ZW0ubmF0aXZlID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjUKICAgIC8vIGNvbnN0IHN0b3BOdW1iZXI6IHVpbnQ2NCA9IDQyCiAgICBpbnRjXzMgLy8gNDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozMAogICAgLy8gaWYgKGl0ZW0ubmF0aXZlID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2lmX2JvZHlAMzoKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfYmxvY2tAODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozMgogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0OgoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A1OgoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9mb3JfZm9vdGVyQDY6CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9hZnRlcl9mb3JANzoKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A4CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IGJ5dGVzKSAtPiB1aW50NjQ6CnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNQogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KGl0ZW1zOiBBcnJheTx1aW50NjQ+KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNgogICAgLy8gbGV0IHRvdGFsOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM3CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Zvcl9oZWFkZXJAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9hZnRlcl9mb3JANwoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Zvcl9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzgKICAgIC8vIHRvdGFsICs9IGl0ZW0KICAgIGZyYW1lX2RpZyAwCiAgICBkaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NQogICAgLy8gY29uc3Qgc3RvcE51bWJlcjogdWludDY0ID0gNDIKICAgIGludGNfMyAvLyA0MgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM5CiAgICAvLyBpZiAoaXRlbSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgID09CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfaWZfYm9keUAzOgoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Jsb2NrQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDEKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0OgoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Jsb2NrQDU6Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2Zvb3RlckA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2FmdGVyX2ZvckA3OgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tAOAoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo6Rm9yT2ZMb29wc0FsZ28udGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtcy4wOiB1aW50NjQsIGl0ZW1zLjE6IHVpbnQ2NCwgaXRlbXMuMjogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ1CiAgICAvLyBjb25zdCBtdXRhYmxlID0gbmV3IE11dGFibGVBcnJheSguLi5pdGVtcykKICAgIGJ5dGVjXzEgLy8gMHgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ0CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5KGl0ZW1zOiBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDUKICAgIC8vIGNvbnN0IG11dGFibGUgPSBuZXcgTXV0YWJsZUFycmF5KC4uLml0ZW1zKQogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHN0b3JlcwogICAgZHVwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDYKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIG11dGFibGUpIHsKICAgIGxvYWRzCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfZm9yQDcKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfZm9yX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIG11dGFibGUpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBsb2FkcwogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0OAogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDEKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDkKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2lmX2JvZHlAMzoKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYmxvY2tAODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0OgoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9ibG9ja0A1OgoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfZm9vdGVyQDY6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9hZnRlcl9mb3JANzoKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9ibG9ja0A4CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby5fX2FsZ290c19fLmRlZmF1bHRDcmVhdGUoKSAtPiB2b2lkOgpfX2FsZ290c19fLmRlZmF1bHRDcmVhdGU6CiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIubWVtLm5ld19zbG90KCkgLT4gdWludDY0OgpfcHV5YV9saWIubWVtLm5ld19zbG90OgogICAgbG9hZCAwCiAgICBiaXRsZW4KICAgIGxvYWQgMAogICAgcHVzaGludCAyNTYgLy8gMjU2CiAgICBkaWcgMgogICAgLQogICAgaW50Y18wIC8vIDAKICAgIHNldGJpdCAvLyBvbiBlcnJvcjogbm8gYXZhaWxhYmxlIHNsb3RzCiAgICBzdG9yZSAwCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEgNDIKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweAogICAgcHVzaGJ5dGVzIDB4N2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgc3RvcmUgMAoKbWFpbl9ibG9ja0AxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDEwCgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgcHVzaGJ5dGVzIDB4Y2YxZjIwYjggLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IgogICAgcHVzaGJ5dGVzIDB4OGMxNmVlODcgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheSh1aW50NjRbXSl1aW50NjQiCiAgICBwdXNoYnl0ZXMgMHhiMmM3NTNiZiAvLyBtZXRob2QgInRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkodWludDY0WzVdKXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweGQxYjViZWVlIC8vIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweGExY2MwZDk0IC8vIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheSgodWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKICAgIHVuY292ZXIgNQogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9yb3V0ZUA0IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9yb3V0ZUA1IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X3JvdXRlQDYgbWFpbl90ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X3JvdXRlQDcKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEA4OgoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDk6CgptYWluX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1OgogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfcm91dGVANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZHVwCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IEFycmF5PHVpbnQ2ND4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgY2FsbHN1YiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjYKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkoaXRlbXM6IFN0YXRpY0FycmF5PFVpbnRONjQsIDU+KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfdHVwbGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBzd2FwCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBkdXAKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNQoKbWFpbl9iYXJlX3JvdXRpbmdAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIG1hdGNoIG1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDExCgptYWluX3N3aXRjaF9jYXNlX2RlZmF1bHRAMTI6CgptYWluX3N3aXRjaF9jYXNlX25leHRAMTM6CiAgICBiIG1haW5fYWZ0ZXJfaWZfZWxzZUAxNAoKbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBfX2FsZ290c19fLmRlZmF1bHRDcmVhdGUKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zLjA6IHVpbnQ2NCwgaXRlbXMuMTogdWludDY0LCBpdGVtcy4yOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjkKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjExCiAgICAvLyB0b3RhbCArPSBpdGVtCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfaWZfZWxzZUAzCgp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2lmX2JvZHlAMjoKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYmxvY2tAODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxNAogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfaWZfZWxzZUAzOgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfZm9vdGVyQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTAKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDEKICAgIHN3aXRjaCB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9oZWFkZXJfMUA1IHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8yQDYKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfZm9yQDc6CiAgICBiIHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYmxvY2tAOAoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANjoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMAogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxCgp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9oZWFkZXJfMUA1OgogICAgaW50Y18yIC8vIDEKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9ib2R5QDEKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxNwogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkoaXRlbXM6IER5bmFtaWNBcnJheTxVaW50TjY0PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTgKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxOQogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Zvcl9oZWFkZXJAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxOQogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2FmdGVyX2ZvckA2Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE5CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjIwCiAgICAvLyB0b3RhbCArPSBpdGVtLm5hdGl2ZQogICAgZHVwCiAgICBidG9pCiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgID09CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2lmX2JvZHlAMzoKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Jsb2NrQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9hZnRlcl9pZl9lbHNlQDQ6Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfZm9vdGVyQDU6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfaGVhZGVyQDEKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2FmdGVyX2ZvckA2OgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A3CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBTdGF0aWNBcnJheTxVaW50TjY0LCA1PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2FmdGVyX2ZvckA2Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Zvcl9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyOQogICAgLy8gdG90YWwgKz0gaXRlbS5uYXRpdmUKICAgIGR1cAogICAgYnRvaQogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjMwCiAgICAvLyBpZiAoaXRlbS5uYXRpdmUgPT09IHN0b3BOdW1iZXIpIGJyZWFrCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NQogICAgLy8gY29uc3Qgc3RvcE51bWJlcjogdWludDY0ID0gNDIKICAgIGludGNfMyAvLyA0MgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjMwCiAgICAvLyBpZiAoaXRlbS5uYXRpdmUgPT09IHN0b3BOdW1iZXIpIGJyZWFrCiAgICA9PQogICAgYnogdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfaWZfYm9keUAzOgoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9hZnRlcl9pZl9lbHNlQDQ6Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Zvcl9mb290ZXJANToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2FmdGVyX2ZvckA2OgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Jsb2NrQDcKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogYnl0ZXMpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IEFycmF5PHVpbnQ2ND4pIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM2CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM3CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2FmdGVyX2ZvckA2Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozOAogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDAKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzkKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9pZl9ib2R5QDM6Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9hZnRlcl9pZl9lbHNlQDQ6Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2Zvb3RlckA1OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2FmdGVyX2ZvckA2OgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tANwoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo6Rm9yT2ZMb29wc0FsZ28udGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtcy4wOiB1aW50NjQsIGl0ZW1zLjE6IHVpbnQ2NCwgaXRlbXMuMjogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ1CiAgICAvLyBjb25zdCBtdXRhYmxlID0gbmV3IE11dGFibGVBcnJheSguLi5pdGVtcykKICAgIGJ5dGVjXzEgLy8gMHgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ0CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5KGl0ZW1zOiBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDUKICAgIC8vIGNvbnN0IG11dGFibGUgPSBuZXcgTXV0YWJsZUFycmF5KC4uLml0ZW1zKQogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHN0b3JlcwogICAgZHVwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDYKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIG11dGFibGUpIHsKICAgIGxvYWRzCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfZm9yQDYKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfZm9yX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIG11dGFibGUpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBsb2FkcwogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0OAogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDEKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDkKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2lmX2JvZHlAMzoKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYmxvY2tANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0OgoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfZm9vdGVyQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9hZnRlcl9mb3JANjoKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9ibG9ja0A3CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby5fX2FsZ290c19fLmRlZmF1bHRDcmVhdGUoKSAtPiB2b2lkOgpfX2FsZ290c19fLmRlZmF1bHRDcmVhdGU6CiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIubWVtLm5ld19zbG90KCkgLT4gdWludDY0OgpfcHV5YV9saWIubWVtLm5ld19zbG90OgogICAgbG9hZCAwCiAgICBiaXRsZW4KICAgIGxvYWQgMAogICAgcHVzaGludCAyNTYgLy8gMjU2CiAgICBkaWcgMgogICAgLQogICAgaW50Y18wIC8vIDAKICAgIHNldGJpdCAvLyBvbiBlcnJvcjogbm8gYXZhaWxhYmxlIHNsb3RzCiAgICBzdG9yZSAwCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.arc56.json b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.arc56.json index bb7f84bba..b56da1c71 100644 --- a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.arc56.json +++ b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.arc56.json @@ -199,7 +199,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEgNDIKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweAogICAgcHVzaGJ5dGVzIDB4N2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgc3RvcmUgMAoKbWFpbl9ibG9ja0AxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDEwCgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgcHVzaGJ5dGVzIDB4Y2YxZjIwYjggLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IgogICAgcHVzaGJ5dGVzIDB4OGMxNmVlODcgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheSh1aW50NjRbXSl1aW50NjQiCiAgICBwdXNoYnl0ZXMgMHhiMmM3NTNiZiAvLyBtZXRob2QgInRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkodWludDY0WzVdKXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweGQxYjViZWVlIC8vIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweGExY2MwZDk0IC8vIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheSgodWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKICAgIHVuY292ZXIgNQogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9yb3V0ZUA0IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9yb3V0ZUA1IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X3JvdXRlQDYgbWFpbl90ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X3JvdXRlQDcKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEA4OgoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDk6CgptYWluX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1OgogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfcm91dGVANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZHVwCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IEFycmF5PHVpbnQ2ND4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgY2FsbHN1YiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjYKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkoaXRlbXM6IFN0YXRpY0FycmF5PFVpbnRONjQsIDU+KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfdHVwbGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBzd2FwCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBkdXAKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNQoKbWFpbl9iYXJlX3JvdXRpbmdAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIG1hdGNoIG1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDExCgptYWluX3N3aXRjaF9jYXNlX2RlZmF1bHRAMTI6CgptYWluX3N3aXRjaF9jYXNlX25leHRAMTM6CiAgICBiIG1haW5fYWZ0ZXJfaWZfZWxzZUAxNAoKbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBfX2FsZ290c19fLmRlZmF1bHRDcmVhdGUKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zLjA6IHVpbnQ2NCwgaXRlbXMuMTogdWludDY0LCBpdGVtcy4yOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjkKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjExCiAgICAvLyB0b3RhbCArPSBpdGVtCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfaWZfZWxzZUAzCgp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2lmX2JvZHlAMjoKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYmxvY2tAOToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxNAogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfaWZfZWxzZUAzOgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9ibG9ja0A0OgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfZm9vdGVyQDU6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTAKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDEKICAgIHN3aXRjaCB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9oZWFkZXJfMUA2IHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8yQDcKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfZm9yQDg6CiAgICBiIHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYmxvY2tAOQoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANzoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMAogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxCgp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9oZWFkZXJfMUA2OgogICAgaW50Y18yIC8vIDEKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9ib2R5QDEKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxNwogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkoaXRlbXM6IER5bmFtaWNBcnJheTxVaW50TjY0PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTgKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxOQogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Zvcl9oZWFkZXJAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxOQogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2FmdGVyX2ZvckA3Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE5CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjIwCiAgICAvLyB0b3RhbCArPSBpdGVtLm5hdGl2ZQogICAgZHVwCiAgICBidG9pCiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgID09CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2lmX2JvZHlAMzoKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Jsb2NrQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9hZnRlcl9pZl9lbHNlQDQ6Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A1OgoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXlfZm9yX2Zvb3RlckA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9hZnRlcl9mb3JANzoKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXlfYmxvY2tAOAoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo6Rm9yT2ZMb29wc0FsZ28udGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogYnl0ZXMpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI3CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICBkdXAKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAxCiAgICBwdXNoaW50IDUgLy8gNQogICAgPAogICAgYnogdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9hZnRlcl9mb3JANwoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9mb3JfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI4CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjkKICAgIC8vIHRvdGFsICs9IGl0ZW0ubmF0aXZlCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozMAogICAgLy8gaWYgKGl0ZW0ubmF0aXZlID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjUKICAgIC8vIGNvbnN0IHN0b3BOdW1iZXI6IHVpbnQ2NCA9IDQyCiAgICBpbnRjXzMgLy8gNDIKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozMAogICAgLy8gaWYgKGl0ZW0ubmF0aXZlID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2lmX2JvZHlAMzoKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfYmxvY2tAODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozMgogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0OgoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A1OgoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9mb3JfZm9vdGVyQDY6CiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9hZnRlcl9mb3JANzoKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A4CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IGJ5dGVzKSAtPiB1aW50NjQ6CnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNQogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KGl0ZW1zOiBBcnJheTx1aW50NjQ+KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNgogICAgLy8gbGV0IHRvdGFsOiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM3CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Zvcl9oZWFkZXJAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9hZnRlcl9mb3JANwoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Zvcl9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzgKICAgIC8vIHRvdGFsICs9IGl0ZW0KICAgIGZyYW1lX2RpZyAwCiAgICBkaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NQogICAgLy8gY29uc3Qgc3RvcE51bWJlcjogdWludDY0ID0gNDIKICAgIGludGNfMyAvLyA0MgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM5CiAgICAvLyBpZiAoaXRlbSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgID09CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfaWZfYm9keUAzOgoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Jsb2NrQDg6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDEKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0OgoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Jsb2NrQDU6Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2Zvb3RlckA2OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2FmdGVyX2ZvckA3OgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tAOAoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo6Rm9yT2ZMb29wc0FsZ28udGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtcy4wOiB1aW50NjQsIGl0ZW1zLjE6IHVpbnQ2NCwgaXRlbXMuMjogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ1CiAgICAvLyBjb25zdCBtdXRhYmxlID0gbmV3IE11dGFibGVBcnJheSguLi5pdGVtcykKICAgIGJ5dGVjXzEgLy8gMHgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ0CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5KGl0ZW1zOiBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDUKICAgIC8vIGNvbnN0IG11dGFibGUgPSBuZXcgTXV0YWJsZUFycmF5KC4uLml0ZW1zKQogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHN0b3JlcwogICAgZHVwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDYKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIG11dGFibGUpIHsKICAgIGxvYWRzCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfZm9yQDcKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfZm9yX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIG11dGFibGUpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBsb2FkcwogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0OAogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDEKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDkKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2lmX2JvZHlAMzoKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYmxvY2tAODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0OgoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9ibG9ja0A1OgoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfZm9vdGVyQDY6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9hZnRlcl9mb3JANzoKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9ibG9ja0A4CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby5fX2FsZ290c19fLmRlZmF1bHRDcmVhdGUoKSAtPiB2b2lkOgpfX2FsZ290c19fLmRlZmF1bHRDcmVhdGU6CiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIubWVtLm5ld19zbG90KCkgLT4gdWludDY0OgpfcHV5YV9saWIubWVtLm5ld19zbG90OgogICAgbG9hZCAwCiAgICBiaXRsZW4KICAgIGxvYWQgMAogICAgcHVzaGludCAyNTYgLy8gMjU2CiAgICBkaWcgMgogICAgLQogICAgaW50Y18wIC8vIDAKICAgIHNldGJpdCAvLyBvbiBlcnJvcjogbm8gYXZhaWxhYmxlIHNsb3RzCiAgICBzdG9yZSAwCiAgICByZXRzdWIK", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEgNDIKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweAogICAgcHVzaGJ5dGVzIDB4N2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZgogICAgc3RvcmUgMAoKbWFpbl9ibG9ja0AxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjcKICAgIC8vIGV4cG9ydCBjbGFzcyBGb3JPZkxvb3BzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDEwCgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgcHVzaGJ5dGVzIDB4Y2YxZjIwYjggLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKCh1aW50NjQsdWludDY0LHVpbnQ2NCkpdWludDY0IgogICAgcHVzaGJ5dGVzIDB4OGMxNmVlODcgLy8gbWV0aG9kICJ0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheSh1aW50NjRbXSl1aW50NjQiCiAgICBwdXNoYnl0ZXMgMHhiMmM3NTNiZiAvLyBtZXRob2QgInRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkodWludDY0WzVdKXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweGQxYjViZWVlIC8vIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5KHVpbnQ2NFtdKXVpbnQ2NCIKICAgIHB1c2hieXRlcyAweGExY2MwZDk0IC8vIG1ldGhvZCAidGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheSgodWludDY0LHVpbnQ2NCx1aW50NjQpKXVpbnQ2NCIKICAgIHVuY292ZXIgNQogICAgbWF0Y2ggbWFpbl90ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX3JvdXRlQDMgbWFpbl90ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9yb3V0ZUA0IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9yb3V0ZUA1IG1haW5fdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X3JvdXRlQDYgbWFpbl90ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X3JvdXRlQDcKCm1haW5fc3dpdGNoX2Nhc2VfZGVmYXVsdEA4OgoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDk6CgptYWluX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1OgogICAgcmV0dXJuCgptYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfcm91dGVANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgZHVwCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NAogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtczogW3VpbnQ2NCwgdWludDY0LCB1aW50NjRdKSB7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9yb3V0ZUA2OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IEFycmF5PHVpbnQ2ND4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzUKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogQXJyYXk8dWludDY0PikgewogICAgY2FsbHN1YiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfcm91dGVANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyNgogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheShpdGVtczogU3RhdGljQXJyYXk8VWludE42NCwgNT4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjYKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkoaXRlbXM6IFN0YXRpY0FycmF5PFVpbnRONjQsIDU+KSB7CiAgICBjYWxsc3ViIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X3JvdXRlQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTcKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBEeW5hbWljQXJyYXk8VWludE42ND4pIHsKICAgIGNhbGxzdWIgdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgptYWluX3Rlc3RfZm9yX29mX2xvb3BfdHVwbGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyBOb09wCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo3CiAgICAvLyBleHBvcnQgY2xhc3MgRm9yT2ZMb29wc0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBzd2FwCiAgICBkdXAKICAgIGludGNfMSAvLyA4CiAgICBkdXAKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgcHVzaGludCAxNiAvLyAxNgogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjgKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfdHVwbGUoaXRlbXM6IHJlYWRvbmx5IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxNQoKbWFpbl9iYXJlX3JvdXRpbmdAMTA6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIG1hdGNoIG1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDExCgptYWluX3N3aXRjaF9jYXNlX2RlZmF1bHRAMTI6CgptYWluX3N3aXRjaF9jYXNlX25leHRAMTM6CiAgICBiIG1haW5fYWZ0ZXJfaWZfZWxzZUAxNAoKbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVAMTE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNsYXNzIEZvck9mTG9vcHNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBfX2FsZ290c19fLmRlZmF1bHRDcmVhdGUKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDE1CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zLjA6IHVpbnQ2NCwgaXRlbXMuMTogdWludDY0LCBpdGVtcy4yOiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo4CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlKGl0ZW1zOiByZWFkb25seSBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIHByb3RvIDMgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjkKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMwoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjExCiAgICAvLyB0b3RhbCArPSBpdGVtCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTIKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfaWZfZWxzZUAzCgp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2lmX2JvZHlAMjoKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYmxvY2tAODoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxNAogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfaWZfZWxzZUAzOgoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfZm9vdGVyQDQ6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTAKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDEKICAgIHN3aXRjaCB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9oZWFkZXJfMUA1IHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfZm9yX2hlYWRlcl8yQDYKCnRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYWZ0ZXJfZm9yQDc6CiAgICBiIHRlc3RfZm9yX29mX2xvb3BfdHVwbGVfYmxvY2tAOAoKdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfaGVhZGVyXzJANjoKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxMAogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF90dXBsZV9mb3JfYm9keUAxCgp0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9oZWFkZXJfMUA1OgogICAgaW50Y18yIC8vIDEKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjEwCiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX3R1cGxlX2Zvcl9ib2R5QDEKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxNwogICAgLy8gdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X2R5bmFtaWNfYXJyYXkoaXRlbXM6IER5bmFtaWNBcnJheTxVaW50TjY0PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MTgKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxOQogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Zvcl9oZWFkZXJAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoxOQogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2FmdGVyX2ZvckA2Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjE5CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAyCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjIwCiAgICAvLyB0b3RhbCArPSBpdGVtLm5hdGl2ZQogICAgZHVwCiAgICBidG9pCiAgICBmcmFtZV9kaWcgMAogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjEKICAgIC8vIGlmIChpdGVtLm5hdGl2ZSA9PT0gc3RvcE51bWJlcikgYnJlYWsKICAgID09CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2lmX2JvZHlAMzoKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2Jsb2NrQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjMKICAgIC8vIHJldHVybiB0b3RhbAogICAgcmV0c3ViCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9hZnRlcl9pZl9lbHNlQDQ6Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfZm9vdGVyQDU6CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9mb3JfaGVhZGVyQDEKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9keW5hbWljX2FycmF5X2FmdGVyX2ZvckA2OgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfZHluYW1pY19hcnJheV9ibG9ja0A3CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby50ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBieXRlcykgLT4gdWludDY0Ogp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjI2CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5KGl0ZW1zOiBTdGF0aWNBcnJheTxVaW50TjY0LCA1PikgewogICAgcHJvdG8gMSAxCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjcKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIDEKICAgIHB1c2hpbnQgNSAvLyA1CiAgICA8CiAgICBieiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2FmdGVyX2ZvckA2Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Zvcl9ib2R5QDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MjgKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMQogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czoyOQogICAgLy8gdG90YWwgKz0gaXRlbS5uYXRpdmUKICAgIGR1cAogICAgYnRvaQogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjMwCiAgICAvLyBpZiAoaXRlbS5uYXRpdmUgPT09IHN0b3BOdW1iZXIpIGJyZWFrCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NQogICAgLy8gY29uc3Qgc3RvcE51bWJlcjogdWludDY0ID0gNDIKICAgIGludGNfMyAvLyA0MgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjMwCiAgICAvLyBpZiAoaXRlbS5uYXRpdmUgPT09IHN0b3BOdW1iZXIpIGJyZWFrCiAgICA9PQogICAgYnogdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfaWZfYm9keUAzOgoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9ibG9ja0A3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjMyCiAgICAvLyByZXR1cm4gdG90YWwKICAgIHJldHN1YgoKdGVzdF9mb3Jfb2ZfbG9vcF9hcmM0X3N0YXRpY19hcnJheV9hZnRlcl9pZl9lbHNlQDQ6Cgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Zvcl9mb290ZXJANToKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3RfZm9yX29mX2xvb3BfYXJjNF9zdGF0aWNfYXJyYXlfZm9yX2hlYWRlckAxCgp0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2FmdGVyX2ZvckA2OgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX2FyYzRfc3RhdGljX2FycmF5X2Jsb2NrQDcKCgovLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6OkZvck9mTG9vcHNBbGdvLnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheShpdGVtczogYnl0ZXMpIC0+IHVpbnQ2NDoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM1CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXkoaXRlbXM6IEFycmF5PHVpbnQ2ND4pIHsKICAgIHByb3RvIDEgMQogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM2CiAgICAvLyBsZXQgdG90YWw6IHVpbnQ2NCA9IDAKICAgIGludGNfMCAvLyAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykgewogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2hlYWRlckAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjM3CiAgICAvLyBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2FmdGVyX2ZvckA2Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozNwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czozOAogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDAKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6MzkKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9hZnRlcl9pZl9lbHNlQDQKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9pZl9ib2R5QDM6Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX2ltbXV0YWJsZV9hcnJheV9hZnRlcl9pZl9lbHNlQDQ6Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfZm9yX2Zvb3RlckA1OgogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfaW1tdXRhYmxlX2FycmF5X2FmdGVyX2ZvckA2OgogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9pbW11dGFibGVfYXJyYXlfYmxvY2tANwoKCi8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo6Rm9yT2ZMb29wc0FsZ28udGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheShpdGVtcy4wOiB1aW50NjQsIGl0ZW1zLjE6IHVpbnQ2NCwgaXRlbXMuMjogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXk6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ1CiAgICAvLyBjb25zdCBtdXRhYmxlID0gbmV3IE11dGFibGVBcnJheSguLi5pdGVtcykKICAgIGJ5dGVjXzEgLy8gMHgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjQ0CiAgICAvLyB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5KGl0ZW1zOiBbdWludDY0LCB1aW50NjQsIHVpbnQ2NF0pIHsKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgYnl0ZWNfMSAvLyAweAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDUKICAgIC8vIGNvbnN0IG11dGFibGUgPSBuZXcgTXV0YWJsZUFycmF5KC4uLml0ZW1zKQogICAgY29uY2F0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDQKICAgIC8vIHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXkoaXRlbXM6IFt1aW50NjQsIHVpbnQ2NCwgdWludDY0XSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBieXRlY18xIC8vIDB4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NQogICAgLy8gY29uc3QgbXV0YWJsZSA9IG5ldyBNdXRhYmxlQXJyYXkoLi4uaXRlbXMpCiAgICBjb25jYXQKICAgIGNhbGxzdWIgX3B1eWFfbGliLm1lbS5uZXdfc2xvdAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIHN0b3JlcwogICAgZHVwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDYKICAgIC8vIGxldCB0b3RhbDogdWludDY0ID0gMAogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIG11dGFibGUpIHsKICAgIGxvYWRzCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBpbnRjXzAgLy8gMAoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfaGVhZGVyQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDcKICAgIC8vIGZvciAoY29uc3QgaXRlbSBvZiBtdXRhYmxlKSB7CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfZm9yQDYKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfZm9yX2JvZHlAMjoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0NwogICAgLy8gZm9yIChjb25zdCBpdGVtIG9mIG11dGFibGUpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBsb2FkcwogICAgZnJhbWVfZGlnIDMKICAgIGludGNfMSAvLyA4CiAgICAqCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMKICAgIGludGNfMCAvLyAwCiAgICBpbnRjXzEgLy8gOAogICAgZXh0cmFjdDMKICAgIGJ0b2kKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo0OAogICAgLy8gdG90YWwgKz0gaXRlbQogICAgZnJhbWVfZGlnIDEKICAgIGRpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1CiAgICAvLyBjb25zdCBzdG9wTnVtYmVyOiB1aW50NjQgPSA0MgogICAgaW50Y18zIC8vIDQyCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvZm9yLW9mLWxvb3BzLmFsZ28udHM6NDkKICAgIC8vIGlmIChpdGVtID09PSBzdG9wTnVtYmVyKSBicmVhawogICAgPT0KICAgIGJ6IHRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0Cgp0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2lmX2JvZHlAMzoKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYmxvY2tANzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9mb3Itb2YtbG9vcHMuYWxnby50czo1MQogICAgLy8gcmV0dXJuIHRvdGFsCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnRlc3RfZm9yX29mX2xvb3BfbmF0aXZlX211dGFibGVfYXJyYXlfYWZ0ZXJfaWZfZWxzZUA0OgoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9mb3JfZm9vdGVyQDU6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiB0ZXN0X2Zvcl9vZl9sb29wX25hdGl2ZV9tdXRhYmxlX2FycmF5X2Zvcl9oZWFkZXJAMQoKdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9hZnRlcl9mb3JANjoKICAgIGIgdGVzdF9mb3Jfb2ZfbG9vcF9uYXRpdmVfbXV0YWJsZV9hcnJheV9ibG9ja0A3CgoKLy8gdGVzdHMvYXBwcm92YWxzL2Zvci1vZi1sb29wcy5hbGdvLnRzOjpGb3JPZkxvb3BzQWxnby5fX2FsZ290c19fLmRlZmF1bHRDcmVhdGUoKSAtPiB2b2lkOgpfX2FsZ290c19fLmRlZmF1bHRDcmVhdGU6CiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIubWVtLm5ld19zbG90KCkgLT4gdWludDY0OgpfcHV5YV9saWIubWVtLm5ld19zbG90OgogICAgbG9hZCAwCiAgICBiaXRsZW4KICAgIGxvYWQgMAogICAgcHVzaGludCAyNTYgLy8gMjU2CiAgICBkaWcgMgogICAgLQogICAgaW50Y18wIC8vIDAKICAgIHNldGJpdCAvLyBvbiBlcnJvcjogbm8gYXZhaWxhYmxlIHNsb3RzCiAgICBzdG9yZSAwCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { diff --git a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir index 7c65aacf1..0a670fd69 100644 --- a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir +++ b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.0.ssa.ir @@ -115,31 +115,29 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item#0: uint64 = items.0#0 goto block@1 block@1: // for_body_L10 - let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@6, loop_counter%0#3 <- block@7) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6, total#2 <- block@7) - let item#1: uint64 = φ(item#0 <- block@0, item#2 <- block@6, item#3 <- block@7) + let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@5, loop_counter%0#3 <- block@6) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5, total#2 <- block@6) + let item#1: uint64 = φ(item#0 <- block@0, item#2 <- block@5, item#3 <- block@6) let total#2: uint64 = (+ total#1 item#1) let tmp%0#0: bool = (== item#1 42u) goto tmp%0#0 ? block@2 : block@3 block@2: // if_body_L12 - goto block@9 + goto block@8 block@3: // after_if_else_L12 goto block@4 - block@4: // L10 - goto block@5 - block@5: // for_footer_L10 - goto_nth [block@6, block@7][loop_counter%0#1] else goto block@8 - block@6: // for_header_1_L10 + block@4: // for_footer_L10 + goto_nth [block@5, block@6][loop_counter%0#1] else goto block@7 + block@5: // for_header_1_L10 let loop_counter%0#2: uint64 = 1u let item#2: uint64 = items.1#0 goto block@1 - block@7: // for_header_2_L10 + block@6: // for_header_2_L10 let loop_counter%0#3: uint64 = 2u let item#3: uint64 = items.2#0 goto block@1 - block@8: // after_for_L10 - goto block@9 - block@9: // L10 + block@7: // after_for_L10 + goto block@8 + block@8: // L10 return total#2 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_dynamic_array(items: bytes) -> uint64: @@ -150,10 +148,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L19 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L19 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -164,19 +162,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%1#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L21 - goto block@8 + goto block@7 block@4: // after_if_else_L21 goto block@5 - block@5: // L19 - goto block@6 - block@6: // for_footer_L19 + block@5: // for_footer_L19 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L19 - goto block@8 - block@8: // L19 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L19 + goto block@7 + block@7: // L19 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_static_array(items: bytes[40]) -> uint64: block@0: // L26 @@ -186,10 +182,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L28 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L28 let array_head_and_tail%0#0: bytes[40] = items#0 let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -200,19 +196,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%1#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L30 - goto block@8 + goto block@7 block@4: // after_if_else_L30 goto block@5 - block@5: // L28 - goto block@6 - block@6: // for_footer_L28 + block@5: // for_footer_L28 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L28 - goto block@8 - block@8: // L28 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L28 + goto block@7 + block@7: // L28 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_immutable_array(items: uint64[]) -> uint64: block@0: // L35 @@ -222,10 +216,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L37 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L37 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -235,19 +229,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L39 - goto block@8 + goto block@7 block@4: // after_if_else_L39 goto block@5 - block@5: // L37 - goto block@6 - block@6: // for_footer_L37 + block@5: // for_footer_L37 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L37 - goto block@8 - block@8: // L37 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L37 + goto block@7 + block@7: // L37 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_mutable_array(items.0: uint64, items.1: uint64, items.2: uint64) -> uint64: block@0: // L44 @@ -262,10 +254,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let reverse_index_internal%0#0: uint64 = array_length%0#0 goto block@1 block@1: // for_header_L47 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L47 let slot_contents%1#0: uint64[] = read(mutable#0) let item#0: uint64 = slot_contents%1#0[item_index_internal%0#1] @@ -273,19 +265,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L49 - goto block@8 + goto block@7 block@4: // after_if_else_L49 goto block@5 - block@5: // L47 - goto block@6 - block@6: // for_footer_L47 + block@5: // for_footer_L47 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L47 - goto block@8 - block@8: // L47 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L47 + goto block@7 + block@7: // L47 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__algots__.defaultCreate() -> void: block@0: // L7 diff --git a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir index 7025ff3e6..8c9e9fd8d 100644 --- a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir +++ b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.1.ssa.array.ir @@ -122,31 +122,29 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item#0: uint64 = items.0#0 goto block@1 block@1: // for_body_L10 - let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@6, loop_counter%0#3 <- block@7) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6, total#2 <- block@7) - let item#1: uint64 = φ(item#0 <- block@0, item#2 <- block@6, item#3 <- block@7) + let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@5, loop_counter%0#3 <- block@6) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5, total#2 <- block@6) + let item#1: uint64 = φ(item#0 <- block@0, item#2 <- block@5, item#3 <- block@6) let total#2: uint64 = (+ total#1 item#1) let tmp%0#0: bool = (== item#1 42u) goto tmp%0#0 ? block@2 : block@3 block@2: // if_body_L12 - goto block@9 + goto block@8 block@3: // after_if_else_L12 goto block@4 - block@4: // L10 - goto block@5 - block@5: // for_footer_L10 - goto_nth [block@6, block@7][loop_counter%0#1] else goto block@8 - block@6: // for_header_1_L10 + block@4: // for_footer_L10 + goto_nth [block@5, block@6][loop_counter%0#1] else goto block@7 + block@5: // for_header_1_L10 let loop_counter%0#2: uint64 = 1u let item#2: uint64 = items.1#0 goto block@1 - block@7: // for_header_2_L10 + block@6: // for_header_2_L10 let loop_counter%0#3: uint64 = 2u let item#3: uint64 = items.2#0 goto block@1 - block@8: // after_for_L10 - goto block@9 - block@9: // L10 + block@7: // after_for_L10 + goto block@8 + block@8: // L10 return total#2 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_dynamic_array(items: bytes) -> uint64: @@ -156,10 +154,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#0: uint64 = 0u goto block@1 block@1: // for_header_L19 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L19 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -170,19 +168,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%1#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L21 - goto block@8 + goto block@7 block@4: // after_if_else_L21 goto block@5 - block@5: // L19 - goto block@6 - block@6: // for_footer_L19 + block@5: // for_footer_L19 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L19 - goto block@8 - block@8: // L19 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L19 + goto block@7 + block@7: // L19 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_static_array(items: bytes[40]) -> uint64: block@0: // L26 @@ -190,10 +186,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#0: uint64 = 0u goto block@1 block@1: // for_header_L28 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 5u) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L28 let array_head_and_tail%0#0: bytes[40] = items#0 let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -204,19 +200,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%1#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L30 - goto block@8 + goto block@7 block@4: // after_if_else_L30 goto block@5 - block@5: // L28 - goto block@6 - block@6: // for_footer_L28 + block@5: // for_footer_L28 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L28 - goto block@8 - block@8: // L28 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L28 + goto block@7 + block@7: // L28 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_immutable_array(items: uint64[]) -> uint64: block@0: // L35 @@ -225,10 +219,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#0: uint64 = 0u goto block@1 block@1: // for_header_L37 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L37 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -238,19 +232,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L39 - goto block@8 + goto block@7 block@4: // after_if_else_L39 goto block@5 - block@5: // L37 - goto block@6 - block@6: // for_footer_L37 + block@5: // for_footer_L37 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L37 - goto block@8 - block@8: // L37 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L37 + goto block@7 + block@7: // L37 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_mutable_array(items.0: uint64, items.1: uint64, items.2: uint64) -> uint64: block@0: // L44 @@ -275,10 +267,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#0: uint64 = 0u goto block@1 block@1: // for_header_L47 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L47 let slot_contents%1#0: uint64[] = read(mutable#0) let array%bytes_index%0#1: uint64 = (* item_index_internal%0#1 8u) @@ -290,19 +282,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L49 - goto block@8 + goto block@7 block@4: // after_if_else_L49 goto block@5 - block@5: // L47 - goto block@6 - block@6: // for_footer_L47 + block@5: // for_footer_L47 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L47 - goto block@8 - block@8: // L47 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L47 + goto block@7 + block@7: // L47 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__algots__.defaultCreate() -> void: block@0: // L7 diff --git a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir index ed2b4047b..c396434ce 100644 --- a/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir +++ b/tests/approvals/out/unoptimized/for-of-loops/ForOfLoopsAlgo.ir/ForOfLoopsAlgo.approval.2.ssa.slot.ir @@ -123,31 +123,29 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item#0: uint64 = items.0#0 goto block@1 block@1: // for_body_L10 - let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@6, loop_counter%0#3 <- block@7) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6, total#2 <- block@7) - let item#1: uint64 = φ(item#0 <- block@0, item#2 <- block@6, item#3 <- block@7) + let loop_counter%0#1: uint64 = φ(loop_counter%0#0 <- block@0, loop_counter%0#2 <- block@5, loop_counter%0#3 <- block@6) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5, total#2 <- block@6) + let item#1: uint64 = φ(item#0 <- block@0, item#2 <- block@5, item#3 <- block@6) let total#2: uint64 = (+ total#1 item#1) let tmp%0#0: bool = (== item#1 42u) goto tmp%0#0 ? block@2 : block@3 block@2: // if_body_L12 - goto block@9 + goto block@8 block@3: // after_if_else_L12 goto block@4 - block@4: // L10 - goto block@5 - block@5: // for_footer_L10 - goto_nth [block@6, block@7][loop_counter%0#1] else goto block@8 - block@6: // for_header_1_L10 + block@4: // for_footer_L10 + goto_nth [block@5, block@6][loop_counter%0#1] else goto block@7 + block@5: // for_header_1_L10 let loop_counter%0#2: uint64 = 1u let item#2: uint64 = items.1#0 goto block@1 - block@7: // for_header_2_L10 + block@6: // for_header_2_L10 let loop_counter%0#3: uint64 = 2u let item#3: uint64 = items.2#0 goto block@1 - block@8: // after_for_L10 - goto block@9 - block@9: // L10 + block@7: // after_for_L10 + goto block@8 + block@8: // L10 return total#2 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_dynamic_array(items: bytes) -> uint64: @@ -157,10 +155,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#0: uint64 = 0u goto block@1 block@1: // for_header_L19 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L19 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -171,19 +169,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%1#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L21 - goto block@8 + goto block@7 block@4: // after_if_else_L21 goto block@5 - block@5: // L19 - goto block@6 - block@6: // for_footer_L19 + block@5: // for_footer_L19 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L19 - goto block@8 - block@8: // L19 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L19 + goto block@7 + block@7: // L19 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_arc4_static_array(items: bytes[40]) -> uint64: block@0: // L26 @@ -191,10 +187,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#0: uint64 = 0u goto block@1 block@1: // for_header_L28 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 5u) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L28 let array_head_and_tail%0#0: bytes[40] = items#0 let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -205,19 +201,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%2#0: bool = (== tmp%1#0 42u) goto tmp%2#0 ? block@3 : block@4 block@3: // if_body_L30 - goto block@8 + goto block@7 block@4: // after_if_else_L30 goto block@5 - block@5: // L28 - goto block@6 - block@6: // for_footer_L28 + block@5: // for_footer_L28 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L28 - goto block@8 - block@8: // L28 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L28 + goto block@7 + block@7: // L28 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_immutable_array(items: uint64[]) -> uint64: block@0: // L35 @@ -226,10 +220,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#0: uint64 = 0u goto block@1 block@1: // for_header_L37 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L37 let array_head_and_tail%0#0: bytes = ((extract 2 0) items#0) let item_offset%0#0: uint64 = (* item_index_internal%0#1 8u) @@ -239,19 +233,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L39 - goto block@8 + goto block@7 block@4: // after_if_else_L39 goto block@5 - block@5: // L37 - goto block@6 - block@6: // for_footer_L37 + block@5: // for_footer_L37 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L37 - goto block@8 - block@8: // L37 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L37 + goto block@7 + block@7: // L37 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop_native_mutable_array(items.0: uint64, items.1: uint64, items.2: uint64) -> uint64: block@0: // L44 @@ -276,10 +268,10 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let item_index_internal%0#0: uint64 = 0u goto block@1 block@1: // for_header_L47 - let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@6) - let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@6) + let item_index_internal%0#1: uint64 = φ(item_index_internal%0#0 <- block@0, item_index_internal%0#2 <- block@5) + let total#1: uint64 = φ(total#0 <- block@0, total#2 <- block@5) let continue_looping%0#0: bool = (< item_index_internal%0#1 array_length%0#0) - goto continue_looping%0#0 ? block@2 : block@7 + goto continue_looping%0#0 ? block@2 : block@6 block@2: // for_body_L47 let slot_contents%1#0: uint64[] = read(mutable#0) let array%bytes_index%0#1: uint64 = (* item_index_internal%0#1 8u) @@ -291,19 +283,17 @@ subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.test_for_of_loop let tmp%0#0: bool = (== item#0 42u) goto tmp%0#0 ? block@3 : block@4 block@3: // if_body_L49 - goto block@8 + goto block@7 block@4: // after_if_else_L49 goto block@5 - block@5: // L47 - goto block@6 - block@6: // for_footer_L47 + block@5: // for_footer_L47 let item_index_internal%0#2: uint64 = (+ item_index_internal%0#1 1u) goto block@1 - block@7: // after_for_L47 - goto block@8 - block@8: // L47 - let total#4: uint64 = φ(total#2 <- block@3, total#1 <- block@7) - return total#4 + block@6: // after_for_L47 + goto block@7 + block@7: // L47 + let total#3: uint64 = φ(total#2 <- block@3, total#1 <- block@6) + return total#3 subroutine tests/approvals/for-of-loops.algo.ts::ForOfLoopsAlgo.__algots__.defaultCreate() -> void: block@0: // L7 diff --git a/tests/approvals/out/unoptimized/for-of-loops/for-of-loops.awst b/tests/approvals/out/unoptimized/for-of-loops/for-of-loops.awst index 1f8cb3e92..62b88a2d1 100644 --- a/tests/approvals/out/unoptimized/for-of-loops/for-of-loops.awst +++ b/tests/approvals/out/unoptimized/for-of-loops/for-of-loops.awst @@ -18,7 +18,6 @@ contract ForOfLoopsAlgo if (item == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -32,7 +31,6 @@ contract ForOfLoopsAlgo if (ARC4_DECODE(item) == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -46,7 +44,6 @@ contract ForOfLoopsAlgo if (ARC4_DECODE(item) == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -60,7 +57,6 @@ contract ForOfLoopsAlgo if (item == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total @@ -75,7 +71,6 @@ contract ForOfLoopsAlgo if (item == 42) { goto #loop₁ᵇ } - #loop₁ᶜ: } #loop₁ᵇ: return total diff --git a/tests/approvals/out/unoptimized/for-of-loops/for-of-loops.awst.json b/tests/approvals/out/unoptimized/for-of-loops/for-of-loops.awst.json index 5aba22a18..af7ff3ae2 100644 --- a/tests/approvals/out/unoptimized/for-of-loops/for-of-loops.awst.json +++ b/tests/approvals/out/unoptimized/for-of-loops/for-of-loops.awst.json @@ -553,19 +553,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 10, - "end_line": 10, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -1091,19 +1078,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 19, - "end_line": 19, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -1631,19 +1605,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 28, - "end_line": 28, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -2086,19 +2047,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 37, - "end_line": 37, - "column": 4, - "end_column": 29 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, @@ -2796,19 +2744,6 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/for-of-loops.algo.ts", - "line": 47, - "end_line": 47, - "column": 4, - "end_column": 31 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, diff --git a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.approval.teal b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.approval.teal index 50be71736..0c4b3be00 100644 --- a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.approval.teal +++ b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.approval.teal @@ -156,12 +156,13 @@ test_while_top@1: frame_dig 1 frame_dig -1 < - bz test_after_while@4 + bz test_after_while@3 test_while_body@2: // tests/approvals/mutable-arrays.algo.ts:9 // ma.push(i) frame_dig 1 + dup itob bytec_0 // 0x swap @@ -176,19 +177,14 @@ test_while_body@2: swap concat // on error: max array length exceeded stores - -test_block@3: // tests/approvals/mutable-arrays.algo.ts:8 // for (let i: uint64 = 0; i < length; i++) { - frame_dig 1 intc_2 // 1 + frame_bury 1 b test_while_top@1 -test_after_while@4: - -test_block@5: +test_after_while@3: // tests/approvals/mutable-arrays.algo.ts:12 // assert(ma.length === length) frame_dig 0 diff --git a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.arc32.json b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.arc32.json index 4d3261731..2645cf9c2 100644 --- a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.arc32.json +++ b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEKICAgIGJ5dGVjYmxvY2sgMHggMHgwNjgxMDEKICAgIHB1c2hieXRlcyAweDdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIHN0b3JlIDAKCm1haW5fYmxvY2tAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANgoKbWFpbl9hYmlfcm91dGluZ0AyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgTXV0YWJsZUFycmF5c0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBwdXNoYnl0ZXMgMHgyYTMzNzc3MSAvLyBtZXRob2QgInRlc3QodWludDY0KXZvaWQiCiAgICBzd2FwCiAgICBtYXRjaCBtYWluX3Rlc3Rfcm91dGVAMwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDQ6CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTE6CiAgICByZXR1cm4KCm1haW5fdGVzdF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgTXV0YWJsZUFycmF5c0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo1CiAgICAvLyB0ZXN0KGxlbmd0aDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3QKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTEKCm1haW5fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBtYXRjaCBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA3CgptYWluX3N3aXRjaF9jYXNlX2RlZmF1bHRAODoKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA5OgogICAgYiBtYWluX2FmdGVyX2lmX2Vsc2VAMTAKCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgPT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGNhbGxzdWIgX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlCiAgICBpbnRjXzIgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6Ok11dGFibGVBcnJheXNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDExCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CgplbnN1cmVfYnVkZ2V0X3doaWxlX2JvZHlAMjoKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlY18xIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWNfMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9kaWcgLTEKICAgIG1hdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX2RlZmF1bHRANToKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjpNdXRhYmxlQXJyYXlzQWxnby50ZXN0KGxlbmd0aDogdWludDY0KSAtPiB2b2lkOgp0ZXN0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo2CiAgICAvLyBlbnN1cmVCdWRnZXQoMjAwMCkKICAgIHB1c2hpbnQgMjAwMCAvLyAyMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo3CiAgICAvLyBjb25zdCBtYSA9IG5ldyBNdXRhYmxlQXJyYXk8dWludDY0PigpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgIGludGNfMCAvLyAwCgp0ZXN0X3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDQKCnRlc3Rfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OQogICAgLy8gbWEucHVzaChpKQogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsb2FkcwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzdG9yZXMKCnRlc3RfYmxvY2tAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjgKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGVzdF93aGlsZV90b3BAMQoKdGVzdF9hZnRlcl93aGlsZUA0OgoKdGVzdF9ibG9ja0A1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTIKICAgIC8vIGFzc2VydChtYS5sZW5ndGggPT09IGxlbmd0aCkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxvYWRzCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjEzCiAgICAvLyBhc3NlcnQobGVuZ3RoLCAnaGFzIGxlbmd0aCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2VydCAvLyBoYXMgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czoxNAogICAgLy8gY29uc3QgcG9wcGVkID0gbWEucG9wKCkKICAgIGR1cAogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgc3dhcAogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QzCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzCiAgICBidG9pCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTUKICAgIC8vIGFzc2VydChsZW5ndGgsICdoYXMgbGVuZ3RoJykKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXJ0IC8vIGhhcyBsZW5ndGgKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjE3CiAgICAvLyBhc3NlcnQocG9wcGVkID09PSBsZW5ndGggLSAxKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMQogICAgLQogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6Ok11dGFibGVBcnJheXNBbGdvLl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZSgpIC0+IHZvaWQ6Cl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZToKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QoKSAtPiB1aW50NjQ6Cl9wdXlhX2xpYi5tZW0ubmV3X3Nsb3Q6CiAgICBsb2FkIDAKICAgIGJpdGxlbgogICAgbG9hZCAwCiAgICBwdXNoaW50IDI1NiAvLyAyNTYKICAgIGRpZyAyCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgc2V0Yml0IC8vIG9uIGVycm9yOiBubyBhdmFpbGFibGUgc2xvdHMKICAgIHN0b3JlIDAKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEKICAgIGJ5dGVjYmxvY2sgMHggMHgwNjgxMDEKICAgIHB1c2hieXRlcyAweDdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIHN0b3JlIDAKCm1haW5fYmxvY2tAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANgoKbWFpbl9hYmlfcm91dGluZ0AyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgTXV0YWJsZUFycmF5c0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBwdXNoYnl0ZXMgMHgyYTMzNzc3MSAvLyBtZXRob2QgInRlc3QodWludDY0KXZvaWQiCiAgICBzd2FwCiAgICBtYXRjaCBtYWluX3Rlc3Rfcm91dGVAMwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDQ6CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTE6CiAgICByZXR1cm4KCm1haW5fdGVzdF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgTXV0YWJsZUFycmF5c0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo1CiAgICAvLyB0ZXN0KGxlbmd0aDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3QKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTEKCm1haW5fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBtYXRjaCBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA3CgptYWluX3N3aXRjaF9jYXNlX2RlZmF1bHRAODoKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA5OgogICAgYiBtYWluX2FmdGVyX2lmX2Vsc2VAMTAKCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgPT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGNhbGxzdWIgX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlCiAgICBpbnRjXzIgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6Ok11dGFibGVBcnJheXNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDExCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CgplbnN1cmVfYnVkZ2V0X3doaWxlX2JvZHlAMjoKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlY18xIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWNfMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9kaWcgLTEKICAgIG1hdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX2RlZmF1bHRANToKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjpNdXRhYmxlQXJyYXlzQWxnby50ZXN0KGxlbmd0aDogdWludDY0KSAtPiB2b2lkOgp0ZXN0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo2CiAgICAvLyBlbnN1cmVCdWRnZXQoMjAwMCkKICAgIHB1c2hpbnQgMjAwMCAvLyAyMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo3CiAgICAvLyBjb25zdCBtYSA9IG5ldyBNdXRhYmxlQXJyYXk8dWludDY0PigpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgIGludGNfMCAvLyAwCgp0ZXN0X3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDMKCnRlc3Rfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OQogICAgLy8gbWEucHVzaChpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxvYWRzCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3Rfd2hpbGVfdG9wQDEKCnRlc3RfYWZ0ZXJfd2hpbGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjEyCiAgICAvLyBhc3NlcnQobWEubGVuZ3RoID09PSBsZW5ndGgpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBsb2FkcwogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KGxlbmd0aCwgJ2hhcyBsZW5ndGgnKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NlcnQgLy8gaGFzIGxlbmd0aAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTQKICAgIC8vIGNvbnN0IHBvcHBlZCA9IG1hLnBvcCgpCiAgICBkdXAKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIHN3YXAKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0MwogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MwogICAgaW50Y18wIC8vIDAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MwogICAgYnRvaQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjE1CiAgICAvLyBhc3NlcnQobGVuZ3RoLCAnaGFzIGxlbmd0aCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2VydCAvLyBoYXMgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czoxNwogICAgLy8gYXNzZXJ0KHBvcHBlZCA9PT0gbGVuZ3RoIC0gMSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDEKICAgIC0KICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjpNdXRhYmxlQXJyYXlzQWxnby5fX2FsZ290c19fLmRlZmF1bHRDcmVhdGUoKSAtPiB2b2lkOgpfX2FsZ290c19fLmRlZmF1bHRDcmVhdGU6CiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIubWVtLm5ld19zbG90KCkgLT4gdWludDY0OgpfcHV5YV9saWIubWVtLm5ld19zbG90OgogICAgbG9hZCAwCiAgICBiaXRsZW4KICAgIGxvYWQgMAogICAgcHVzaGludCAyNTYgLy8gMjU2CiAgICBkaWcgMgogICAgLQogICAgaW50Y18wIC8vIDAKICAgIHNldGJpdCAvLyBvbiBlcnJvcjogbm8gYXZhaWxhYmxlIHNsb3RzCiAgICBzdG9yZSAwCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.arc56.json b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.arc56.json index 9c49e08da..7ae3d0d27 100644 --- a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.arc56.json +++ b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.arc56.json @@ -80,20 +80,20 @@ }, { "pc": [ - 240, - 274 + 239, + 273 ], "errorMessage": "has length" }, { "pc": [ - 216 + 217 ], "errorMessage": "max array length exceeded" }, { "pc": [ - 295 + 294 ], "errorMessage": "no available slots" } @@ -106,11 +106,11 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEKICAgIGJ5dGVjYmxvY2sgMHggMHgwNjgxMDEKICAgIHB1c2hieXRlcyAweDdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIHN0b3JlIDAKCm1haW5fYmxvY2tAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANgoKbWFpbl9hYmlfcm91dGluZ0AyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgTXV0YWJsZUFycmF5c0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBwdXNoYnl0ZXMgMHgyYTMzNzc3MSAvLyBtZXRob2QgInRlc3QodWludDY0KXZvaWQiCiAgICBzd2FwCiAgICBtYXRjaCBtYWluX3Rlc3Rfcm91dGVAMwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDQ6CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTE6CiAgICByZXR1cm4KCm1haW5fdGVzdF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgTXV0YWJsZUFycmF5c0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo1CiAgICAvLyB0ZXN0KGxlbmd0aDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3QKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTEKCm1haW5fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBtYXRjaCBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA3CgptYWluX3N3aXRjaF9jYXNlX2RlZmF1bHRAODoKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA5OgogICAgYiBtYWluX2FmdGVyX2lmX2Vsc2VAMTAKCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgPT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGNhbGxzdWIgX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlCiAgICBpbnRjXzIgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6Ok11dGFibGVBcnJheXNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDExCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CgplbnN1cmVfYnVkZ2V0X3doaWxlX2JvZHlAMjoKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlY18xIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWNfMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9kaWcgLTEKICAgIG1hdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX2RlZmF1bHRANToKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjpNdXRhYmxlQXJyYXlzQWxnby50ZXN0KGxlbmd0aDogdWludDY0KSAtPiB2b2lkOgp0ZXN0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo2CiAgICAvLyBlbnN1cmVCdWRnZXQoMjAwMCkKICAgIHB1c2hpbnQgMjAwMCAvLyAyMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo3CiAgICAvLyBjb25zdCBtYSA9IG5ldyBNdXRhYmxlQXJyYXk8dWludDY0PigpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgIGludGNfMCAvLyAwCgp0ZXN0X3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDQKCnRlc3Rfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OQogICAgLy8gbWEucHVzaChpKQogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsb2FkcwogICAgc3dhcAogICAgY29uY2F0IC8vIG9uIGVycm9yOiBtYXggYXJyYXkgbGVuZ3RoIGV4Y2VlZGVkCiAgICBzdG9yZXMKCnRlc3RfYmxvY2tAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjgKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgdGVzdF93aGlsZV90b3BAMQoKdGVzdF9hZnRlcl93aGlsZUA0OgoKdGVzdF9ibG9ja0A1OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTIKICAgIC8vIGFzc2VydChtYS5sZW5ndGggPT09IGxlbmd0aCkKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGxvYWRzCiAgICBsZW4KICAgIGludGNfMSAvLyA4CiAgICAvCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjEzCiAgICAvLyBhc3NlcnQobGVuZ3RoLCAnaGFzIGxlbmd0aCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2VydCAvLyBoYXMgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czoxNAogICAgLy8gY29uc3QgcG9wcGVkID0gbWEucG9wKCkKICAgIGR1cAogICAgbG9hZHMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLQogICAgZHVwCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgc3dhcAogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QzCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gOAogICAgKgogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzCiAgICBpbnRjXzAgLy8gMAogICAgaW50Y18xIC8vIDgKICAgIGV4dHJhY3QzCiAgICBidG9pCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTUKICAgIC8vIGFzc2VydChsZW5ndGgsICdoYXMgbGVuZ3RoJykKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXJ0IC8vIGhhcyBsZW5ndGgKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjE3CiAgICAvLyBhc3NlcnQocG9wcGVkID09PSBsZW5ndGggLSAxKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMQogICAgLQogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6Ok11dGFibGVBcnJheXNBbGdvLl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZSgpIC0+IHZvaWQ6Cl9fYWxnb3RzX18uZGVmYXVsdENyZWF0ZToKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QoKSAtPiB1aW50NjQ6Cl9wdXlhX2xpYi5tZW0ubmV3X3Nsb3Q6CiAgICBsb2FkIDAKICAgIGJpdGxlbgogICAgbG9hZCAwCiAgICBwdXNoaW50IDI1NiAvLyAyNTYKICAgIGRpZyAyCiAgICAtCiAgICBpbnRjXzAgLy8gMAogICAgc2V0Yml0IC8vIG9uIGVycm9yOiBubyBhdmFpbGFibGUgc2xvdHMKICAgIHN0b3JlIDAKICAgIHJldHN1Ygo=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCA4IDEKICAgIGJ5dGVjYmxvY2sgMHggMHgwNjgxMDEKICAgIHB1c2hieXRlcyAweDdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKICAgIHN0b3JlIDAKCm1haW5fYmxvY2tAMToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGludGNfMCAvLyAwCiAgICAhPQogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANgoKbWFpbl9hYmlfcm91dGluZ0AyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgTXV0YWJsZUFycmF5c0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBwdXNoYnl0ZXMgMHgyYTMzNzc3MSAvLyBtZXRob2QgInRlc3QodWludDY0KXZvaWQiCiAgICBzd2FwCiAgICBtYXRjaCBtYWluX3Rlc3Rfcm91dGVAMwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDQ6CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIE11dGFibGVBcnJheXNBbGdvIGV4dGVuZHMgQ29udHJhY3QgewogICAgaW50Y18wIC8vIDAKCm1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTE6CiAgICByZXR1cm4KCm1haW5fdGVzdF9yb3V0ZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE5vT3AKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgTXV0YWJsZUFycmF5c0FsZ28gZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo1CiAgICAvLyB0ZXN0KGxlbmd0aDogdWludDY0KSB7CiAgICBjYWxsc3ViIHRlc3QKICAgIGludGNfMiAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo6TXV0YWJsZUFycmF5c0FsZ28uX19wdXlhX2FyYzRfcm91dGVyX19AMTEKCm1haW5fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBtYXRjaCBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA3CgptYWluX3N3aXRjaF9jYXNlX2RlZmF1bHRAODoKCm1haW5fc3dpdGNoX2Nhc2VfbmV4dEA5OgogICAgYiBtYWluX2FmdGVyX2lmX2Vsc2VAMTAKCm1haW5fX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlQDc6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo0CiAgICAvLyBjbGFzcyBNdXRhYmxlQXJyYXlzQWxnbyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgPT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGNhbGxzdWIgX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlCiAgICBpbnRjXzIgLy8gMQogICAgYiBtYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6Ok11dGFibGVBcnJheXNBbGdvLl9fcHV5YV9hcmM0X3JvdXRlcl9fQDExCgoKLy8gX3B1eWFfbGliLnV0aWwuZW5zdXJlX2J1ZGdldChyZXF1aXJlZF9idWRnZXQ6IHVpbnQ2NCwgZmVlX3NvdXJjZTogdWludDY0KSAtPiB2b2lkOgplbnN1cmVfYnVkZ2V0OgogICAgcHJvdG8gMiAwCiAgICBmcmFtZV9kaWcgLTIKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBnbG9iYWwgT3Bjb2RlQnVkZ2V0CiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CgplbnN1cmVfYnVkZ2V0X3doaWxlX2JvZHlAMjoKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlY18xIC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWNfMSAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgaW50Y18wIC8vIDAKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9kaWcgLTEKICAgIG1hdGNoIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMUA0CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX2RlZmF1bHRANToKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2OgogICAgaXR4bl9zdWJtaXQKICAgIGIgZW5zdXJlX2J1ZGdldF93aGlsZV90b3BAMQoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQ6CiAgICBnbG9iYWwgTWluVHhuRmVlCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgYiBlbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANgoKZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDM6CiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjpNdXRhYmxlQXJyYXlzQWxnby50ZXN0KGxlbmd0aDogdWludDY0KSAtPiB2b2lkOgp0ZXN0OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6NQogICAgLy8gdGVzdChsZW5ndGg6IHVpbnQ2NCkgewogICAgcHJvdG8gMSAwCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo2CiAgICAvLyBlbnN1cmVCdWRnZXQoMjAwMCkKICAgIHB1c2hpbnQgMjAwMCAvLyAyMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo3CiAgICAvLyBjb25zdCBtYSA9IG5ldyBNdXRhYmxlQXJyYXk8dWludDY0PigpCiAgICBjYWxsc3ViIF9wdXlhX2xpYi5tZW0ubmV3X3Nsb3QKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweAogICAgc3RvcmVzCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czo4CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgIGludGNfMCAvLyAwCgp0ZXN0X3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICBieiB0ZXN0X2FmdGVyX3doaWxlQDMKCnRlc3Rfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OQogICAgLy8gbWEucHVzaChpKQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxvYWRzCiAgICBzd2FwCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN0b3JlcwogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6OAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHRlc3Rfd2hpbGVfdG9wQDEKCnRlc3RfYWZ0ZXJfd2hpbGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjEyCiAgICAvLyBhc3NlcnQobWEubGVuZ3RoID09PSBsZW5ndGgpCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBsb2FkcwogICAgbGVuCiAgICBpbnRjXzEgLy8gOAogICAgLwogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KGxlbmd0aCwgJ2hhcyBsZW5ndGgnKQogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NlcnQgLy8gaGFzIGxlbmd0aAogICAgLy8gdGVzdHMvYXBwcm92YWxzL211dGFibGUtYXJyYXlzLmFsZ28udHM6MTQKICAgIC8vIGNvbnN0IHBvcHBlZCA9IG1hLnBvcCgpCiAgICBkdXAKICAgIGxvYWRzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDgKICAgIC0KICAgIGR1cAogICAgaW50Y18xIC8vIDgKICAgIC8KICAgIHN3YXAKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0MwogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDgKICAgICoKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MwogICAgaW50Y18wIC8vIDAKICAgIGludGNfMSAvLyA4CiAgICBleHRyYWN0MwogICAgYnRvaQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBzdG9yZXMKICAgIC8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjE1CiAgICAvLyBhc3NlcnQobGVuZ3RoLCAnaGFzIGxlbmd0aCcpCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2VydCAvLyBoYXMgbGVuZ3RoCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvbXV0YWJsZS1hcnJheXMuYWxnby50czoxNwogICAgLy8gYXNzZXJ0KHBvcHBlZCA9PT0gbGVuZ3RoIC0gMSkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDEKICAgIC0KICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy9tdXRhYmxlLWFycmF5cy5hbGdvLnRzOjpNdXRhYmxlQXJyYXlzQWxnby5fX2FsZ290c19fLmRlZmF1bHRDcmVhdGUoKSAtPiB2b2lkOgpfX2FsZ290c19fLmRlZmF1bHRDcmVhdGU6CiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIubWVtLm5ld19zbG90KCkgLT4gdWludDY0OgpfcHV5YV9saWIubWVtLm5ld19zbG90OgogICAgbG9hZCAwCiAgICBiaXRsZW4KICAgIGxvYWQgMAogICAgcHVzaGludCAyNTYgLy8gMjU2CiAgICBkaWcgMgogICAgLQogICAgaW50Y18wIC8vIDAKICAgIHNldGJpdCAvLyBvbiBlcnJvcjogbm8gYXZhaWxhYmxlIHNsb3RzCiAgICBzdG9yZSAwCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { - "approval": "CiADAAgBJgIAAwaBAYAgf/////////////////////////////////////////81ADEbIhNBACU2GgCABCozd3FMjgEAAiJDMRkiEkQxGCITRDYaAReIAFYkQv/qMRkiTI4BAANC/94xGCISRIgAqiRC/9OKAgCL/oEKCDIMiwAMQQAqsYEGshCBBbIZKbIeKbIfIiSL/44CAAsABLNC/9syALIBQv/1IrIBQv/viYoBAIHQDyKI/7uIAF9JKD8iiwGL/wxBABuLARYoTFAoTFCLAElOAj5MUD+LASQIjAFC/92LAEk+FSMKi/8SRIv/REk+SRUjCUkjCkxLAiJPAlhOAiMLI1giI1gXTE8CTD+L/0SL/yQJEkSJiTQAkzQAgYACSwIJIlQ1AIk=", + "approval": "CiADAAgBJgIAAwaBAYAgf/////////////////////////////////////////81ADEbIhNBACU2GgCABCozd3FMjgEAAiJDMRkiEkQxGCITRDYaAReIAFYkQv/qMRkiTI4BAANC/94xGCISRIgAqSRC/9OKAgCL/oEKCDIMiwAMQQAqsYEGshCBBbIZKbIeKbIfIiSL/44CAAsABLNC/9syALIBQv/1IrIBQv/viYoBAIHQDyKI/7uIAF5JKD8iiwGL/wxBABqLAUkWKExQKExQiwBJTgI+TFA/JAiMAUL/3osAST4VIwqL/xJEi/9EST5JFSMJSSMKTEsCIk8CWE4CIwsjWCIjWBdMTwJMP4v/RIv/JAkSRImJNACTNACBgAJLAgkiVDUAiQ==", "clear": "CoEBQw==" }, "compilerInfo": { diff --git a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir index a1ac95fbd..3f8bf1fc6 100644 --- a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir +++ b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.0.ssa.ir @@ -82,21 +82,17 @@ subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length let i#0: uint64 = 0u goto block@1 block@1: // while_top_L8 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 length#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L8 let encoded%1#0: uint64[] = encode(i#1) let slot_contents%0#0: uint64[] = read(ma#0) let extended%0#0: uint64[] = slot_contents%0#0.concat(encoded%1#0) write(ma#0, extended%0#0) - goto block@3 - block@3: // L8 - let i#3: uint64 = (+ i#1 1u) + let i#2: uint64 = (+ i#1 1u) goto block@1 - block@4: // after_while_L8 - goto block@5 - block@5: // L8 + block@3: // after_while_L8 let slot_contents%1#0: uint64[] = read(ma#0) let tmp%1#0: uint64 = slot_contents%1#0.length let tmp%2#0: bool = (== tmp%1#0 length#0) diff --git a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir index 2f318f7a2..d4a14c7bd 100644 --- a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir +++ b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.1.ssa.array.ir @@ -85,9 +85,9 @@ subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length let i#0: uint64 = 0u goto block@1 block@1: // while_top_L8 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 length#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L8 let array%sub_item%0#1: bytes[8] = (itob i#1) let array%encoded%0#1: uint64[] = (concat 0x array%sub_item%0#1) @@ -97,13 +97,9 @@ subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length let array%array_contents%0#1: bytes = (concat slot_contents%0#0 encoded%1#0) // on error: max array length exceeded let extended%0#0: uint64[] = array%array_contents%0#1 write(ma#0, extended%0#0) - goto block@3 - block@3: // L8 - let i#3: uint64 = (+ i#1 1u) + let i#2: uint64 = (+ i#1 1u) goto block@1 - block@4: // after_while_L8 - goto block@5 - block@5: // L8 + block@3: // after_while_L8 let slot_contents%1#0: uint64[] = read(ma#0) let array%bytes_len%0#1: uint64 = (len slot_contents%1#0) let array%array_len%0#1: uint64 = (/ array%bytes_len%0#1 8u) diff --git a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir index 0ac52c54c..980469f8b 100644 --- a/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir +++ b/tests/approvals/out/unoptimized/mutable-arrays/MutableArraysAlgo.ir/MutableArraysAlgo.approval.2.ssa.slot.ir @@ -85,9 +85,9 @@ subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length let i#0: uint64 = 0u goto block@1 block@1: // while_top_L8 - let i#1: uint64 = φ(i#0 <- block@0, i#3 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 length#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L8 let array%sub_item%0#1: bytes[8] = (itob i#1) let array%encoded%0#1: uint64[] = (concat 0x array%sub_item%0#1) @@ -97,13 +97,9 @@ subroutine tests/approvals/mutable-arrays.algo.ts::MutableArraysAlgo.test(length let array%array_contents%0#1: bytes = (concat slot_contents%0#0 encoded%1#0) // on error: max array length exceeded let extended%0#0: uint64[] = array%array_contents%0#1 write(ma#0, extended%0#0) - goto block@3 - block@3: // L8 - let i#3: uint64 = (+ i#1 1u) + let i#2: uint64 = (+ i#1 1u) goto block@1 - block@4: // after_while_L8 - goto block@5 - block@5: // L8 + block@3: // after_while_L8 let slot_contents%1#0: uint64[] = read(ma#0) let array%bytes_len%0#1: uint64 = (len slot_contents%1#0) let array%array_len%0#1: uint64 = (/ array%bytes_len%0#1 8u) diff --git a/tests/approvals/out/unoptimized/mutable-arrays/mutable-arrays.awst b/tests/approvals/out/unoptimized/mutable-arrays/mutable-arrays.awst index 634eaf6c7..4fe61999a 100644 --- a/tests/approvals/out/unoptimized/mutable-arrays/mutable-arrays.awst +++ b/tests/approvals/out/unoptimized/mutable-arrays/mutable-arrays.awst @@ -17,10 +17,8 @@ contract MutableArraysAlgo i: uint64 = 0 while (i < length) { ma.push(...[i] - #loop₁ᶜ: i++ } - #loop₁ᵇ: assert(ma.length == length) assert(Boolean(length), comment=has length) popped: uint64 = ma.pop() diff --git a/tests/approvals/out/unoptimized/mutable-arrays/mutable-arrays.awst.json b/tests/approvals/out/unoptimized/mutable-arrays/mutable-arrays.awst.json index e59246822..5d597e292 100644 --- a/tests/approvals/out/unoptimized/mutable-arrays/mutable-arrays.awst.json +++ b/tests/approvals/out/unoptimized/mutable-arrays/mutable-arrays.awst.json @@ -580,19 +580,6 @@ "label": null, "comment": null }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/mutable-arrays.algo.ts", - "line": 8, - "end_line": 8, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null - }, { "_type": "ExpressionStatement", "source_location": { @@ -644,19 +631,6 @@ "comment": null } }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/mutable-arrays.algo.ts", - "line": 8, - "end_line": 8, - "column": 4, - "end_column": 44 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null - }, { "_type": "ExpressionStatement", "source_location": { diff --git a/tests/approvals/out/unoptimized/while-loops/DemoContract.approval.teal b/tests/approvals/out/unoptimized/while-loops/DemoContract.approval.teal index db8c287ea..45801caa6 100644 --- a/tests/approvals/out/unoptimized/while-loops/DemoContract.approval.teal +++ b/tests/approvals/out/unoptimized/while-loops/DemoContract.approval.teal @@ -103,7 +103,7 @@ testWhile_while_top@1: // while (i < stop) { // i += 1 // } - bz testWhile_after_while@4 + bz testWhile_after_while@3 testWhile_while_body@2: // tests/approvals/while-loops.algo.ts:8 @@ -112,13 +112,9 @@ testWhile_while_body@2: intc_1 // 1 + frame_bury 0 - -testWhile_block@3: b testWhile_while_top@1 -testWhile_after_while@4: - -testWhile_block@5: +testWhile_after_while@3: // tests/approvals/while-loops.algo.ts:11 // return i frame_dig 0 diff --git a/tests/approvals/out/unoptimized/while-loops/DemoContract.arc32.json b/tests/approvals/out/unoptimized/while-loops/DemoContract.arc32.json index e9560c2dc..8b603014d 100644 --- a/tests/approvals/out/unoptimized/while-loops/DemoContract.arc32.json +++ b/tests/approvals/out/unoptimized/while-loops/DemoContract.arc32.json @@ -7,7 +7,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCgptYWluX2Jsb2NrQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A2CgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBwdXNoYnl0ZXMgMHgyOGE1MmQ3MyAvLyBtZXRob2QgInRlc3RXaGlsZSh1aW50NjQpdWludDY0IgogICAgc3dhcAogICAgbWF0Y2ggbWFpbl90ZXN0V2hpbGVfcm91dGVAMwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDQ6CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCgptYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxMToKICAgIHJldHVybgoKbWFpbl90ZXN0V2hpbGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0V2hpbGUKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjpEZW1vQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX19AMTEKCm1haW5fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgbWF0Y2ggbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVANwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDg6CgptYWluX3N3aXRjaF9jYXNlX25leHRAOToKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDEwCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRGVtb0NvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBfX2FsZ290c19fLmRlZmF1bHRDcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo6RGVtb0NvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fQDExCgoKLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC50ZXN0V2hpbGUoc3RvcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RXaGlsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKdGVzdFdoaWxlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NwogICAgLy8gd2hpbGUgKGkgPCBzdG9wKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo3LTkKICAgIC8vIHdoaWxlIChpIDwgc3RvcCkgewogICAgLy8gICBpICs9IDEKICAgIC8vIH0KICAgIGJ6IHRlc3RXaGlsZV9hZnRlcl93aGlsZUA0Cgp0ZXN0V2hpbGVfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OAogICAgLy8gaSArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKdGVzdFdoaWxlX2Jsb2NrQDM6CiAgICBiIHRlc3RXaGlsZV93aGlsZV90b3BAMQoKdGVzdFdoaWxlX2FmdGVyX3doaWxlQDQ6Cgp0ZXN0V2hpbGVfYmxvY2tANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjExCiAgICAvLyByZXR1cm4gaQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjpEZW1vQ29udHJhY3QuX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlKCkgLT4gdm9pZDoKX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlOgogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCgptYWluX2Jsb2NrQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A2CgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBwdXNoYnl0ZXMgMHgyOGE1MmQ3MyAvLyBtZXRob2QgInRlc3RXaGlsZSh1aW50NjQpdWludDY0IgogICAgc3dhcAogICAgbWF0Y2ggbWFpbl90ZXN0V2hpbGVfcm91dGVAMwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDQ6CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCgptYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxMToKICAgIHJldHVybgoKbWFpbl90ZXN0V2hpbGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0V2hpbGUKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjpEZW1vQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX19AMTEKCm1haW5fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgbWF0Y2ggbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVANwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDg6CgptYWluX3N3aXRjaF9jYXNlX25leHRAOToKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDEwCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRGVtb0NvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBfX2FsZ290c19fLmRlZmF1bHRDcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo6RGVtb0NvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fQDExCgoKLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC50ZXN0V2hpbGUoc3RvcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RXaGlsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKdGVzdFdoaWxlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NwogICAgLy8gd2hpbGUgKGkgPCBzdG9wKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo3LTkKICAgIC8vIHdoaWxlIChpIDwgc3RvcCkgewogICAgLy8gICBpICs9IDEKICAgIC8vIH0KICAgIGJ6IHRlc3RXaGlsZV9hZnRlcl93aGlsZUAzCgp0ZXN0V2hpbGVfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OAogICAgLy8gaSArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiB0ZXN0V2hpbGVfd2hpbGVfdG9wQDEKCnRlc3RXaGlsZV9hZnRlcl93aGlsZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6MTEKICAgIC8vIHJldHVybiBpCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC5fX2FsZ290c19fLmRlZmF1bHRDcmVhdGUoKSAtPiB2b2lkOgpfX2FsZ290c19fLmRlZmF1bHRDcmVhdGU6CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "state": { diff --git a/tests/approvals/out/unoptimized/while-loops/DemoContract.arc56.json b/tests/approvals/out/unoptimized/while-loops/DemoContract.arc56.json index 95fa3cbf0..5bf8fefcd 100644 --- a/tests/approvals/out/unoptimized/while-loops/DemoContract.arc56.json +++ b/tests/approvals/out/unoptimized/while-loops/DemoContract.arc56.json @@ -87,7 +87,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCgptYWluX2Jsb2NrQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A2CgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBwdXNoYnl0ZXMgMHgyOGE1MmQ3MyAvLyBtZXRob2QgInRlc3RXaGlsZSh1aW50NjQpdWludDY0IgogICAgc3dhcAogICAgbWF0Y2ggbWFpbl90ZXN0V2hpbGVfcm91dGVAMwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDQ6CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCgptYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxMToKICAgIHJldHVybgoKbWFpbl90ZXN0V2hpbGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0V2hpbGUKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjpEZW1vQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX19AMTEKCm1haW5fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgbWF0Y2ggbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVANwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDg6CgptYWluX3N3aXRjaF9jYXNlX25leHRAOToKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDEwCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRGVtb0NvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBfX2FsZ290c19fLmRlZmF1bHRDcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo6RGVtb0NvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fQDExCgoKLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC50ZXN0V2hpbGUoc3RvcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RXaGlsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKdGVzdFdoaWxlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NwogICAgLy8gd2hpbGUgKGkgPCBzdG9wKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo3LTkKICAgIC8vIHdoaWxlIChpIDwgc3RvcCkgewogICAgLy8gICBpICs9IDEKICAgIC8vIH0KICAgIGJ6IHRlc3RXaGlsZV9hZnRlcl93aGlsZUA0Cgp0ZXN0V2hpbGVfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OAogICAgLy8gaSArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKdGVzdFdoaWxlX2Jsb2NrQDM6CiAgICBiIHRlc3RXaGlsZV93aGlsZV90b3BAMQoKdGVzdFdoaWxlX2FmdGVyX3doaWxlQDQ6Cgp0ZXN0V2hpbGVfYmxvY2tANToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjExCiAgICAvLyByZXR1cm4gaQogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjpEZW1vQ29udHJhY3QuX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlKCkgLT4gdm9pZDoKX19hbGdvdHNfXy5kZWZhdWx0Q3JlYXRlOgogICAgcmV0c3ViCg==", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxCgptYWluX2Jsb2NrQDE6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgaW50Y18wIC8vIDAKICAgICE9CiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A2CgptYWluX2FiaV9yb3V0aW5nQDI6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBwdXNoYnl0ZXMgMHgyOGE1MmQ3MyAvLyBtZXRob2QgInRlc3RXaGlsZSh1aW50NjQpdWludDY0IgogICAgc3dhcAogICAgbWF0Y2ggbWFpbl90ZXN0V2hpbGVfcm91dGVAMwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDQ6CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjQKICAgIC8vIGNsYXNzIERlbW9Db250cmFjdCBleHRlbmRzIENvbnRyYWN0IHsKICAgIGludGNfMCAvLyAwCgptYWluX2FmdGVyX2lubGluZWRfdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfX0AxMToKICAgIHJldHVybgoKbWFpbl90ZXN0V2hpbGVfcm91dGVAMzoKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gTm9PcAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBpbnRjXzAgLy8gMAogICAgIT0KICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo1CiAgICAvLyBwdWJsaWMgdGVzdFdoaWxlKHN0b3A6IHVpbnQ2NCkgewogICAgY2FsbHN1YiB0ZXN0V2hpbGUKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIGIgbWFpbl9hZnRlcl9pbmxpbmVkX3Rlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjpEZW1vQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX19AMTEKCm1haW5fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo0CiAgICAvLyBjbGFzcyBEZW1vQ29udHJhY3QgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgbWF0Y2ggbWFpbl9fX2FsZ290c19fLmRlZmF1bHRDcmVhdGVANwoKbWFpbl9zd2l0Y2hfY2FzZV9kZWZhdWx0QDg6CgptYWluX3N3aXRjaF9jYXNlX25leHRAOToKICAgIGIgbWFpbl9hZnRlcl9pZl9lbHNlQDEwCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUA3OgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NAogICAgLy8gY2xhc3MgRGVtb0NvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMCAvLyAwCiAgICA9PQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgY2FsbHN1YiBfX2FsZ290c19fLmRlZmF1bHRDcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICBiIG1haW5fYWZ0ZXJfaW5saW5lZF90ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo6RGVtb0NvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fQDExCgoKLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC50ZXN0V2hpbGUoc3RvcDogdWludDY0KSAtPiB1aW50NjQ6CnRlc3RXaGlsZToKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjUKICAgIC8vIHB1YmxpYyB0ZXN0V2hpbGUoc3RvcDogdWludDY0KSB7CiAgICBwcm90byAxIDEKICAgIC8vIHRlc3RzL2FwcHJvdmFscy93aGlsZS1sb29wcy5hbGdvLnRzOjYKICAgIC8vIGxldCBpID0gVWludDY0KDApCiAgICBpbnRjXzAgLy8gMAoKdGVzdFdoaWxlX3doaWxlX3RvcEAxOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6NwogICAgLy8gd2hpbGUgKGkgPCBzdG9wKSB7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICA8CiAgICAvLyB0ZXN0cy9hcHByb3ZhbHMvd2hpbGUtbG9vcHMuYWxnby50czo3LTkKICAgIC8vIHdoaWxlIChpIDwgc3RvcCkgewogICAgLy8gICBpICs9IDEKICAgIC8vIH0KICAgIGJ6IHRlc3RXaGlsZV9hZnRlcl93aGlsZUAzCgp0ZXN0V2hpbGVfd2hpbGVfYm9keUAyOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OAogICAgLy8gaSArPSAxCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMAogICAgYiB0ZXN0V2hpbGVfd2hpbGVfdG9wQDEKCnRlc3RXaGlsZV9hZnRlcl93aGlsZUAzOgogICAgLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6MTEKICAgIC8vIHJldHVybiBpCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdHMvYXBwcm92YWxzL3doaWxlLWxvb3BzLmFsZ28udHM6OkRlbW9Db250cmFjdC5fX2FsZ290c19fLmRlZmF1bHRDcmVhdGUoKSAtPiB2b2lkOgpfX2FsZ290c19fLmRlZmF1bHRDcmVhdGU6CiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { diff --git a/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir b/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir index 5fb1dc0de..6c590eaee 100644 --- a/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir +++ b/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.0.ssa.ir @@ -50,17 +50,13 @@ subroutine tests/approvals/while-loops.algo.ts::DemoContract.testWhile(stop: uin let i#0: uint64 = 0u goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let i#2: uint64 = (+ i#1 1u) - goto block@3 - block@3: // L7 goto block@1 - block@4: // after_while_L7 - goto block@5 - block@5: // L7 + block@3: // after_while_L7 return i#1 subroutine tests/approvals/while-loops.algo.ts::DemoContract.__algots__.defaultCreate() -> void: diff --git a/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.1.ssa.array.ir b/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.1.ssa.array.ir index 8892bc473..5ba28d11c 100644 --- a/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.1.ssa.array.ir +++ b/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.1.ssa.array.ir @@ -53,17 +53,13 @@ subroutine tests/approvals/while-loops.algo.ts::DemoContract.testWhile(stop: uin let i#0: uint64 = 0u goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let i#2: uint64 = (+ i#1 1u) - goto block@3 - block@3: // L7 goto block@1 - block@4: // after_while_L7 - goto block@5 - block@5: // L7 + block@3: // after_while_L7 return i#1 subroutine tests/approvals/while-loops.algo.ts::DemoContract.__algots__.defaultCreate() -> void: diff --git a/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.2.ssa.slot.ir b/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.2.ssa.slot.ir index 8892bc473..5ba28d11c 100644 --- a/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.2.ssa.slot.ir +++ b/tests/approvals/out/unoptimized/while-loops/DemoContract.ir/DemoContract.approval.2.ssa.slot.ir @@ -53,17 +53,13 @@ subroutine tests/approvals/while-loops.algo.ts::DemoContract.testWhile(stop: uin let i#0: uint64 = 0u goto block@1 block@1: // while_top_L7 - let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@3) + let i#1: uint64 = φ(i#0 <- block@0, i#2 <- block@2) let tmp%0#0: bool = (< i#1 stop#0) - goto tmp%0#0 ? block@2 : block@4 + goto tmp%0#0 ? block@2 : block@3 block@2: // while_body_L7 let i#2: uint64 = (+ i#1 1u) - goto block@3 - block@3: // L7 goto block@1 - block@4: // after_while_L7 - goto block@5 - block@5: // L7 + block@3: // after_while_L7 return i#1 subroutine tests/approvals/while-loops.algo.ts::DemoContract.__algots__.defaultCreate() -> void: diff --git a/tests/approvals/out/unoptimized/while-loops/while-loops.awst b/tests/approvals/out/unoptimized/while-loops/while-loops.awst index 79148559d..1cd04ef6a 100644 --- a/tests/approvals/out/unoptimized/while-loops/while-loops.awst +++ b/tests/approvals/out/unoptimized/while-loops/while-loops.awst @@ -15,9 +15,7 @@ contract DemoContract i: uint64 = 0 while (i < stop) { i: uint64 = i + 1 - #loop₁ᶜ: } - #loop₁ᵇ: return i } diff --git a/tests/approvals/out/unoptimized/while-loops/while-loops.awst.json b/tests/approvals/out/unoptimized/while-loops/while-loops.awst.json index 6642b04a6..2ce9e84fe 100644 --- a/tests/approvals/out/unoptimized/while-loops/while-loops.awst.json +++ b/tests/approvals/out/unoptimized/while-loops/while-loops.awst.json @@ -435,37 +435,11 @@ ], "label": null, "comment": null - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/while-loops.algo.ts", - "line": 7, - "end_line": 9, - "column": 4, - "end_column": 5 - }, - "body": [], - "label": "#loop₁ᶜ", - "comment": null } ], "label": null, "comment": null } - }, - { - "_type": "Block", - "source_location": { - "file": "tests/approvals/while-loops.algo.ts", - "line": 7, - "end_line": 9, - "column": 4, - "end_column": 5 - }, - "body": [], - "label": "#loop₁ᵇ", - "comment": null } ], "label": null, diff --git a/tests/onchain/do-loops.spec.ts b/tests/onchain/do-loops.spec.ts new file mode 100644 index 000000000..ed16b1aea --- /dev/null +++ b/tests/onchain/do-loops.spec.ts @@ -0,0 +1,22 @@ +import { describe } from 'vitest' +import { createArc4TestFixture } from './util/test-fixture' + +describe('do loops', () => { + const test = createArc4TestFixture('tests/approvals/do-loops.algo.ts', { DoLoopsAlgo: {} }) + + test('testDo runs', async ({ appClientDoLoopsAlgo, expect }) => { + const result = await appClientDoLoopsAlgo.send.call({ method: 'testDo', args: [10] }) + + expect(result.return).toBe(10n) + }) + test('testDoBreak runs', async ({ appClientDoLoopsAlgo, expect }) => { + const result = await appClientDoLoopsAlgo.send.call({ method: 'testDoBreak', args: [10, 5] }) + + expect(result.return).toBe(BigInt(1 + 2 + 3 + 4 + 5)) + }) + test('testDoContinue runs', async ({ appClientDoLoopsAlgo, expect }) => { + const result = await appClientDoLoopsAlgo.send.call({ method: 'testDoContinue', args: [10, 3] }) + + expect(result.return).toBe(BigInt(1 + 1 + 1 + 2 + 1 + 1 + 2 + 1 + 1 + 2)) + }) +}) diff --git a/tests/onchain/for-loops.spec.ts b/tests/onchain/for-loops.spec.ts index 346af2d6b..abac1c4d9 100644 --- a/tests/onchain/for-loops.spec.ts +++ b/tests/onchain/for-loops.spec.ts @@ -25,9 +25,7 @@ describe('for loops', () => { expect(r2.return).toBe(0n) }) test('labelled break', async ({ appClientForLoopsAlgo }) => { - const r1 = await appClientForLoopsAlgo.send.call({ method: 'test_for_loop_labelled', args: [0, 20, 3] }) - expect(r1.return).toBe(0n) - const r2 = await appClientForLoopsAlgo.send.call({ method: 'test_for_loop_labelled', args: [2, 20, 5] }) - expect(r2.return).toBe(2n + 2n) + const r1 = await appClientForLoopsAlgo.send.call({ method: 'test_for_loop_labelled', args: [0, 4, 1] }) + expect(r1.return).toBe(BigInt(1 + 2 + 3 + 1 + 2 + 3 + 4 + 2 + 3 + 4 + 5)) }) })