From 29caead36f38f7c6c9fbb5bd67a505f1d65b635e Mon Sep 17 00:00:00 2001 From: Joe Polny Date: Mon, 13 Nov 2023 09:12:31 -0300 Subject: [PATCH] uint512 -> uint256 for ecdsa opcodes --- src/lib/compiler.ts | 4 ++-- .../artifacts/GeneralTest.approval.teal | 6 +++--- tests/contracts/artifacts/GeneralTest.arc32.json | 6 +++--- tests/contracts/artifacts/GeneralTest.arc4.json | 2 +- tests/contracts/general.algo.ts | 2 +- types/global.d.ts | 16 ++++++++-------- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/lib/compiler.ts b/src/lib/compiler.ts index 59958a8d5..dfd99e297 100644 --- a/src/lib/compiler.ts +++ b/src/lib/compiler.ts @@ -785,7 +785,7 @@ export default class Compiler { 'concat' ); - this.lastType = '[uint512,uint512]'; + this.lastType = '[uint256,uint256]'; }, }, ecdsa_pk_recover: { @@ -833,7 +833,7 @@ export default class Compiler { 'concat' ); - this.lastType = '[uint512,uint512]'; + this.lastType = '[uint256,uint256]'; }, }, // Global methods diff --git a/tests/contracts/artifacts/GeneralTest.approval.teal b/tests/contracts/artifacts/GeneralTest.approval.teal index 6f3775fa2..a14f7722c 100644 --- a/tests/contracts/artifacts/GeneralTest.approval.teal +++ b/tests/contracts/artifacts/GeneralTest.approval.teal @@ -732,9 +732,9 @@ scratchSlot: assert retsub -// ecdsa()(uint512,uint512) +// ecdsa()(uint256,uint256) abi_route_ecdsa: - // execute ecdsa()(uint512,uint512) + // execute ecdsa()(uint256,uint256) callsub ecdsa int 1 return @@ -816,7 +816,7 @@ call_NoOp: method "stringSubstring()void" method "idProperty()void" method "scratchSlot()void" - method "ecdsa()(uint512,uint512)" + method "ecdsa()(uint256,uint256)" txna ApplicationArgs 0 match abi_route_txnTypeEnum abi_route_txnGroupLength abi_route_asserts abi_route_verifyTxnFromArg abi_route_verifyTxnFromTxnGroup abi_route_verifyTxnCondition abi_route_verifyTxnIncludedIn abi_route_verifyTxnNotIncludedIn abi_route_submitPendingGroup abi_route_methodWithTxnArgs abi_route_shift abi_route_fromBytes abi_route_fromID abi_route_bzeroFunction abi_route_events abi_route_letOptimization abi_route_staticContractProperties abi_route_numberToString abi_route_methodOnParens abi_route_stringSubstring abi_route_idProperty abi_route_scratchSlot abi_route_ecdsa err diff --git a/tests/contracts/artifacts/GeneralTest.arc32.json b/tests/contracts/artifacts/GeneralTest.arc32.json index ac417a024..ff7d3d8c7 100644 --- a/tests/contracts/artifacts/GeneralTest.arc32.json +++ b/tests/contracts/artifacts/GeneralTest.arc32.json @@ -110,7 +110,7 @@ "no_op": "CALL" } }, - "ecdsa()(uint512,uint512)": { + "ecdsa()(uint256,uint256)": { "call_config": { "no_op": "CALL" } @@ -149,7 +149,7 @@ } }, "source": { - "approval": "I3ByYWdtYSB2ZXJzaW9uIDkKCi8vIFRoaXMgVEVBTCB3YXMgZ2VuZXJhdGVkIGJ5IFRFQUxTY3JpcHQgdjAuNjIuMQovLyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL1RFQUxTY3JpcHQKCi8vIFRoaXMgY29udHJhY3QgaXMgY29tcGxpYW50IHdpdGggYW5kL29yIGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBBUkNzOiBbIEFSQzQgXQoKLy8gVGhlIGZvbGxvd2luZyB0ZW4gbGluZXMgb2YgVEVBTCBoYW5kbGUgaW5pdGlhbCBwcm9ncmFtIGZsb3cKLy8gVGhpcyBwYXR0ZXJuIGlzIHVzZWQgdG8gbWFrZSBpdCBlYXN5IGZvciBhbnlvbmUgdG8gcGFyc2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGFuZCBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBhY3Rpb24gaXMgYWxsb3dlZAovLyBIZXJlLCBhY3Rpb24gcmVmZXJzIHRvIHRoZSBPbkNvbXBsZXRlIGluIGNvbWJpbmF0aW9uIHdpdGggd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIGNyZWF0ZWQgb3IgY2FsbGVkCi8vIEV2ZXJ5IHBvc3NpYmxlIGFjdGlvbiBmb3IgdGhpcyBjb250cmFjdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgc3dpdGNoIHN0YXRlbWVudAovLyBJZiB0aGUgYWN0aW9uIGlzIG5vdCBpbXBsbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlcHNlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIk5PVF9JTVBMTUVOVEVEIiB3aGljaCBqdXN0IGNvbnRhaW5zICJlcnIiCnR4biBBcHBsaWNhdGlvbklECmludCAwCj4KaW50IDYKKgp0eG4gT25Db21wbGV0aW9uCisKc3dpdGNoIGNyZWF0ZV9Ob09wIE5PVF9JTVBMRU1FTlRFRCBOT1RfSU1QTEVNRU5URUQgTk9UX0lNUExFTUVOVEVEIE5PVF9JTVBMRU1FTlRFRCBOT1RfSU1QTEVNRU5URUQgY2FsbF9Ob09wCgpOT1RfSU1QTEVNRU5URUQ6CgllcnIKCi8vIHR4blR5cGVFbnVtKCl2b2lkCmFiaV9yb3V0ZV90eG5UeXBlRW51bToKCS8vIGV4ZWN1dGUgdHhuVHlwZUVudW0oKXZvaWQKCWNhbGxzdWIgdHhuVHlwZUVudW0KCWludCAxCglyZXR1cm4KCnR4blR5cGVFbnVtOgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxOAoJLy8gYXNzZXJ0KHRoaXMudHhuR3JvdXBbMF0udHlwZUVudW0gPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwpCglpbnQgMAoJZ3R4bnMgVHlwZUVudW0KCWludCBhcHBsCgk9PQoJYXNzZXJ0CglyZXRzdWIKCi8vIHR4bkdyb3VwTGVuZ3RoKCl2b2lkCmFiaV9yb3V0ZV90eG5Hcm91cExlbmd0aDoKCS8vIGV4ZWN1dGUgdHhuR3JvdXBMZW5ndGgoKXZvaWQKCWNhbGxzdWIgdHhuR3JvdXBMZW5ndGgKCWludCAxCglyZXR1cm4KCnR4bkdyb3VwTGVuZ3RoOgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoyMgoJLy8gYXNzZXJ0KHRoaXMudHhuR3JvdXAubGVuZ3RoID09PSAxKQoJZ2xvYmFsIEdyb3VwU2l6ZQoJaW50IDEKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gYXNzZXJ0cyhib29sLGJvb2wpdm9pZAphYmlfcm91dGVfYXNzZXJ0czoKCS8vIGFyZzI6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCWFzc2VydAoJaW50IDAKCWdldGJpdAoKCS8vIGFyZzE6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMQoJPT0KCWFzc2VydAoJaW50IDAKCWdldGJpdAoKCS8vIGV4ZWN1dGUgYXNzZXJ0cyhib29sLGJvb2wpdm9pZAoJY2FsbHN1YiBhc3NlcnRzCglpbnQgMQoJcmV0dXJuCgphc3NlcnRzOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoyNgoJLy8gYXNzZXJ0KGFyZzEsIGFyZzIsIGFyZzEgPT09IGFyZzIpCglmcmFtZV9kaWcgLTEgLy8gYXJnMTogYm9vbAoJYXNzZXJ0CglmcmFtZV9kaWcgLTIgLy8gYXJnMjogYm9vbAoJYXNzZXJ0CglmcmFtZV9kaWcgLTEgLy8gYXJnMTogYm9vbAoJZnJhbWVfZGlnIC0yIC8vIGFyZzI6IGJvb2wKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5VHhuRnJvbUFyZyhwYXkpdm9pZAphYmlfcm91dGVfdmVyaWZ5VHhuRnJvbUFyZzoKCS8vIHNvbWVQYXk6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSB2ZXJpZnlUeG5Gcm9tQXJnKHBheSl2b2lkCgljYWxsc3ViIHZlcmlmeVR4bkZyb21BcmcKCWludCAxCglyZXR1cm4KCnZlcmlmeVR4bkZyb21Bcmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjMwCgkvLyB2ZXJpZnlUeG4oc29tZVBheSwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiAxMDBfMDAwIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBzb21lUGF5OiBwYXkKCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBzb21lUGF5OiBwYXkKCWd0eG5zIEFtb3VudAoJaW50IDEwMF8wMDAKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5VHhuRnJvbVR4bkdyb3VwKCl2b2lkCmFiaV9yb3V0ZV92ZXJpZnlUeG5Gcm9tVHhuR3JvdXA6CgkvLyBleGVjdXRlIHZlcmlmeVR4bkZyb21UeG5Hcm91cCgpdm9pZAoJY2FsbHN1YiB2ZXJpZnlUeG5Gcm9tVHhuR3JvdXAKCWludCAxCglyZXR1cm4KCnZlcmlmeVR4bkZyb21UeG5Hcm91cDoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MzQKCS8vIHZlcmlmeVR4bih0aGlzLnR4bkdyb3VwWzBdLCB7IHNlbmRlcjogdGhpcy50eG4uc2VuZGVyIH0pCgkvLyB2ZXJpZnkgc2VuZGVyCglpbnQgMAoJZ3R4bnMgU2VuZGVyCgl0eG4gU2VuZGVyCgk9PQoJYXNzZXJ0CglyZXRzdWIKCi8vIHZlcmlmeVR4bkNvbmRpdGlvbigpdm9pZAphYmlfcm91dGVfdmVyaWZ5VHhuQ29uZGl0aW9uOgoJLy8gZXhlY3V0ZSB2ZXJpZnlUeG5Db25kaXRpb24oKXZvaWQKCWNhbGxzdWIgdmVyaWZ5VHhuQ29uZGl0aW9uCglpbnQgMQoJcmV0dXJuCgp2ZXJpZnlUeG5Db25kaXRpb246Cglwcm90byAwIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjM4CgkvLyB2ZXJpZnlUeG4odGhpcy50eG4sIHsKCS8vICAgICAgIGFwcGxpY2F0aW9uSUQ6IHsgZ3JlYXRlclRoYW46IDEgfSwKCS8vICAgICB9KQoJLy8gdmVyaWZ5IGFwcGxpY2F0aW9uSUQKCXR4biBBcHBsaWNhdGlvbklECglpbnQgMQoJPgoJYXNzZXJ0CglyZXRzdWIKCi8vIHZlcmlmeVR4bkluY2x1ZGVkSW4oKXZvaWQKYWJpX3JvdXRlX3ZlcmlmeVR4bkluY2x1ZGVkSW46CgkvLyBleGVjdXRlIHZlcmlmeVR4bkluY2x1ZGVkSW4oKXZvaWQKCWNhbGxzdWIgdmVyaWZ5VHhuSW5jbHVkZWRJbgoJaW50IDEKCXJldHVybgoKdmVyaWZ5VHhuSW5jbHVkZWRJbjoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NDQKCS8vIHZlcmlmeVR4bih0aGlzLnR4biwgewoJLy8gICAgICAgc2VuZGVyOiB7IGluY2x1ZGVkSW46IFt0aGlzLnR4bi5zZW5kZXJdIH0sCgkvLyAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCXR4biBTZW5kZXIKCXR4biBTZW5kZXIKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5VHhuTm90SW5jbHVkZWRJbigpdm9pZAphYmlfcm91dGVfdmVyaWZ5VHhuTm90SW5jbHVkZWRJbjoKCS8vIGV4ZWN1dGUgdmVyaWZ5VHhuTm90SW5jbHVkZWRJbigpdm9pZAoJY2FsbHN1YiB2ZXJpZnlUeG5Ob3RJbmNsdWRlZEluCglpbnQgMQoJcmV0dXJuCgp2ZXJpZnlUeG5Ob3RJbmNsdWRlZEluOgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo1MAoJLy8gdmVyaWZ5VHhuKHRoaXMudHhuLCB7CgkvLyAgICAgICBzZW5kZXI6IHsgbm90SW5jbHVkZWRJbjogW2dsb2JhbHMuemVyb0FkZHJlc3NdIH0sCgkvLyAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCXR4biBTZW5kZXIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoJcmV0c3ViCgovLyBzdWJtaXRQZW5kaW5nR3JvdXAoKXZvaWQKYWJpX3JvdXRlX3N1Ym1pdFBlbmRpbmdHcm91cDoKCS8vIGV4ZWN1dGUgc3VibWl0UGVuZGluZ0dyb3VwKCl2b2lkCgljYWxsc3ViIHN1Ym1pdFBlbmRpbmdHcm91cAoJaW50IDEKCXJldHVybgoKc3VibWl0UGVuZGluZ0dyb3VwOgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo1NgoJLy8gdGhpcy5wZW5kaW5nR3JvdXAuYWRkUGF5bWVudCh7IGFtb3VudDogMTAwXzAwMCwgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MgfSkKCWl0eG5fYmVnaW4KCWludCBwYXkKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjU2CgkvLyBhbW91bnQ6IDEwMF8wMDAKCWludCAxMDBfMDAwCglpdHhuX2ZpZWxkIEFtb3VudAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NTYKCS8vIHJlY2VpdmVyOiB0aGlzLmFwcC5hZGRyZXNzCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NTcKCS8vIHRoaXMucGVuZGluZ0dyb3VwLmFkZEFzc2V0Q3JlYXRpb24oeyBjb25maWdBc3NldFRvdGFsOiAxIH0pCglpdHhuX2JlZ2luCglpbnQgYWNmZwoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NTcKCS8vIGNvbmZpZ0Fzc2V0VG90YWw6IDEKCWludCAxCglpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjU4CgkvLyB0aGlzLnBlbmRpbmdHcm91cC5zdWJtaXQoKQoJaXR4bl9zdWJtaXQKCXJldHN1YgoKLy8gbWV0aG9kV2l0aFR4bkFyZ3MoKXZvaWQKYWJpX3JvdXRlX21ldGhvZFdpdGhUeG5BcmdzOgoJLy8gZXhlY3V0ZSBtZXRob2RXaXRoVHhuQXJncygpdm9pZAoJY2FsbHN1YiBtZXRob2RXaXRoVHhuQXJncwoJaW50IDEKCXJldHVybgoKbWV0aG9kV2l0aFR4bkFyZ3M6Cglwcm90byAwIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjYyCgkvLyBzZW5kTWV0aG9kQ2FsbDxbSW5uZXJQYXltZW50LCBJbm5lck1ldGhvZENhbGw8W3VpbnQ2NF0sIHZvaWQ+XSwgdm9pZD4oewoJLy8gICAgICAgbmFtZTogJ2ZvbycsCgkvLyAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgIHsgYW1vdW50OiAxMDBfMDAwLCByZWNlaXZlcjogdGhpcy50eG4uc2VuZGVyIH0sCgkvLyAgICAgICAgIHsKCS8vICAgICAgICAgICBuYW1lOiAnYmFyJywKCS8vICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBsaWNhdGlvbi5mcm9tSUQoMTMzNyksCgkvLyAgICAgICAgICAgbWV0aG9kQXJnczogWzFdLAoJLy8gICAgICAgICB9LAoJLy8gICAgICAgXSwKCS8vICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IHBheQoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NjUKCS8vIGFtb3VudDogMTAwXzAwMAoJaW50IDEwMF8wMDAKCWl0eG5fZmllbGQgQW1vdW50CgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo2NQoJLy8gcmVjZWl2ZXI6IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYmFyKHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjY4CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBsaWNhdGlvbi5mcm9tSUQoMTMzNykKCWludCAxMzM3CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjY5CgkvLyBtZXRob2RBcmdzOiBbMV0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiZm9vKHBheSxhcHBsKXZvaWQiCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NjQKCS8vIG1ldGhvZEFyZ3M6IFsKCS8vICAgICAgICAgeyBhbW91bnQ6IDEwMF8wMDAsIHJlY2VpdmVyOiB0aGlzLnR4bi5zZW5kZXIgfSwKCS8vICAgICAgICAgewoJLy8gICAgICAgICAgIG5hbWU6ICdiYXInLAoJLy8gICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcGxpY2F0aW9uLmZyb21JRCgxMzM3KSwKCS8vICAgICAgICAgICBtZXRob2RBcmdzOiBbMV0sCgkvLyAgICAgICAgIH0sCgkvLyAgICAgICBdCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglyZXRzdWIKCi8vIHNoaWZ0KCl2b2lkCmFiaV9yb3V0ZV9zaGlmdDoKCS8vIGV4ZWN1dGUgc2hpZnQoKXZvaWQKCWNhbGxzdWIgc2hpZnQKCWludCAxCglyZXR1cm4KCnNoaWZ0OgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo3NgoJLy8gYXNzZXJ0KDEgPDwgMiA9PT0gNCkKCWludCAxCglpbnQgMgoJc2hsCglpbnQgNAoJPT0KCWFzc2VydAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NzcKCS8vIGFzc2VydCg0ID4+IDEgPT09IDIpCglpbnQgNAoJaW50IDEKCXNocgoJaW50IDIKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gZnJvbUJ5dGVzKCl2b2lkCmFiaV9yb3V0ZV9mcm9tQnl0ZXM6CgkvLyBleGVjdXRlIGZyb21CeXRlcygpdm9pZAoJY2FsbHN1YiBmcm9tQnl0ZXMKCWludCAxCglyZXR1cm4KCmZyb21CeXRlczoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6ODEKCS8vIGFzc2VydChBZGRyZXNzLmZyb21CeXRlcygnYWJjJykubWluQmFsYW5jZSkKCWJ5dGUgMHg2MTYyNjMgLy8gImFiYyIKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJYXNzZXJ0Cglhc3NlcnQKCXJldHN1YgoKLy8gZnJvbUlEKCl2b2lkCmFiaV9yb3V0ZV9mcm9tSUQ6CgkvLyBleGVjdXRlIGZyb21JRCgpdm9pZAoJY2FsbHN1YiBmcm9tSUQKCWludCAxCglyZXR1cm4KCmZyb21JRDoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6ODUKCS8vIGxvZyhBcHBsaWNhdGlvbi5mcm9tSUQoMTIzKS5jcmVhdG9yKQoJaW50IDEyMwoJYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgoJYXNzZXJ0Cglsb2cKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjg2CgkvLyBsb2coQXNzZXQuZnJvbUlEKDEyMykuY3JlYXRvcikKCWludCAxMjMKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglhc3NlcnQKCWxvZwoJcmV0c3ViCgovLyBiemVyb0Z1bmN0aW9uKCl2b2lkCmFiaV9yb3V0ZV9iemVyb0Z1bmN0aW9uOgoJYnl0ZSAweDsgZHVwbiAzIC8vIHB1c2ggZW1wdHkgYnl0ZXMgdG8gZmlsbCB0aGUgc3RhY2sgZnJhbWUgZm9yIHRoaXMgc3Vicm91dGluZSdzIGxvY2FsIHZhcmlhYmxlcwoKCS8vIGV4ZWN1dGUgYnplcm9GdW5jdGlvbigpdm9pZAoJY2FsbHN1YiBiemVyb0Z1bmN0aW9uCglpbnQgMQoJcmV0dXJuCgpiemVyb0Z1bmN0aW9uOgoJcHJvdG8gNCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo5MAoJLy8gbiA9IDEKCWludCAxCglmcmFtZV9idXJ5IC0xIC8vIG46IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6OTEKCS8vIHg6IGJ5dGVzID0gYnplcm8oMikKCWJ5dGUgMHgwMDAwCglmcmFtZV9idXJ5IC0yIC8vIHg6IGJ5dGVzCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo5MgoJLy8geTogYnl0ZXMgPSBiemVybyhuKQoJaW50IDEgLy8gbjogdWludDY0CgliemVybwoJZnJhbWVfYnVyeSAtMyAvLyB5OiBieXRlcwoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6OTMKCS8vIHo6IFt1aW50NjQsIHVpbnQ8OD5dID0gYnplcm88W3VpbnQ2NCwgdWludDw4Pl0+KCkKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAKCWZyYW1lX2J1cnkgLTQgLy8gejogW3VpbnQ2NCx1aW50OF0KCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjk0CgkvLyBhc3NlcnQobGVuKHggKyB5ICsgeikgPT09IDEyKQoJYnl0ZSAweDAwMDAgLy8geDogYnl0ZXMKCWZyYW1lX2RpZyAtMyAvLyB5OiBieXRlcwoJY29uY2F0CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwIC8vIHo6IFt1aW50NjQsdWludDhdCgljb25jYXQKCWxlbgoJaW50IDEyCgk9PQoJYXNzZXJ0CglyZXRzdWIKCi8vIGV2ZW50cygpdm9pZAphYmlfcm91dGVfZXZlbnRzOgoJLy8gZXhlY3V0ZSBldmVudHMoKXZvaWQKCWNhbGxzdWIgZXZlbnRzCglpbnQgMQoJcmV0dXJuCgpldmVudHM6Cglwcm90byAwIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjEwMAoJLy8gdGhpcy5teUV2ZW50LmxvZyh0aGlzLmFwcCwgMSkKCWJ5dGUgMHg4NzUyODE5NiAvLyBteUV2ZW50KHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglpdG9iCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMQoJY29uY2F0Cgljb25jYXQKCWxvZwoJcmV0c3ViCgovLyBsZXRPcHRpbWl6YXRpb24odWludDY0W10pdWludDY0W10KYWJpX3JvdXRlX2xldE9wdGltaXphdGlvbjoKCS8vIGE6IHVpbnQ2NFtdCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIGV4ZWN1dGUgbGV0T3B0aW1pemF0aW9uKHVpbnQ2NFtdKXVpbnQ2NFtdCgljYWxsc3ViIGxldE9wdGltaXphdGlvbgoJaW50IDEKCXJldHVybgoKbGV0T3B0aW1pemF0aW9uOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMDQKCS8vIGFzc2VydChhWzBdKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWFzc2VydAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTA2CgkvLyBiID0gWzEsIDIsIDNdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCglmcmFtZV9idXJ5IC0xIC8vIGI6IHVpbnQ2NFtdCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMDgKCS8vIHJldHVybiBiOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglkdXAKCWxlbgoJaW50IDgKCS8KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3RhdGljQ29udHJhY3RQcm9wZXJ0aWVzKCl2b2lkCmFiaV9yb3V0ZV9zdGF0aWNDb250cmFjdFByb3BlcnRpZXM6CgkvLyBleGVjdXRlIHN0YXRpY0NvbnRyYWN0UHJvcGVydGllcygpdm9pZAoJY2FsbHN1YiBzdGF0aWNDb250cmFjdFByb3BlcnRpZXMKCWludCAxCglyZXR1cm4KCnN0YXRpY0NvbnRyYWN0UHJvcGVydGllczoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTEyCgkvLyBzZW5kQXBwQ2FsbCh7CgkvLyAgICAgICBhcHByb3ZhbFByb2dyYW06IER1bW15Q29udHJhY3QuYXBwcm92YWxQcm9ncmFtKCksCgkvLyAgICAgICBjbGVhclN0YXRlUHJvZ3JhbTogRHVtbXlDb250cmFjdC5jbGVhclByb2dyYW0oKSwKCS8vICAgICAgIGxvY2FsTnVtQnl0ZVNsaWNlOiBEdW1teUNvbnRyYWN0LnNjaGVtYS5sb2NhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICBsb2NhbE51bVVpbnQ6IER1bW15Q29udHJhY3Quc2NoZW1hLmxvY2FsLm51bVVpbnQsCgkvLyAgICAgICBnbG9iYWxOdW1CeXRlU2xpY2U6IER1bW15Q29udHJhY3Quc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICBnbG9iYWxOdW1VaW50OiBEdW1teUNvbnRyYWN0LnNjaGVtYS5nbG9iYWwubnVtVWludCwKCS8vICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjExMwoJLy8gYXBwcm92YWxQcm9ncmFtOiBEdW1teUNvbnRyYWN0LmFwcHJvdmFsUHJvZ3JhbSgpCglieXRlIGI2NCBDVEVZZ1FBTmdRWUxNUmtJalFFQUJBQ0JBVU9BQkxoRWV6WTJHZ0NPQWYvd0FBPT0KCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMTQKCS8vIGNsZWFyU3RhdGVQcm9ncmFtOiBEdW1teUNvbnRyYWN0LmNsZWFyUHJvZ3JhbSgpCglieXRlIGI2NCBDUT09CglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMTUKCS8vIGxvY2FsTnVtQnl0ZVNsaWNlOiBEdW1teUNvbnRyYWN0LnNjaGVtYS5sb2NhbC5udW1CeXRlU2xpY2UKCWludCAwCglpdHhuX2ZpZWxkIExvY2FsTnVtQnl0ZVNsaWNlCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMTYKCS8vIGxvY2FsTnVtVWludDogRHVtbXlDb250cmFjdC5zY2hlbWEubG9jYWwubnVtVWludAoJaW50IDAKCWl0eG5fZmllbGQgTG9jYWxOdW1VaW50CgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMTcKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogRHVtbXlDb250cmFjdC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZQoJaW50IDAKCWl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMTgKCS8vIGdsb2JhbE51bVVpbnQ6IER1bW15Q29udHJhY3Quc2NoZW1hLmdsb2JhbC5udW1VaW50CglpbnQgMAoJaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJcmV0c3ViCgovLyBudW1iZXJUb1N0cmluZygpdm9pZAphYmlfcm91dGVfbnVtYmVyVG9TdHJpbmc6CglieXRlIDB4OyBkdXAgLy8gcHVzaCBlbXB0eSBieXRlcyB0byBmaWxsIHRoZSBzdGFjayBmcmFtZSBmb3IgdGhpcyBzdWJyb3V0aW5lJ3MgbG9jYWwgdmFyaWFibGVzCgoJLy8gZXhlY3V0ZSBudW1iZXJUb1N0cmluZygpdm9pZAoJY2FsbHN1YiBudW1iZXJUb1N0cmluZwoJaW50IDEKCXJldHVybgoKbnVtYmVyVG9TdHJpbmc6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjEyMwoJLy8gbiA9IDEKCWludCAxCglmcmFtZV9idXJ5IC0xIC8vIG46IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTI0CgkvLyBzID0gJzEnCglieXRlIDB4MzEgLy8gIjEiCglmcmFtZV9idXJ5IC0yIC8vIHM6IGJ5dGVzCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMjUKCS8vIGFzc2VydChuLnRvU3RyaW5nKCkgPT09IHMpCglpbnQgMSAvLyBuOiB1aW50NjQKCWNhbGxzdWIgaXRvYQoJYnl0ZSAweDMxIC8vICIxIiAvLyBzOiBieXRlcwoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyBtZXRob2RPblBhcmVucygpdm9pZAphYmlfcm91dGVfbWV0aG9kT25QYXJlbnM6CgkvLyBleGVjdXRlIG1ldGhvZE9uUGFyZW5zKCl2b2lkCgljYWxsc3ViIG1ldGhvZE9uUGFyZW5zCglpbnQgMQoJcmV0dXJuCgptZXRob2RPblBhcmVuczoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTI5CgkvLyBhc3NlcnQoKDEgKyAyKS50b1N0cmluZygpID09PSAnMycpCglpbnQgMwoJY2FsbHN1YiBpdG9hCglieXRlIDB4MzMgLy8gIjMiCgk9PQoJYXNzZXJ0CglyZXRzdWIKCi8vIHN0cmluZ1N1YnN0cmluZygpdm9pZAphYmlfcm91dGVfc3RyaW5nU3Vic3RyaW5nOgoJYnl0ZSAweCAvLyBwdXNoIGVtcHR5IGJ5dGVzIHRvIGZpbGwgdGhlIHN0YWNrIGZyYW1lIGZvciB0aGlzIHN1YnJvdXRpbmUncyBsb2NhbCB2YXJpYWJsZXMKCgkvLyBleGVjdXRlIHN0cmluZ1N1YnN0cmluZygpdm9pZAoJY2FsbHN1YiBzdHJpbmdTdWJzdHJpbmcKCWludCAxCglyZXR1cm4KCnN0cmluZ1N1YnN0cmluZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTMzCgkvLyBzID0gJ2FiY2RlZicKCWJ5dGUgMHg2MTYyNjM2NDY1NjYgLy8gImFiY2RlZiIKCWZyYW1lX2J1cnkgLTEgLy8gczogYnl0ZXMKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjEzNAoJLy8gYXNzZXJ0KHMuc3Vic3RyaW5nKDEsIDMpID09PSAnYmMnKQoJYnl0ZSAweDYyNjMKCWJ5dGUgMHg2MjYzIC8vICJiYyIKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gaWRQcm9wZXJ0eSgpdm9pZAphYmlfcm91dGVfaWRQcm9wZXJ0eToKCWJ5dGUgMHg7IGR1cCAvLyBwdXNoIGVtcHR5IGJ5dGVzIHRvIGZpbGwgdGhlIHN0YWNrIGZyYW1lIGZvciB0aGlzIHN1YnJvdXRpbmUncyBsb2NhbCB2YXJpYWJsZXMKCgkvLyBleGVjdXRlIGlkUHJvcGVydHkoKXZvaWQKCWNhbGxzdWIgaWRQcm9wZXJ0eQoJaW50IDEKCXJldHVybgoKaWRQcm9wZXJ0eToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTM4CgkvLyBhcHAgPSBBcHBsaWNhdGlvbi56ZXJvSW5kZXgKCWludCAwCglmcmFtZV9idXJ5IC0xIC8vIGFwcDogYXBwbGljYXRpb24KCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjEzOQoJLy8gYXNzZXJ0KEFwcGxpY2F0aW9uLmZyb21JRChhcHAuaWQpID09PSBhcHApCglpbnQgMCAvLyBhcHA6IGFwcGxpY2F0aW9uCglpbnQgMCAvLyBhcHA6IGFwcGxpY2F0aW9uCgk9PQoJYXNzZXJ0CgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxNDEKCS8vIGFzYSA9IEFzc2V0Lnplcm9JbmRleAoJaW50IDAKCWZyYW1lX2J1cnkgLTIgLy8gYXNhOiBhc3NldAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTQyCgkvLyBhc3NlcnQoQXNzZXQuZnJvbUlEKGFzYS5pZCkgPT09IGFzYSkKCWludCAwIC8vIGFzYTogYXNzZXQKCWludCAwIC8vIGFzYTogYXNzZXQKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gc2NyYXRjaFNsb3QoKXZvaWQKYWJpX3JvdXRlX3NjcmF0Y2hTbG90OgoJLy8gZXhlY3V0ZSBzY3JhdGNoU2xvdCgpdm9pZAoJY2FsbHN1YiBzY3JhdGNoU2xvdAoJaW50IDEKCXJldHVybgoKc2NyYXRjaFNsb3Q6Cglwcm90byAwIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjE0NgoJLy8gdGhpcy5zY3JhdGNoLnZhbHVlID0gMTMzNwoJaW50IDEzMzcKCXN0b3JlIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjE0NwoJLy8gYXNzZXJ0KHRoaXMuc2NyYXRjaC52YWx1ZSA9PT0gMTMzNykKCWxvYWQgMAoJaW50IDEzMzcKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gZWNkc2EoKSh1aW50NTEyLHVpbnQ1MTIpCmFiaV9yb3V0ZV9lY2RzYToKCS8vIGV4ZWN1dGUgZWNkc2EoKSh1aW50NTEyLHVpbnQ1MTIpCgljYWxsc3ViIGVjZHNhCglpbnQgMQoJcmV0dXJuCgplY2RzYToKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTUxCgkvLyBlY2RzYV92ZXJpZnkoJ1NlY3AyNTZrMScsICcnIGFzIFN0YXRpY0FycmF5PGJ5dGUsIDMyPiwgMSwgMiwgMywgNCkKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC8vICIiCglieXRlIDB4MDEKCWJ5dGUgMHgwMgoJYnl0ZSAweDAzCglieXRlIDB4MDQKCWVjZHNhX3ZlcmlmeSBTZWNwMjU2azEKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjE1MgoJLy8gZWNkc2FfcGtfZGVjb21wcmVzcygnU2VjcDI1NmsxJywgJycgYXMgU3RhdGljQXJyYXk8Ynl0ZSwgMzM+KQoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAvLyAiIgoJZWNkc2FfcGtfZGVjb21wcmVzcyBTZWNwMjU2azEKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCXN3YXAKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCXN3YXAKCWNvbmNhdAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTUzCgkvLyByZXR1cm4gZWNkc2FfcGtfcmVjb3ZlcignU2VjcDI1NmsxJywgJycgYXMgU3RhdGljQXJyYXk8Ynl0ZSwgMzI+LCAxLCAyLCAzKTsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC8vICIiCglpbnQgMQoJYnl0ZSAweDAyCglieXRlIDB4MDMKCWVjZHNhX3BrX3JlY292ZXIgU2VjcDI1NmsxCglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglzd2FwCglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJaW50IDEKCXJldHVybgoKY3JlYXRlX05vT3A6CgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgllcnIKCmNhbGxfTm9PcDoKCW1ldGhvZCAidHhuVHlwZUVudW0oKXZvaWQiCgltZXRob2QgInR4bkdyb3VwTGVuZ3RoKCl2b2lkIgoJbWV0aG9kICJhc3NlcnRzKGJvb2wsYm9vbCl2b2lkIgoJbWV0aG9kICJ2ZXJpZnlUeG5Gcm9tQXJnKHBheSl2b2lkIgoJbWV0aG9kICJ2ZXJpZnlUeG5Gcm9tVHhuR3JvdXAoKXZvaWQiCgltZXRob2QgInZlcmlmeVR4bkNvbmRpdGlvbigpdm9pZCIKCW1ldGhvZCAidmVyaWZ5VHhuSW5jbHVkZWRJbigpdm9pZCIKCW1ldGhvZCAidmVyaWZ5VHhuTm90SW5jbHVkZWRJbigpdm9pZCIKCW1ldGhvZCAic3VibWl0UGVuZGluZ0dyb3VwKCl2b2lkIgoJbWV0aG9kICJtZXRob2RXaXRoVHhuQXJncygpdm9pZCIKCW1ldGhvZCAic2hpZnQoKXZvaWQiCgltZXRob2QgImZyb21CeXRlcygpdm9pZCIKCW1ldGhvZCAiZnJvbUlEKCl2b2lkIgoJbWV0aG9kICJiemVyb0Z1bmN0aW9uKCl2b2lkIgoJbWV0aG9kICJldmVudHMoKXZvaWQiCgltZXRob2QgImxldE9wdGltaXphdGlvbih1aW50NjRbXSl1aW50NjRbXSIKCW1ldGhvZCAic3RhdGljQ29udHJhY3RQcm9wZXJ0aWVzKCl2b2lkIgoJbWV0aG9kICJudW1iZXJUb1N0cmluZygpdm9pZCIKCW1ldGhvZCAibWV0aG9kT25QYXJlbnMoKXZvaWQiCgltZXRob2QgInN0cmluZ1N1YnN0cmluZygpdm9pZCIKCW1ldGhvZCAiaWRQcm9wZXJ0eSgpdm9pZCIKCW1ldGhvZCAic2NyYXRjaFNsb3QoKXZvaWQiCgltZXRob2QgImVjZHNhKCkodWludDUxMix1aW50NTEyKSIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoIGFiaV9yb3V0ZV90eG5UeXBlRW51bSBhYmlfcm91dGVfdHhuR3JvdXBMZW5ndGggYWJpX3JvdXRlX2Fzc2VydHMgYWJpX3JvdXRlX3ZlcmlmeVR4bkZyb21BcmcgYWJpX3JvdXRlX3ZlcmlmeVR4bkZyb21UeG5Hcm91cCBhYmlfcm91dGVfdmVyaWZ5VHhuQ29uZGl0aW9uIGFiaV9yb3V0ZV92ZXJpZnlUeG5JbmNsdWRlZEluIGFiaV9yb3V0ZV92ZXJpZnlUeG5Ob3RJbmNsdWRlZEluIGFiaV9yb3V0ZV9zdWJtaXRQZW5kaW5nR3JvdXAgYWJpX3JvdXRlX21ldGhvZFdpdGhUeG5BcmdzIGFiaV9yb3V0ZV9zaGlmdCBhYmlfcm91dGVfZnJvbUJ5dGVzIGFiaV9yb3V0ZV9mcm9tSUQgYWJpX3JvdXRlX2J6ZXJvRnVuY3Rpb24gYWJpX3JvdXRlX2V2ZW50cyBhYmlfcm91dGVfbGV0T3B0aW1pemF0aW9uIGFiaV9yb3V0ZV9zdGF0aWNDb250cmFjdFByb3BlcnRpZXMgYWJpX3JvdXRlX251bWJlclRvU3RyaW5nIGFiaV9yb3V0ZV9tZXRob2RPblBhcmVucyBhYmlfcm91dGVfc3RyaW5nU3Vic3RyaW5nIGFiaV9yb3V0ZV9pZFByb3BlcnR5IGFiaV9yb3V0ZV9zY3JhdGNoU2xvdCBhYmlfcm91dGVfZWNkc2EKCWVycgoKaW50VG9Bc2NpaToKCXByb3RvIDEgMQoJYnl0ZSAweDMwMzEzMjMzMzQzNTM2MzczODM5IC8vICIwMTIzNDU2Nzg5IgoJZnJhbWVfZGlnIC0xIC8vIGk6IHVpbnQ2NAoJaW50IDEKCWV4dHJhY3QzCglyZXRzdWIKCQoKaXRvYToKCXByb3RvIDEgMQoJZnJhbWVfZGlnIC0xIC8vIGk6IHVpbnQ2NAoJaW50IDAKCT09CglieiBpdG9hX2lmX2VuZAoJYnl0ZSAweDE1MWY3Yzc1MDAwMTMwCglsb2cKCXJldHN1YgoKaXRvYV9pZl9lbmQ6CglmcmFtZV9kaWcgLTEgLy8gaTogdWludDY0CglpbnQgMTAKCS8KCWludCAwCgk+CglieiBpdG9hX3Rlcm5hcnlfZmFsc2UKCWZyYW1lX2RpZyAtMSAvLyBpOiB1aW50NjQKCWludCAxMAoJLwoJY2FsbHN1YiBpdG9hCgliIGl0b2FfdGVybmFyeV9lbmQKCml0b2FfdGVybmFyeV9mYWxzZToKCWJ5dGUgMHggLy8gIiIKCml0b2FfdGVybmFyeV9lbmQ6CglmcmFtZV9kaWcgLTEgLy8gaTogdWludDY0CglpbnQgMTAKCSUKCWNhbGxzdWIgaW50VG9Bc2NpaQoJY29uY2F0CglyZXRzdWI=", + "approval": "I3ByYWdtYSB2ZXJzaW9uIDkKCi8vIFRoaXMgVEVBTCB3YXMgZ2VuZXJhdGVkIGJ5IFRFQUxTY3JpcHQgdjAuNjIuMQovLyBodHRwczovL2dpdGh1Yi5jb20vYWxnb3JhbmRmb3VuZGF0aW9uL1RFQUxTY3JpcHQKCi8vIFRoaXMgY29udHJhY3QgaXMgY29tcGxpYW50IHdpdGggYW5kL29yIGltcGxlbWVudHMgdGhlIGZvbGxvd2luZyBBUkNzOiBbIEFSQzQgXQoKLy8gVGhlIGZvbGxvd2luZyB0ZW4gbGluZXMgb2YgVEVBTCBoYW5kbGUgaW5pdGlhbCBwcm9ncmFtIGZsb3cKLy8gVGhpcyBwYXR0ZXJuIGlzIHVzZWQgdG8gbWFrZSBpdCBlYXN5IGZvciBhbnlvbmUgdG8gcGFyc2UgdGhlIHN0YXJ0IG9mIHRoZSBwcm9ncmFtIGFuZCBkZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyBhY3Rpb24gaXMgYWxsb3dlZAovLyBIZXJlLCBhY3Rpb24gcmVmZXJzIHRvIHRoZSBPbkNvbXBsZXRlIGluIGNvbWJpbmF0aW9uIHdpdGggd2hldGhlciB0aGUgYXBwIGlzIGJlaW5nIGNyZWF0ZWQgb3IgY2FsbGVkCi8vIEV2ZXJ5IHBvc3NpYmxlIGFjdGlvbiBmb3IgdGhpcyBjb250cmFjdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgc3dpdGNoIHN0YXRlbWVudAovLyBJZiB0aGUgYWN0aW9uIGlzIG5vdCBpbXBsbWVudGVkIGluIHRoZSBjb250cmFjdCwgaXRzIHJlcHNlY3RpdmUgYnJhbmNoIHdpbGwgYmUgIk5PVF9JTVBMTUVOVEVEIiB3aGljaCBqdXN0IGNvbnRhaW5zICJlcnIiCnR4biBBcHBsaWNhdGlvbklECmludCAwCj4KaW50IDYKKgp0eG4gT25Db21wbGV0aW9uCisKc3dpdGNoIGNyZWF0ZV9Ob09wIE5PVF9JTVBMRU1FTlRFRCBOT1RfSU1QTEVNRU5URUQgTk9UX0lNUExFTUVOVEVEIE5PVF9JTVBMRU1FTlRFRCBOT1RfSU1QTEVNRU5URUQgY2FsbF9Ob09wCgpOT1RfSU1QTEVNRU5URUQ6CgllcnIKCi8vIHR4blR5cGVFbnVtKCl2b2lkCmFiaV9yb3V0ZV90eG5UeXBlRW51bToKCS8vIGV4ZWN1dGUgdHhuVHlwZUVudW0oKXZvaWQKCWNhbGxzdWIgdHhuVHlwZUVudW0KCWludCAxCglyZXR1cm4KCnR4blR5cGVFbnVtOgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxOAoJLy8gYXNzZXJ0KHRoaXMudHhuR3JvdXBbMF0udHlwZUVudW0gPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwpCglpbnQgMAoJZ3R4bnMgVHlwZUVudW0KCWludCBhcHBsCgk9PQoJYXNzZXJ0CglyZXRzdWIKCi8vIHR4bkdyb3VwTGVuZ3RoKCl2b2lkCmFiaV9yb3V0ZV90eG5Hcm91cExlbmd0aDoKCS8vIGV4ZWN1dGUgdHhuR3JvdXBMZW5ndGgoKXZvaWQKCWNhbGxzdWIgdHhuR3JvdXBMZW5ndGgKCWludCAxCglyZXR1cm4KCnR4bkdyb3VwTGVuZ3RoOgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoyMgoJLy8gYXNzZXJ0KHRoaXMudHhuR3JvdXAubGVuZ3RoID09PSAxKQoJZ2xvYmFsIEdyb3VwU2l6ZQoJaW50IDEKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gYXNzZXJ0cyhib29sLGJvb2wpdm9pZAphYmlfcm91dGVfYXNzZXJ0czoKCS8vIGFyZzI6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWR1cAoJbGVuCglpbnQgMQoJPT0KCWFzc2VydAoJaW50IDAKCWdldGJpdAoKCS8vIGFyZzE6IGJvb2wKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWR1cAoJbGVuCglpbnQgMQoJPT0KCWFzc2VydAoJaW50IDAKCWdldGJpdAoKCS8vIGV4ZWN1dGUgYXNzZXJ0cyhib29sLGJvb2wpdm9pZAoJY2FsbHN1YiBhc3NlcnRzCglpbnQgMQoJcmV0dXJuCgphc3NlcnRzOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoyNgoJLy8gYXNzZXJ0KGFyZzEsIGFyZzIsIGFyZzEgPT09IGFyZzIpCglmcmFtZV9kaWcgLTEgLy8gYXJnMTogYm9vbAoJYXNzZXJ0CglmcmFtZV9kaWcgLTIgLy8gYXJnMjogYm9vbAoJYXNzZXJ0CglmcmFtZV9kaWcgLTEgLy8gYXJnMTogYm9vbAoJZnJhbWVfZGlnIC0yIC8vIGFyZzI6IGJvb2wKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5VHhuRnJvbUFyZyhwYXkpdm9pZAphYmlfcm91dGVfdmVyaWZ5VHhuRnJvbUFyZzoKCS8vIHNvbWVQYXk6IHBheQoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCglkdXAKCWd0eG5zIFR5cGVFbnVtCglpbnQgcGF5Cgk9PQoJYXNzZXJ0CgoJLy8gZXhlY3V0ZSB2ZXJpZnlUeG5Gcm9tQXJnKHBheSl2b2lkCgljYWxsc3ViIHZlcmlmeVR4bkZyb21BcmcKCWludCAxCglyZXR1cm4KCnZlcmlmeVR4bkZyb21Bcmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjMwCgkvLyB2ZXJpZnlUeG4oc29tZVBheSwgeyByZWNlaXZlcjogdGhpcy5hcHAuYWRkcmVzcywgYW1vdW50OiAxMDBfMDAwIH0pCgkvLyB2ZXJpZnkgcmVjZWl2ZXIKCWZyYW1lX2RpZyAtMSAvLyBzb21lUGF5OiBwYXkKCWd0eG5zIFJlY2VpdmVyCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJPT0KCWFzc2VydAoKCS8vIHZlcmlmeSBhbW91bnQKCWZyYW1lX2RpZyAtMSAvLyBzb21lUGF5OiBwYXkKCWd0eG5zIEFtb3VudAoJaW50IDEwMF8wMDAKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5VHhuRnJvbVR4bkdyb3VwKCl2b2lkCmFiaV9yb3V0ZV92ZXJpZnlUeG5Gcm9tVHhuR3JvdXA6CgkvLyBleGVjdXRlIHZlcmlmeVR4bkZyb21UeG5Hcm91cCgpdm9pZAoJY2FsbHN1YiB2ZXJpZnlUeG5Gcm9tVHhuR3JvdXAKCWludCAxCglyZXR1cm4KCnZlcmlmeVR4bkZyb21UeG5Hcm91cDoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MzQKCS8vIHZlcmlmeVR4bih0aGlzLnR4bkdyb3VwWzBdLCB7IHNlbmRlcjogdGhpcy50eG4uc2VuZGVyIH0pCgkvLyB2ZXJpZnkgc2VuZGVyCglpbnQgMAoJZ3R4bnMgU2VuZGVyCgl0eG4gU2VuZGVyCgk9PQoJYXNzZXJ0CglyZXRzdWIKCi8vIHZlcmlmeVR4bkNvbmRpdGlvbigpdm9pZAphYmlfcm91dGVfdmVyaWZ5VHhuQ29uZGl0aW9uOgoJLy8gZXhlY3V0ZSB2ZXJpZnlUeG5Db25kaXRpb24oKXZvaWQKCWNhbGxzdWIgdmVyaWZ5VHhuQ29uZGl0aW9uCglpbnQgMQoJcmV0dXJuCgp2ZXJpZnlUeG5Db25kaXRpb246Cglwcm90byAwIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjM4CgkvLyB2ZXJpZnlUeG4odGhpcy50eG4sIHsKCS8vICAgICAgIGFwcGxpY2F0aW9uSUQ6IHsgZ3JlYXRlclRoYW46IDEgfSwKCS8vICAgICB9KQoJLy8gdmVyaWZ5IGFwcGxpY2F0aW9uSUQKCXR4biBBcHBsaWNhdGlvbklECglpbnQgMQoJPgoJYXNzZXJ0CglyZXRzdWIKCi8vIHZlcmlmeVR4bkluY2x1ZGVkSW4oKXZvaWQKYWJpX3JvdXRlX3ZlcmlmeVR4bkluY2x1ZGVkSW46CgkvLyBleGVjdXRlIHZlcmlmeVR4bkluY2x1ZGVkSW4oKXZvaWQKCWNhbGxzdWIgdmVyaWZ5VHhuSW5jbHVkZWRJbgoJaW50IDEKCXJldHVybgoKdmVyaWZ5VHhuSW5jbHVkZWRJbjoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NDQKCS8vIHZlcmlmeVR4bih0aGlzLnR4biwgewoJLy8gICAgICAgc2VuZGVyOiB7IGluY2x1ZGVkSW46IFt0aGlzLnR4bi5zZW5kZXJdIH0sCgkvLyAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCXR4biBTZW5kZXIKCXR4biBTZW5kZXIKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gdmVyaWZ5VHhuTm90SW5jbHVkZWRJbigpdm9pZAphYmlfcm91dGVfdmVyaWZ5VHhuTm90SW5jbHVkZWRJbjoKCS8vIGV4ZWN1dGUgdmVyaWZ5VHhuTm90SW5jbHVkZWRJbigpdm9pZAoJY2FsbHN1YiB2ZXJpZnlUeG5Ob3RJbmNsdWRlZEluCglpbnQgMQoJcmV0dXJuCgp2ZXJpZnlUeG5Ob3RJbmNsdWRlZEluOgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo1MAoJLy8gdmVyaWZ5VHhuKHRoaXMudHhuLCB7CgkvLyAgICAgICBzZW5kZXI6IHsgbm90SW5jbHVkZWRJbjogW2dsb2JhbHMuemVyb0FkZHJlc3NdIH0sCgkvLyAgICAgfSkKCS8vIHZlcmlmeSBzZW5kZXIKCXR4biBTZW5kZXIKCWdsb2JhbCBaZXJvQWRkcmVzcwoJIT0KCWFzc2VydAoJcmV0c3ViCgovLyBzdWJtaXRQZW5kaW5nR3JvdXAoKXZvaWQKYWJpX3JvdXRlX3N1Ym1pdFBlbmRpbmdHcm91cDoKCS8vIGV4ZWN1dGUgc3VibWl0UGVuZGluZ0dyb3VwKCl2b2lkCgljYWxsc3ViIHN1Ym1pdFBlbmRpbmdHcm91cAoJaW50IDEKCXJldHVybgoKc3VibWl0UGVuZGluZ0dyb3VwOgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo1NgoJLy8gdGhpcy5wZW5kaW5nR3JvdXAuYWRkUGF5bWVudCh7IGFtb3VudDogMTAwXzAwMCwgcmVjZWl2ZXI6IHRoaXMuYXBwLmFkZHJlc3MgfSkKCWl0eG5fYmVnaW4KCWludCBwYXkKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjU2CgkvLyBhbW91bnQ6IDEwMF8wMDAKCWludCAxMDBfMDAwCglpdHhuX2ZpZWxkIEFtb3VudAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NTYKCS8vIHJlY2VpdmVyOiB0aGlzLmFwcC5hZGRyZXNzCglnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NTcKCS8vIHRoaXMucGVuZGluZ0dyb3VwLmFkZEFzc2V0Q3JlYXRpb24oeyBjb25maWdBc3NldFRvdGFsOiAxIH0pCglpdHhuX2JlZ2luCglpbnQgYWNmZwoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NTcKCS8vIGNvbmZpZ0Fzc2V0VG90YWw6IDEKCWludCAxCglpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjU4CgkvLyB0aGlzLnBlbmRpbmdHcm91cC5zdWJtaXQoKQoJaXR4bl9zdWJtaXQKCXJldHN1YgoKLy8gbWV0aG9kV2l0aFR4bkFyZ3MoKXZvaWQKYWJpX3JvdXRlX21ldGhvZFdpdGhUeG5BcmdzOgoJLy8gZXhlY3V0ZSBtZXRob2RXaXRoVHhuQXJncygpdm9pZAoJY2FsbHN1YiBtZXRob2RXaXRoVHhuQXJncwoJaW50IDEKCXJldHVybgoKbWV0aG9kV2l0aFR4bkFyZ3M6Cglwcm90byAwIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjYyCgkvLyBzZW5kTWV0aG9kQ2FsbDxbSW5uZXJQYXltZW50LCBJbm5lck1ldGhvZENhbGw8W3VpbnQ2NF0sIHZvaWQ+XSwgdm9pZD4oewoJLy8gICAgICAgbmFtZTogJ2ZvbycsCgkvLyAgICAgICBtZXRob2RBcmdzOiBbCgkvLyAgICAgICAgIHsgYW1vdW50OiAxMDBfMDAwLCByZWNlaXZlcjogdGhpcy50eG4uc2VuZGVyIH0sCgkvLyAgICAgICAgIHsKCS8vICAgICAgICAgICBuYW1lOiAnYmFyJywKCS8vICAgICAgICAgICBhcHBsaWNhdGlvbklEOiBBcHBsaWNhdGlvbi5mcm9tSUQoMTMzNyksCgkvLyAgICAgICAgICAgbWV0aG9kQXJnczogWzFdLAoJLy8gICAgICAgICB9LAoJLy8gICAgICAgXSwKCS8vICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IHBheQoJaXR4bl9maWVsZCBUeXBlRW51bQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NjUKCS8vIGFtb3VudDogMTAwXzAwMAoJaW50IDEwMF8wMDAKCWl0eG5fZmllbGQgQW1vdW50CgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo2NQoJLy8gcmVjZWl2ZXI6IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiYmFyKHVpbnQ2NCl2b2lkIgoJaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjY4CgkvLyBhcHBsaWNhdGlvbklEOiBBcHBsaWNhdGlvbi5mcm9tSUQoMTMzNykKCWludCAxMzM3CglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjY5CgkvLyBtZXRob2RBcmdzOiBbMV0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIEZlZSBmaWVsZCBub3Qgc2V0LCBkZWZhdWx0aW5nIHRvIDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCW1ldGhvZCAiZm9vKHBheSxhcHBsKXZvaWQiCglpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NjQKCS8vIG1ldGhvZEFyZ3M6IFsKCS8vICAgICAgICAgeyBhbW91bnQ6IDEwMF8wMDAsIHJlY2VpdmVyOiB0aGlzLnR4bi5zZW5kZXIgfSwKCS8vICAgICAgICAgewoJLy8gICAgICAgICAgIG5hbWU6ICdiYXInLAoJLy8gICAgICAgICAgIGFwcGxpY2F0aW9uSUQ6IEFwcGxpY2F0aW9uLmZyb21JRCgxMzM3KSwKCS8vICAgICAgICAgICBtZXRob2RBcmdzOiBbMV0sCgkvLyAgICAgICAgIH0sCgkvLyAgICAgICBdCgkvLyBGZWUgZmllbGQgbm90IHNldCwgZGVmYXVsdGluZyB0byAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCgkvLyBTdWJtaXQgaW5uZXIgdHJhbnNhY3Rpb24KCWl0eG5fc3VibWl0CglyZXRzdWIKCi8vIHNoaWZ0KCl2b2lkCmFiaV9yb3V0ZV9zaGlmdDoKCS8vIGV4ZWN1dGUgc2hpZnQoKXZvaWQKCWNhbGxzdWIgc2hpZnQKCWludCAxCglyZXR1cm4KCnNoaWZ0OgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo3NgoJLy8gYXNzZXJ0KDEgPDwgMiA9PT0gNCkKCWludCAxCglpbnQgMgoJc2hsCglpbnQgNAoJPT0KCWFzc2VydAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6NzcKCS8vIGFzc2VydCg0ID4+IDEgPT09IDIpCglpbnQgNAoJaW50IDEKCXNocgoJaW50IDIKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gZnJvbUJ5dGVzKCl2b2lkCmFiaV9yb3V0ZV9mcm9tQnl0ZXM6CgkvLyBleGVjdXRlIGZyb21CeXRlcygpdm9pZAoJY2FsbHN1YiBmcm9tQnl0ZXMKCWludCAxCglyZXR1cm4KCmZyb21CeXRlczoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6ODEKCS8vIGFzc2VydChBZGRyZXNzLmZyb21CeXRlcygnYWJjJykubWluQmFsYW5jZSkKCWJ5dGUgMHg2MTYyNjMgLy8gImFiYyIKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJYXNzZXJ0Cglhc3NlcnQKCXJldHN1YgoKLy8gZnJvbUlEKCl2b2lkCmFiaV9yb3V0ZV9mcm9tSUQ6CgkvLyBleGVjdXRlIGZyb21JRCgpdm9pZAoJY2FsbHN1YiBmcm9tSUQKCWludCAxCglyZXR1cm4KCmZyb21JRDoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6ODUKCS8vIGxvZyhBcHBsaWNhdGlvbi5mcm9tSUQoMTIzKS5jcmVhdG9yKQoJaW50IDEyMwoJYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgoJYXNzZXJ0Cglsb2cKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjg2CgkvLyBsb2coQXNzZXQuZnJvbUlEKDEyMykuY3JlYXRvcikKCWludCAxMjMKCWFzc2V0X3BhcmFtc19nZXQgQXNzZXRDcmVhdG9yCglhc3NlcnQKCWxvZwoJcmV0c3ViCgovLyBiemVyb0Z1bmN0aW9uKCl2b2lkCmFiaV9yb3V0ZV9iemVyb0Z1bmN0aW9uOgoJYnl0ZSAweDsgZHVwbiAzIC8vIHB1c2ggZW1wdHkgYnl0ZXMgdG8gZmlsbCB0aGUgc3RhY2sgZnJhbWUgZm9yIHRoaXMgc3Vicm91dGluZSdzIGxvY2FsIHZhcmlhYmxlcwoKCS8vIGV4ZWN1dGUgYnplcm9GdW5jdGlvbigpdm9pZAoJY2FsbHN1YiBiemVyb0Z1bmN0aW9uCglpbnQgMQoJcmV0dXJuCgpiemVyb0Z1bmN0aW9uOgoJcHJvdG8gNCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo5MAoJLy8gbiA9IDEKCWludCAxCglmcmFtZV9idXJ5IC0xIC8vIG46IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6OTEKCS8vIHg6IGJ5dGVzID0gYnplcm8oMikKCWJ5dGUgMHgwMDAwCglmcmFtZV9idXJ5IC0yIC8vIHg6IGJ5dGVzCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czo5MgoJLy8geTogYnl0ZXMgPSBiemVybyhuKQoJaW50IDEgLy8gbjogdWludDY0CgliemVybwoJZnJhbWVfYnVyeSAtMyAvLyB5OiBieXRlcwoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6OTMKCS8vIHo6IFt1aW50NjQsIHVpbnQ8OD5dID0gYnplcm88W3VpbnQ2NCwgdWludDw4Pl0+KCkKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAKCWZyYW1lX2J1cnkgLTQgLy8gejogW3VpbnQ2NCx1aW50OF0KCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjk0CgkvLyBhc3NlcnQobGVuKHggKyB5ICsgeikgPT09IDEyKQoJYnl0ZSAweDAwMDAgLy8geDogYnl0ZXMKCWZyYW1lX2RpZyAtMyAvLyB5OiBieXRlcwoJY29uY2F0CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwIC8vIHo6IFt1aW50NjQsdWludDhdCgljb25jYXQKCWxlbgoJaW50IDEyCgk9PQoJYXNzZXJ0CglyZXRzdWIKCi8vIGV2ZW50cygpdm9pZAphYmlfcm91dGVfZXZlbnRzOgoJLy8gZXhlY3V0ZSBldmVudHMoKXZvaWQKCWNhbGxzdWIgZXZlbnRzCglpbnQgMQoJcmV0dXJuCgpldmVudHM6Cglwcm90byAwIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjEwMAoJLy8gdGhpcy5teUV2ZW50LmxvZyh0aGlzLmFwcCwgMSkKCWJ5dGUgMHg4NzUyODE5NiAvLyBteUV2ZW50KHVpbnQ2NCx1aW50NjQpCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglpdG9iCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMQoJY29uY2F0Cgljb25jYXQKCWxvZwoJcmV0c3ViCgovLyBsZXRPcHRpbWl6YXRpb24odWludDY0W10pdWludDY0W10KYWJpX3JvdXRlX2xldE9wdGltaXphdGlvbjoKCS8vIGE6IHVpbnQ2NFtdCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoKCS8vIGV4ZWN1dGUgbGV0T3B0aW1pemF0aW9uKHVpbnQ2NFtdKXVpbnQ2NFtdCgljYWxsc3ViIGxldE9wdGltaXphdGlvbgoJaW50IDEKCXJldHVybgoKbGV0T3B0aW1pemF0aW9uOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMDQKCS8vIGFzc2VydChhWzBdKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglzdG9yZSAyNTUgLy8gZnVsbCBhcnJheQoJbG9hZCAyNTUgLy8gZnVsbCBhcnJheQoJZXh0cmFjdCAwIDgKCWJ0b2kKCWFzc2VydAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTA2CgkvLyBiID0gWzEsIDIsIDNdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCglmcmFtZV9idXJ5IC0xIC8vIGI6IHVpbnQ2NFtdCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMDgKCS8vIHJldHVybiBiOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglkdXAKCWxlbgoJaW50IDgKCS8KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKLy8gc3RhdGljQ29udHJhY3RQcm9wZXJ0aWVzKCl2b2lkCmFiaV9yb3V0ZV9zdGF0aWNDb250cmFjdFByb3BlcnRpZXM6CgkvLyBleGVjdXRlIHN0YXRpY0NvbnRyYWN0UHJvcGVydGllcygpdm9pZAoJY2FsbHN1YiBzdGF0aWNDb250cmFjdFByb3BlcnRpZXMKCWludCAxCglyZXR1cm4KCnN0YXRpY0NvbnRyYWN0UHJvcGVydGllczoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTEyCgkvLyBzZW5kQXBwQ2FsbCh7CgkvLyAgICAgICBhcHByb3ZhbFByb2dyYW06IER1bW15Q29udHJhY3QuYXBwcm92YWxQcm9ncmFtKCksCgkvLyAgICAgICBjbGVhclN0YXRlUHJvZ3JhbTogRHVtbXlDb250cmFjdC5jbGVhclByb2dyYW0oKSwKCS8vICAgICAgIGxvY2FsTnVtQnl0ZVNsaWNlOiBEdW1teUNvbnRyYWN0LnNjaGVtYS5sb2NhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICBsb2NhbE51bVVpbnQ6IER1bW15Q29udHJhY3Quc2NoZW1hLmxvY2FsLm51bVVpbnQsCgkvLyAgICAgICBnbG9iYWxOdW1CeXRlU2xpY2U6IER1bW15Q29udHJhY3Quc2NoZW1hLmdsb2JhbC5udW1CeXRlU2xpY2UsCgkvLyAgICAgICBnbG9iYWxOdW1VaW50OiBEdW1teUNvbnRyYWN0LnNjaGVtYS5nbG9iYWwubnVtVWludCwKCS8vICAgICB9KQoJaXR4bl9iZWdpbgoJaW50IGFwcGwKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjExMwoJLy8gYXBwcm92YWxQcm9ncmFtOiBEdW1teUNvbnRyYWN0LmFwcHJvdmFsUHJvZ3JhbSgpCglieXRlIGI2NCBDVEVZZ1FBTmdRWUxNUmtJalFFQUJBQ0JBVU9BQkxoRWV6WTJHZ0NPQWYvd0FBPT0KCWl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMTQKCS8vIGNsZWFyU3RhdGVQcm9ncmFtOiBEdW1teUNvbnRyYWN0LmNsZWFyUHJvZ3JhbSgpCglieXRlIGI2NCBDUT09CglpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMTUKCS8vIGxvY2FsTnVtQnl0ZVNsaWNlOiBEdW1teUNvbnRyYWN0LnNjaGVtYS5sb2NhbC5udW1CeXRlU2xpY2UKCWludCAwCglpdHhuX2ZpZWxkIExvY2FsTnVtQnl0ZVNsaWNlCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMTYKCS8vIGxvY2FsTnVtVWludDogRHVtbXlDb250cmFjdC5zY2hlbWEubG9jYWwubnVtVWludAoJaW50IDAKCWl0eG5fZmllbGQgTG9jYWxOdW1VaW50CgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMTcKCS8vIGdsb2JhbE51bUJ5dGVTbGljZTogRHVtbXlDb250cmFjdC5zY2hlbWEuZ2xvYmFsLm51bUJ5dGVTbGljZQoJaW50IDAKCWl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMTgKCS8vIGdsb2JhbE51bVVpbnQ6IER1bW15Q29udHJhY3Quc2NoZW1hLmdsb2JhbC5udW1VaW50CglpbnQgMAoJaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CgoJLy8gRmVlIGZpZWxkIG5vdCBzZXQsIGRlZmF1bHRpbmcgdG8gMAoJaW50IDAKCWl0eG5fZmllbGQgRmVlCgoJLy8gU3VibWl0IGlubmVyIHRyYW5zYWN0aW9uCglpdHhuX3N1Ym1pdAoJcmV0c3ViCgovLyBudW1iZXJUb1N0cmluZygpdm9pZAphYmlfcm91dGVfbnVtYmVyVG9TdHJpbmc6CglieXRlIDB4OyBkdXAgLy8gcHVzaCBlbXB0eSBieXRlcyB0byBmaWxsIHRoZSBzdGFjayBmcmFtZSBmb3IgdGhpcyBzdWJyb3V0aW5lJ3MgbG9jYWwgdmFyaWFibGVzCgoJLy8gZXhlY3V0ZSBudW1iZXJUb1N0cmluZygpdm9pZAoJY2FsbHN1YiBudW1iZXJUb1N0cmluZwoJaW50IDEKCXJldHVybgoKbnVtYmVyVG9TdHJpbmc6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjEyMwoJLy8gbiA9IDEKCWludCAxCglmcmFtZV9idXJ5IC0xIC8vIG46IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTI0CgkvLyBzID0gJzEnCglieXRlIDB4MzEgLy8gIjEiCglmcmFtZV9idXJ5IC0yIC8vIHM6IGJ5dGVzCgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxMjUKCS8vIGFzc2VydChuLnRvU3RyaW5nKCkgPT09IHMpCglpbnQgMSAvLyBuOiB1aW50NjQKCWNhbGxzdWIgaXRvYQoJYnl0ZSAweDMxIC8vICIxIiAvLyBzOiBieXRlcwoJPT0KCWFzc2VydAoJcmV0c3ViCgovLyBtZXRob2RPblBhcmVucygpdm9pZAphYmlfcm91dGVfbWV0aG9kT25QYXJlbnM6CgkvLyBleGVjdXRlIG1ldGhvZE9uUGFyZW5zKCl2b2lkCgljYWxsc3ViIG1ldGhvZE9uUGFyZW5zCglpbnQgMQoJcmV0dXJuCgptZXRob2RPblBhcmVuczoKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTI5CgkvLyBhc3NlcnQoKDEgKyAyKS50b1N0cmluZygpID09PSAnMycpCglpbnQgMwoJY2FsbHN1YiBpdG9hCglieXRlIDB4MzMgLy8gIjMiCgk9PQoJYXNzZXJ0CglyZXRzdWIKCi8vIHN0cmluZ1N1YnN0cmluZygpdm9pZAphYmlfcm91dGVfc3RyaW5nU3Vic3RyaW5nOgoJYnl0ZSAweCAvLyBwdXNoIGVtcHR5IGJ5dGVzIHRvIGZpbGwgdGhlIHN0YWNrIGZyYW1lIGZvciB0aGlzIHN1YnJvdXRpbmUncyBsb2NhbCB2YXJpYWJsZXMKCgkvLyBleGVjdXRlIHN0cmluZ1N1YnN0cmluZygpdm9pZAoJY2FsbHN1YiBzdHJpbmdTdWJzdHJpbmcKCWludCAxCglyZXR1cm4KCnN0cmluZ1N1YnN0cmluZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTMzCgkvLyBzID0gJ2FiY2RlZicKCWJ5dGUgMHg2MTYyNjM2NDY1NjYgLy8gImFiY2RlZiIKCWZyYW1lX2J1cnkgLTEgLy8gczogYnl0ZXMKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjEzNAoJLy8gYXNzZXJ0KHMuc3Vic3RyaW5nKDEsIDMpID09PSAnYmMnKQoJYnl0ZSAweDYyNjMKCWJ5dGUgMHg2MjYzIC8vICJiYyIKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gaWRQcm9wZXJ0eSgpdm9pZAphYmlfcm91dGVfaWRQcm9wZXJ0eToKCWJ5dGUgMHg7IGR1cCAvLyBwdXNoIGVtcHR5IGJ5dGVzIHRvIGZpbGwgdGhlIHN0YWNrIGZyYW1lIGZvciB0aGlzIHN1YnJvdXRpbmUncyBsb2NhbCB2YXJpYWJsZXMKCgkvLyBleGVjdXRlIGlkUHJvcGVydHkoKXZvaWQKCWNhbGxzdWIgaWRQcm9wZXJ0eQoJaW50IDEKCXJldHVybgoKaWRQcm9wZXJ0eToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTM4CgkvLyBhcHAgPSBBcHBsaWNhdGlvbi56ZXJvSW5kZXgKCWludCAwCglmcmFtZV9idXJ5IC0xIC8vIGFwcDogYXBwbGljYXRpb24KCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjEzOQoJLy8gYXNzZXJ0KEFwcGxpY2F0aW9uLmZyb21JRChhcHAuaWQpID09PSBhcHApCglpbnQgMCAvLyBhcHA6IGFwcGxpY2F0aW9uCglpbnQgMCAvLyBhcHA6IGFwcGxpY2F0aW9uCgk9PQoJYXNzZXJ0CgoJLy8gdGVzdHMvY29udHJhY3RzL2dlbmVyYWwuYWxnby50czoxNDEKCS8vIGFzYSA9IEFzc2V0Lnplcm9JbmRleAoJaW50IDAKCWZyYW1lX2J1cnkgLTIgLy8gYXNhOiBhc3NldAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTQyCgkvLyBhc3NlcnQoQXNzZXQuZnJvbUlEKGFzYS5pZCkgPT09IGFzYSkKCWludCAwIC8vIGFzYTogYXNzZXQKCWludCAwIC8vIGFzYTogYXNzZXQKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gc2NyYXRjaFNsb3QoKXZvaWQKYWJpX3JvdXRlX3NjcmF0Y2hTbG90OgoJLy8gZXhlY3V0ZSBzY3JhdGNoU2xvdCgpdm9pZAoJY2FsbHN1YiBzY3JhdGNoU2xvdAoJaW50IDEKCXJldHVybgoKc2NyYXRjaFNsb3Q6Cglwcm90byAwIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjE0NgoJLy8gdGhpcy5zY3JhdGNoLnZhbHVlID0gMTMzNwoJaW50IDEzMzcKCXN0b3JlIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjE0NwoJLy8gYXNzZXJ0KHRoaXMuc2NyYXRjaC52YWx1ZSA9PT0gMTMzNykKCWxvYWQgMAoJaW50IDEzMzcKCT09Cglhc3NlcnQKCXJldHN1YgoKLy8gZWNkc2EoKSh1aW50MjU2LHVpbnQyNTYpCmFiaV9yb3V0ZV9lY2RzYToKCS8vIGV4ZWN1dGUgZWNkc2EoKSh1aW50MjU2LHVpbnQyNTYpCgljYWxsc3ViIGVjZHNhCglpbnQgMQoJcmV0dXJuCgplY2RzYToKCXByb3RvIDAgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTUxCgkvLyBlY2RzYV92ZXJpZnkoJ1NlY3AyNTZrMScsICcnIGFzIFN0YXRpY0FycmF5PGJ5dGUsIDMyPiwgMSwgMiwgMywgNCkKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC8vICIiCglieXRlIDB4MDEKCWJ5dGUgMHgwMgoJYnl0ZSAweDAzCglieXRlIDB4MDQKCWVjZHNhX3ZlcmlmeSBTZWNwMjU2azEKCgkvLyB0ZXN0cy9jb250cmFjdHMvZ2VuZXJhbC5hbGdvLnRzOjE1MgoJLy8gZWNkc2FfcGtfZGVjb21wcmVzcygnU2VjcDI1NmsxJywgJycgYXMgU3RhdGljQXJyYXk8Ynl0ZSwgMzM+KQoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAvLyAiIgoJZWNkc2FfcGtfZGVjb21wcmVzcyBTZWNwMjU2azEKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCXN3YXAKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRgoJYiYKCXN3YXAKCWNvbmNhdAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9nZW5lcmFsLmFsZ28udHM6MTUzCgkvLyByZXR1cm4gZWNkc2FfcGtfcmVjb3ZlcignU2VjcDI1NmsxJywgJycgYXMgU3RhdGljQXJyYXk8Ynl0ZSwgMzI+LCAxLCAyLCAzKTsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC8vICIiCglpbnQgMQoJYnl0ZSAweDAyCglieXRlIDB4MDMKCWVjZHNhX3BrX3JlY292ZXIgU2VjcDI1NmsxCglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglzd2FwCglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYKCWImCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uOgoJaW50IDEKCXJldHVybgoKY3JlYXRlX05vT3A6CgltZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggYWJpX3JvdXRlX2NyZWF0ZUFwcGxpY2F0aW9uCgllcnIKCmNhbGxfTm9PcDoKCW1ldGhvZCAidHhuVHlwZUVudW0oKXZvaWQiCgltZXRob2QgInR4bkdyb3VwTGVuZ3RoKCl2b2lkIgoJbWV0aG9kICJhc3NlcnRzKGJvb2wsYm9vbCl2b2lkIgoJbWV0aG9kICJ2ZXJpZnlUeG5Gcm9tQXJnKHBheSl2b2lkIgoJbWV0aG9kICJ2ZXJpZnlUeG5Gcm9tVHhuR3JvdXAoKXZvaWQiCgltZXRob2QgInZlcmlmeVR4bkNvbmRpdGlvbigpdm9pZCIKCW1ldGhvZCAidmVyaWZ5VHhuSW5jbHVkZWRJbigpdm9pZCIKCW1ldGhvZCAidmVyaWZ5VHhuTm90SW5jbHVkZWRJbigpdm9pZCIKCW1ldGhvZCAic3VibWl0UGVuZGluZ0dyb3VwKCl2b2lkIgoJbWV0aG9kICJtZXRob2RXaXRoVHhuQXJncygpdm9pZCIKCW1ldGhvZCAic2hpZnQoKXZvaWQiCgltZXRob2QgImZyb21CeXRlcygpdm9pZCIKCW1ldGhvZCAiZnJvbUlEKCl2b2lkIgoJbWV0aG9kICJiemVyb0Z1bmN0aW9uKCl2b2lkIgoJbWV0aG9kICJldmVudHMoKXZvaWQiCgltZXRob2QgImxldE9wdGltaXphdGlvbih1aW50NjRbXSl1aW50NjRbXSIKCW1ldGhvZCAic3RhdGljQ29udHJhY3RQcm9wZXJ0aWVzKCl2b2lkIgoJbWV0aG9kICJudW1iZXJUb1N0cmluZygpdm9pZCIKCW1ldGhvZCAibWV0aG9kT25QYXJlbnMoKXZvaWQiCgltZXRob2QgInN0cmluZ1N1YnN0cmluZygpdm9pZCIKCW1ldGhvZCAiaWRQcm9wZXJ0eSgpdm9pZCIKCW1ldGhvZCAic2NyYXRjaFNsb3QoKXZvaWQiCgltZXRob2QgImVjZHNhKCkodWludDI1Nix1aW50MjU2KSIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoIGFiaV9yb3V0ZV90eG5UeXBlRW51bSBhYmlfcm91dGVfdHhuR3JvdXBMZW5ndGggYWJpX3JvdXRlX2Fzc2VydHMgYWJpX3JvdXRlX3ZlcmlmeVR4bkZyb21BcmcgYWJpX3JvdXRlX3ZlcmlmeVR4bkZyb21UeG5Hcm91cCBhYmlfcm91dGVfdmVyaWZ5VHhuQ29uZGl0aW9uIGFiaV9yb3V0ZV92ZXJpZnlUeG5JbmNsdWRlZEluIGFiaV9yb3V0ZV92ZXJpZnlUeG5Ob3RJbmNsdWRlZEluIGFiaV9yb3V0ZV9zdWJtaXRQZW5kaW5nR3JvdXAgYWJpX3JvdXRlX21ldGhvZFdpdGhUeG5BcmdzIGFiaV9yb3V0ZV9zaGlmdCBhYmlfcm91dGVfZnJvbUJ5dGVzIGFiaV9yb3V0ZV9mcm9tSUQgYWJpX3JvdXRlX2J6ZXJvRnVuY3Rpb24gYWJpX3JvdXRlX2V2ZW50cyBhYmlfcm91dGVfbGV0T3B0aW1pemF0aW9uIGFiaV9yb3V0ZV9zdGF0aWNDb250cmFjdFByb3BlcnRpZXMgYWJpX3JvdXRlX251bWJlclRvU3RyaW5nIGFiaV9yb3V0ZV9tZXRob2RPblBhcmVucyBhYmlfcm91dGVfc3RyaW5nU3Vic3RyaW5nIGFiaV9yb3V0ZV9pZFByb3BlcnR5IGFiaV9yb3V0ZV9zY3JhdGNoU2xvdCBhYmlfcm91dGVfZWNkc2EKCWVycgoKaW50VG9Bc2NpaToKCXByb3RvIDEgMQoJYnl0ZSAweDMwMzEzMjMzMzQzNTM2MzczODM5IC8vICIwMTIzNDU2Nzg5IgoJZnJhbWVfZGlnIC0xIC8vIGk6IHVpbnQ2NAoJaW50IDEKCWV4dHJhY3QzCglyZXRzdWIKCQoKaXRvYToKCXByb3RvIDEgMQoJZnJhbWVfZGlnIC0xIC8vIGk6IHVpbnQ2NAoJaW50IDAKCT09CglieiBpdG9hX2lmX2VuZAoJYnl0ZSAweDE1MWY3Yzc1MDAwMTMwCglsb2cKCXJldHN1YgoKaXRvYV9pZl9lbmQ6CglmcmFtZV9kaWcgLTEgLy8gaTogdWludDY0CglpbnQgMTAKCS8KCWludCAwCgk+CglieiBpdG9hX3Rlcm5hcnlfZmFsc2UKCWZyYW1lX2RpZyAtMSAvLyBpOiB1aW50NjQKCWludCAxMAoJLwoJY2FsbHN1YiBpdG9hCgliIGl0b2FfdGVybmFyeV9lbmQKCml0b2FfdGVybmFyeV9mYWxzZToKCWJ5dGUgMHggLy8gIiIKCml0b2FfdGVybmFyeV9lbmQ6CglmcmFtZV9kaWcgLTEgLy8gaTogdWludDY0CglpbnQgMTAKCSUKCWNhbGxzdWIgaW50VG9Bc2NpaQoJY29uY2F0CglyZXRzdWI=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDk=" }, "contract": { @@ -382,7 +382,7 @@ "args": [], "desc": "", "returns": { - "type": "(uint512,uint512)", + "type": "(uint256,uint256)", "desc": "" } }, diff --git a/tests/contracts/artifacts/GeneralTest.arc4.json b/tests/contracts/artifacts/GeneralTest.arc4.json index 504fe2dd7..740b6cf44 100644 --- a/tests/contracts/artifacts/GeneralTest.arc4.json +++ b/tests/contracts/artifacts/GeneralTest.arc4.json @@ -228,7 +228,7 @@ "args": [], "desc": "", "returns": { - "type": "(uint512,uint512)", + "type": "(uint256,uint256)", "desc": "" } }, diff --git a/tests/contracts/general.algo.ts b/tests/contracts/general.algo.ts index 87b619552..bd6e67782 100644 --- a/tests/contracts/general.algo.ts +++ b/tests/contracts/general.algo.ts @@ -147,7 +147,7 @@ class GeneralTest extends Contract { assert(this.scratch.value === 1337); } - ecdsa(): [uint<512>, uint<512>] { + ecdsa(): [uint<256>, uint<256>] { ecdsa_verify('Secp256k1', '' as StaticArray, 1, 2, 3, 4); ecdsa_pk_decompress('Secp256k1', '' as StaticArray); return ecdsa_pk_recover('Secp256k1', '' as StaticArray, 1, 2, 3); diff --git a/types/global.d.ts b/types/global.d.ts index de1756ce4..dde5c4381 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -857,10 +857,10 @@ declare function sha3_256(data: BytesLike): StaticArray; declare function ecdsa_verify( curve: 'Secp256k1' | 'Secp256r1', data: StaticArray, - sSignatureComponent: uint<512>, - rSignatureComponent: uint<512>, - xPubkeyComponent: uint<512>, - yPubkeyComponent: uint<512> + sSignatureComponent: uint<256>, + rSignatureComponent: uint<256>, + xPubkeyComponent: uint<256>, + yPubkeyComponent: uint<256> ): boolean; /** @@ -873,7 +873,7 @@ declare function ecdsa_verify( declare function ecdsa_pk_decompress( curve: 'Secp256k1' | 'Secp256r1', pubKey: StaticArray -): [uint<512>, uint<512>]; +): [uint<256>, uint<256>]; /** * @@ -889,9 +889,9 @@ declare function ecdsa_pk_recover( curve: 'Secp256k1' | 'Secp256r1', data: StaticArray, recoveryID: uint64, - sSignatureComponent: uint<512>, - rSignatureComponent: uint<512> -): [uint<512>, uint<512>]; + sSignatureComponent: uint<256>, + rSignatureComponent: uint<256> +): [uint<256>, uint<256>]; /** * Returns zero bytes of the given size.