From e10968e045bfdeeb6be0417397c599931ec69b65 Mon Sep 17 00:00:00 2001 From: Joe Polny <50534337+joe-p@users.noreply.github.com> Date: Sat, 29 Apr 2023 10:27:17 -0400 Subject: [PATCH] 0.11: Unrestricted tuples (#39) * array refactor WIP * fix dynamicArrayElements WIP * tuple refactor WIP * working returnDynamicArrayFromTuple WIP * replace err() with throw Error() * extractDynamicTupleElement WIP * tuple refactor WIP * tuples: string -> bytes, custom types WIP * support encoding strings in tuples WIP * fix extractDynamicTupleElement WIP * fix tuple string updates WIP * fix objects and custom tuple types WIP * fix static arrays of dynamic types WIP * working non-nested tests WIP * remove processStaticArrayElement WIP * update_dynamic_tuple_element subroutine WIP * reduce update_dynamic_tuple_element scratch usage WIP * update_dynamic_head subroutine * all tests passing * fix dynamic array element access in tuples * updateDynamicArrayInMiddleOfTuple * update example clients * add algokit to ci * 0.11 --- .github/workflows/ci.yml | 4 +- examples/arc75/arc75_client.ts | 2 +- examples/arc75/artifacts/ARC75.approval.teal | 169 +- examples/arc75/artifacts/ARC75.json | 2 +- examples/arc75/artifacts/ARC75.src_map.json | 1309 +- .../merkle/artifacts/MerkleTree.approval.teal | 4 +- examples/merkle/artifacts/MerkleTree.json | 2 +- .../merkle/artifacts/merkletree_client.ts | 2 +- examples/tuple_in_box/app.algo.ts | 2 +- .../ContactsApp.approval.teal | 364 +- .../tealscript_artifacts/ContactsApp.json | 2 +- .../ContactsApp.src_map.json | 1350 +- .../contactsapp_client.ts | 2 +- package.json | 2 +- pages/abi.md | 4 +- src/lib/compiler.ts | 788 +- tests/abi.test.ts | 43 +- tests/contracts/AbiTest.abi.json | 69 +- tests/contracts/AbiTest.approval.teal | 4010 +++-- tests/contracts/AbiTest.json | 2 +- tests/contracts/AbiTest.src_map.json | 13324 +++++++++------- tests/contracts/abi.algo.ts | 44 +- tests/contracts/clients/abitest_client.ts | 60 +- tests/contracts/clients/loopstest_client.ts | 2 +- 24 files changed, 12813 insertions(+), 8749 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d88d71a23..12c2a7ea6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,8 +8,8 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Run sandbox - run: git clone https://github.com/algorand/sandbox && ./sandbox/sandbox up -v dev + - name: Run algokit localnet + run: pipx install algokit && algokit localnet start - name: Install modules run: yarn diff --git a/examples/arc75/arc75_client.ts b/examples/arc75/arc75_client.ts index 1f8da172a..ca3eb2dee 100644 --- a/examples/arc75/arc75_client.ts +++ b/examples/arc75/arc75_client.ts @@ -4,7 +4,7 @@ export class ARC75 extends bkr.ApplicationClient { desc: string = ""; override appSchema: bkr.Schema = { declared: {}, reserved: {} }; override acctSchema: bkr.Schema = { declared: {}, reserved: {} }; - override approvalProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCXBvcAoJY2FsbHN1YiBjcmVhdGUKCWludCAxCglyZXR1cm4KCmNyZWF0ZToKCXByb3RvIDAgMAoJcmV0c3ViCgp2ZXJpZnlNQlJQYXltZW50OgoJcHJvdG8gMiAwCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoxMwoJLy8gYXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSB0aGlzLmFwcC5hZGRyZXNzLm1pbkJhbGFuY2UgLSBwcmVNQlIpCglmcmFtZV9kaWcgLTEgLy8gcGF5bWVudDogcGF5CglndHhucyBBbW91bnQKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglhc3NlcnQKCWZyYW1lX2RpZyAtMiAvLyBwcmVNQlI6IHVpbnQ2NAoJLQoJPT0KCWFzc2VydAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MTQKCS8vIGFzc2VydChwYXltZW50LnJlY2VpdmVyID09PSB0aGlzLmFwcC5hZGRyZXNzKQoJZnJhbWVfZGlnIC0xIC8vIHBheW1lbnQ6IHBheQoJZ3R4bnMgUmVjZWl2ZXIKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJPT0KCWFzc2VydAoJcmV0c3ViCgpzZW5kTUJSUGF5bWVudDoKCXByb3RvIDEgMAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MTgKCS8vIHNlbmRQYXltZW50KHsKCWl0eG5fYmVnaW4KCWludCBwYXkKCWl0eG5fZmllbGQgVHlwZUVudW0KCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjE5CgkvLyBzZW5kZXI6IHRoaXMuYXBwLmFkZHJlc3MKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJaXR4bl9maWVsZCBTZW5kZXIKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjIwCgkvLyByZWNlaXZlcjogdGhpcy50eG4uc2VuZGVyCgl0eG4gU2VuZGVyCglpdHhuX2ZpZWxkIFJlY2VpdmVyCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoyMQoJLy8gYW1vdW50OiBwcmVNQlIgLSB0aGlzLmFwcC5hZGRyZXNzLm1pbkJhbGFuY2UKCWZyYW1lX2RpZyAtMSAvLyBwcmVNQlI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJYXNzZXJ0CglhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKCWFzc2VydAoJLQoJaXR4bl9maWVsZCBBbW91bnQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjIyCgkvLyBmZWU6IDAKCWludCAwCglpdHhuX2ZpZWxkIEZlZQoJaXR4bl9zdWJtaXQKCXJldHN1YgoKYWJpX3JvdXRlX2FkZEFwcFRvV2hpdGVMaXN0OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDIKCXR4biBHcm91cEluZGV4CglpbnQgMQoJLQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgYWRkQXBwVG9XaGl0ZUxpc3QKCWludCAxCglyZXR1cm4KCmFkZEFwcFRvV2hpdGVMaXN0OgoJcHJvdG8gNyAwCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czozNgoJLy8gcHJlTUJSID0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJYXNzZXJ0CglmcmFtZV9idXJ5IC01IC8vIHByZU1CUjogdWludDY0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czozNwoJLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QgPSB7IGFjY291bnQ6IHRoaXMudHhuLnNlbmRlciwgYm94SW5kZXg6IGJveEluZGV4LCBhcmM6IGFyYyB9Cgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gYm94SW5kZXg6IHVpbnQxNgoJY29uY2F0CglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDI0IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDM2CglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWJ5dGUgMHgKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWZyYW1lX2RpZyAtMSAvLyBhcmM6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CgoJLy8gaWYwX2NvbmRpdGlvbgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czozOQoJLy8gdGhpcy53aGl0ZWxpc3QuZXhpc3RzKHdoaXRlbGlzdCkKCWZyYW1lX2RpZyAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2dldAoJc3dhcAoJcG9wCglieiBpZjBfZWxzZQoKCS8vIGlmMF9jb25zZXF1ZW50CgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjQwCgkvLyB0aGlzLndoaXRlbGlzdC5nZXQod2hpdGVsaXN0KS5wdXNoKGFwcElEKQoJZnJhbWVfZGlnIC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0Cglib3hfZ2V0Cglhc3NlcnQKCWR1cAoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWV4dHJhY3QgMiAwCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBhcHBJRDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJZHVwCglib3hfZGVsCglwb3AKCXN3YXAKCWJveF9wdXQKCWIgaWYwX2VuZAoKaWYwX2Vsc2U6CgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjQyCgkvLyBuZXdXaGl0ZWxpc3Q6IHVpbnQ2NFtdID0gW2FwcElEXQoJYnl0ZSAweDAwMDEKCWZyYW1lX2RpZyAtMyAvLyBhcHBJRDogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2J1cnkgLTcgLy8gbmV3V2hpdGVsaXN0OiB1aW50NjRbXQoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NDMKCS8vIHRoaXMud2hpdGVsaXN0LnB1dCh3aGl0ZWxpc3QsIG5ld1doaXRlbGlzdCkKCWZyYW1lX2RpZyAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJZHVwCglib3hfZGVsCglwb3AKCWZyYW1lX2RpZyAtNyAvLyBuZXdXaGl0ZWxpc3Q6IHVpbnQ2NFtdCglib3hfcHV0CgppZjBfZW5kOgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo0NgoJLy8gdGhpcy52ZXJpZnlNQlJQYXltZW50KHBheW1lbnQsIHByZU1CUikKCWJ5dGUgMHgKCXBvcAoJZnJhbWVfZGlnIC01IC8vIHByZU1CUjogdWludDY0CglmcmFtZV9kaWcgLTQgLy8gcGF5bWVudDogcGF5CgljYWxsc3ViIHZlcmlmeU1CUlBheW1lbnQKCXJldHN1YgoKYWJpX3JvdXRlX3NldEFwcFdoaXRlbGlzdDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAxCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBzZXRBcHBXaGl0ZWxpc3QKCWludCAxCglyZXR1cm4KCnNldEFwcFdoaXRlbGlzdDoKCXByb3RvIDUgMAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NTgKCS8vIHByZU1CUiA9IHRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZQoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJYXNzZXJ0CglhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKCWFzc2VydAoJZnJhbWVfYnVyeSAtNCAvLyBwcmVNQlI6IHVpbnQ2NAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NTkKCS8vIHdoaXRlbGlzdDogV2hpdGVsaXN0ID0geyBhY2NvdW50OiB0aGlzLnR4bi5zZW5kZXIsIGJveEluZGV4OiBib3hJbmRleCwgYXJjOiBhcmMgfQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0yIC8vIGJveEluZGV4OiB1aW50MTYKCWNvbmNhdAoJc3RvcmUgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglieXRlIDB4MDAyNCAvLyBoZWFkIGVuZAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWludCAzNgoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglmcmFtZV9kaWcgLTEgLy8gYXJjOiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglsb2FkIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtNSAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NjEKCS8vIHRoaXMud2hpdGVsaXN0LmRlbGV0ZSh3aGl0ZWxpc3QpCglmcmFtZV9kaWcgLTUgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9kZWwKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjYzCgkvLyB0aGlzLndoaXRlbGlzdC5wdXQod2hpdGVsaXN0LCBhcHBJRHMpCglmcmFtZV9kaWcgLTUgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWR1cAoJYm94X2RlbAoJcG9wCglmcmFtZV9kaWcgLTMgLy8gYXBwSURzOiB1aW50NjRbXQoJYm94X3B1dAoKCS8vIGlmMV9jb25kaXRpb24KCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NjUKCS8vIHByZU1CUiA+IHRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZQoJZnJhbWVfZGlnIC00IC8vIHByZU1CUjogdWludDY0Cgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJYXNzZXJ0Cgk+CglieiBpZjFfZWxzZQoKCS8vIGlmMV9jb25zZXF1ZW50CgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjY2CgkvLyB0aGlzLnNlbmRNQlJQYXltZW50KHByZU1CUikKCWJ5dGUgMHgKCXBvcAoJZnJhbWVfZGlnIC00IC8vIHByZU1CUjogdWludDY0CgljYWxsc3ViIHNlbmRNQlJQYXltZW50CgliIGlmMV9lbmQKCmlmMV9lbHNlOgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo2OAoJLy8gdGhpcy52ZXJpZnlNQlJQYXltZW50KHRoaXMudHhuR3JvdXBbdGhpcy50eG4uZ3JvdXBJbmRleCAtIDFdLCBwcmVNQlIpCglieXRlIDB4Cglwb3AKCWZyYW1lX2RpZyAtNCAvLyBwcmVNQlI6IHVpbnQ2NAoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCgljYWxsc3ViIHZlcmlmeU1CUlBheW1lbnQKCmlmMV9lbmQ6CglyZXRzdWIKCmFiaV9yb3V0ZV9kZWxldGVXaGl0ZWxpc3Q6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMQoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgZGVsZXRlV2hpdGVsaXN0CglpbnQgMQoJcmV0dXJuCgpkZWxldGVXaGl0ZWxpc3Q6Cglwcm90byA0IDAKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjgwCgkvLyBwcmVNQlIgPSB0aGlzLmFwcC5hZGRyZXNzLm1pbkJhbGFuY2UKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglhc3NlcnQKCWZyYW1lX2J1cnkgLTMgLy8gcHJlTUJSOiB1aW50NjQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjgxCgkvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdCA9IHsgYWNjb3VudDogdGhpcy50eG4uc2VuZGVyLCBib3hJbmRleDogYm94SW5kZXgsIGFyYzogYXJjIH0KCXR4biBTZW5kZXIKCWZyYW1lX2RpZyAtMiAvLyBib3hJbmRleDogdWludDE2Cgljb25jYXQKCXN0b3JlIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJYnl0ZSAweDAwMjQgLy8gaGVhZCBlbmQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglpbnQgMzYKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJZnJhbWVfZGlnIC0xIC8vIGFyYzogYnl0ZXMKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTQgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjgzCgkvLyB0aGlzLndoaXRlbGlzdC5kZWxldGUod2hpdGVsaXN0KQoJZnJhbWVfZGlnIC00IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0Cglib3hfZGVsCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo4NQoJLy8gdGhpcy5zZW5kTUJSUGF5bWVudChwcmVNQlIpCglieXRlIDB4Cglwb3AKCWZyYW1lX2RpZyAtMyAvLyBwcmVNQlI6IHVpbnQ2NAoJY2FsbHN1YiBzZW5kTUJSUGF5bWVudAoJcmV0c3ViCgphYmlfcm91dGVfZGVsZXRlQXBwRnJvbVdoaXRlbGlzdDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAyCgl0eG5hIEFwcGxpY2F0aW9uQXJncyA0CglidG9pCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBkZWxldGVBcHBGcm9tV2hpdGVsaXN0CglpbnQgMQoJcmV0dXJuCgpkZWxldGVBcHBGcm9tV2hpdGVsaXN0OgoJcHJvdG8gNyAwCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo5NwoJLy8gcHJlTUJSID0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJYXNzZXJ0CglmcmFtZV9idXJ5IC01IC8vIHByZU1CUjogdWludDY0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo5OAoJLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QgPSB7IGFjY291bnQ6IHRoaXMudHhuLnNlbmRlciwgYm94SW5kZXg6IGJveEluZGV4LCBhcmM6IGFyYyB9Cgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gYm94SW5kZXg6IHVpbnQxNgoJY29uY2F0CglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDI0IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDM2CglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWJ5dGUgMHgKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWZyYW1lX2RpZyAtMSAvLyBhcmM6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoxMDAKCS8vIHNwbGljZWQgPSB0aGlzLndoaXRlbGlzdC5nZXQod2hpdGVsaXN0KS5zcGxpY2UoaW5kZXgsIDEpCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCWFzc2VydAoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtNCAvLyBpbmRleDogdWludDY0CglpbnQgOAoJKgoJaW50IDIKCSsKCXN0b3JlIDEyIC8vIHNwbGljZSBzdGFydAoJaW50IDEKCWludCA4CgkqCglpbnQgOAoJKwoJc3RvcmUgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCWFzc2VydAoJaW50IDIKCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0CglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCWFzc2VydAoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDgKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2dldAoJYXNzZXJ0Cglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWludCA4CgktCglleHRyYWN0MwoJY29uY2F0Cglzd2FwCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWR1cAoJYm94X2RlbAoJcG9wCglzd2FwCglib3hfcHV0CglmcmFtZV9idXJ5IC03IC8vIHNwbGljZWQ6IHVpbnQ2NFtdCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoxMDIKCS8vIGFzc2VydChzcGxpY2VkWzBdID09PSBhcHBJRCkKCWZyYW1lX2RpZyAtNyAvLyBzcGxpY2VkOiB1aW50NjRbXQoJaW50IDAKCWludCA4CgkqCglpbnQgMgoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglmcmFtZV9kaWcgLTMgLy8gYXBwSUQ6IHVpbnQ2NAoJPT0KCWFzc2VydAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MTA0CgkvLyB0aGlzLnNlbmRNQlJQYXltZW50KHByZU1CUikKCWJ5dGUgMHgKCXBvcAoJZnJhbWVfZGlnIC01IC8vIHByZU1CUjogdWludDY0CgljYWxsc3ViIHNlbmRNQlJQYXltZW50CglyZXRzdWIKCm1haW46Cgl0eG4gTnVtQXBwQXJncwoJYm56IHJvdXRlX2FiaQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgk9PQoJYm56IGJhcmVfcm91dGVfY3JlYXRlCgpyb3V0ZV9hYmk6CgltZXRob2QgImFkZEFwcFRvV2hpdGVMaXN0KHN0cmluZyx1aW50MTYsdWludDY0LHBheSl2b2lkIgoJbWV0aG9kICJzZXRBcHBXaGl0ZWxpc3Qoc3RyaW5nLHVpbnQxNix1aW50NjRbXSl2b2lkIgoJbWV0aG9kICJkZWxldGVXaGl0ZWxpc3Qoc3RyaW5nLHVpbnQxNil2b2lkIgoJbWV0aG9kICJkZWxldGVBcHBGcm9tV2hpdGVsaXN0KHN0cmluZyx1aW50MTYsdWludDY0LHVpbnQ2NCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggYWJpX3JvdXRlX2FkZEFwcFRvV2hpdGVMaXN0IGFiaV9yb3V0ZV9zZXRBcHBXaGl0ZWxpc3QgYWJpX3JvdXRlX2RlbGV0ZVdoaXRlbGlzdCBhYmlfcm91dGVfZGVsZXRlQXBwRnJvbVdoaXRlbGlzdA=="; + override approvalProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgY3JlYXRlCglpbnQgMQoJcmV0dXJuCgpjcmVhdGU6Cglwcm90byAwIDAKCXJldHN1YgoKdmVyaWZ5TUJSUGF5bWVudDoKCXByb3RvIDIgMAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MTMKCS8vIGFzc2VydChwYXltZW50LmFtb3VudCA9PT0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlIC0gcHJlTUJSKQoJZnJhbWVfZGlnIC0xIC8vIHBheW1lbnQ6IHBheQoJZ3R4bnMgQW1vdW50Cgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJYXNzZXJ0CglmcmFtZV9kaWcgLTIgLy8gcHJlTUJSOiB1aW50NjQKCS0KCT09Cglhc3NlcnQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjE0CgkvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gdGhpcy5hcHAuYWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBwYXltZW50OiBwYXkKCWd0eG5zIFJlY2VpdmVyCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCT09Cglhc3NlcnQKCXJldHN1YgoKc2VuZE1CUlBheW1lbnQ6Cglwcm90byAxIDAKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjE4CgkvLyBzZW5kUGF5bWVudCh7CglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoxOQoJLy8gc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCWl0eG5fZmllbGQgU2VuZGVyCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoyMAoJLy8gcmVjZWl2ZXI6IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MjEKCS8vIGFtb3VudDogcHJlTUJSIC0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlCglmcmFtZV9kaWcgLTEgLy8gcHJlTUJSOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglhc3NlcnQKCS0KCWl0eG5fZmllbGQgQW1vdW50CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoyMgoJLy8gZmVlOiAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fc3VibWl0CglyZXRzdWIKCmFiaV9yb3V0ZV9hZGRBcHBUb1doaXRlTGlzdDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAyCgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIGFkZEFwcFRvV2hpdGVMaXN0CglpbnQgMQoJcmV0dXJuCgphZGRBcHBUb1doaXRlTGlzdDoKCXByb3RvIDcgMAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MzYKCS8vIHByZU1CUiA9IHRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZQoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJYXNzZXJ0CglhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKCWFzc2VydAoJZnJhbWVfYnVyeSAtNSAvLyBwcmVNQlI6IHVpbnQ2NAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MzcKCS8vIHdoaXRlbGlzdDogV2hpdGVsaXN0ID0geyBhY2NvdW50OiB0aGlzLnR4bi5zZW5kZXIsIGJveEluZGV4OiBib3hJbmRleCwgYXJjOiBhcmMgfQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMjQKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCgl0eG4gU2VuZGVyCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMiAvLyBib3hJbmRleDogdWludDE2Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMSAvLyBhcmM6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCgkvLyBpZjBfY29uZGl0aW9uCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjM5CgkvLyB0aGlzLndoaXRlbGlzdC5leGlzdHMod2hpdGVsaXN0KQoJZnJhbWVfZGlnIC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0Cglib3hfZ2V0Cglzd2FwCglwb3AKCWJ6IGlmMF9lbHNlCgoJLy8gaWYwX2NvbnNlcXVlbnQKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NDAKCS8vIHRoaXMud2hpdGVsaXN0LmdldCh3aGl0ZWxpc3QpLnB1c2goYXBwSUQpCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCWFzc2VydAoJZHVwCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJZXh0cmFjdCAyIDAKCWNvbmNhdAoJZnJhbWVfZGlnIC0zIC8vIGFwcElEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CglkdXAKCWJveF9kZWwKCXBvcAoJc3dhcAoJYm94X3B1dAoJYiBpZjBfZW5kCgppZjBfZWxzZToKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NDIKCS8vIG5ld1doaXRlbGlzdDogdWludDY0W10gPSBbYXBwSURdCglmcmFtZV9kaWcgLTMgLy8gYXBwSUQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtNyAvLyBuZXdXaGl0ZWxpc3Q6IHVpbnQ2NFtdCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo0MwoJLy8gdGhpcy53aGl0ZWxpc3QucHV0KHdoaXRlbGlzdCwgbmV3V2hpdGVsaXN0KQoJZnJhbWVfZGlnIC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CglkdXAKCWJveF9kZWwKCXBvcAoJZnJhbWVfZGlnIC03IC8vIG5ld1doaXRlbGlzdDogdWludDY0W10KCWJveF9wdXQKCmlmMF9lbmQ6CgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjQ2CgkvLyB0aGlzLnZlcmlmeU1CUlBheW1lbnQocGF5bWVudCwgcHJlTUJSKQoJZnJhbWVfZGlnIC01IC8vIHByZU1CUjogdWludDY0CglmcmFtZV9kaWcgLTQgLy8gcGF5bWVudDogcGF5CgljYWxsc3ViIHZlcmlmeU1CUlBheW1lbnQKCXJldHN1YgoKYWJpX3JvdXRlX3NldEFwcFdoaXRlbGlzdDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBzZXRBcHBXaGl0ZWxpc3QKCWludCAxCglyZXR1cm4KCnNldEFwcFdoaXRlbGlzdDoKCXByb3RvIDUgMAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NTgKCS8vIHByZU1CUiA9IHRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZQoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJYXNzZXJ0CglhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKCWFzc2VydAoJZnJhbWVfYnVyeSAtNCAvLyBwcmVNQlI6IHVpbnQ2NAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NTkKCS8vIHdoaXRlbGlzdDogV2hpdGVsaXN0ID0geyBhY2NvdW50OiB0aGlzLnR4bi5zZW5kZXIsIGJveEluZGV4OiBib3hJbmRleCwgYXJjOiBhcmMgfQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMjQKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCgl0eG4gU2VuZGVyCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMiAvLyBib3hJbmRleDogdWludDE2Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMSAvLyBhcmM6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTUgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjYxCgkvLyB0aGlzLndoaXRlbGlzdC5kZWxldGUod2hpdGVsaXN0KQoJZnJhbWVfZGlnIC01IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0Cglib3hfZGVsCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo2MwoJLy8gdGhpcy53aGl0ZWxpc3QucHV0KHdoaXRlbGlzdCwgYXBwSURzKQoJZnJhbWVfZGlnIC01IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CglkdXAKCWJveF9kZWwKCXBvcAoJZnJhbWVfZGlnIC0zIC8vIGFwcElEczogdWludDY0W10KCWJveF9wdXQKCgkvLyBpZjFfY29uZGl0aW9uCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjY1CgkvLyBwcmVNQlIgPiB0aGlzLmFwcC5hZGRyZXNzLm1pbkJhbGFuY2UKCWZyYW1lX2RpZyAtNCAvLyBwcmVNQlI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJYXNzZXJ0CglhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKCWFzc2VydAoJPgoJYnogaWYxX2Vsc2UKCgkvLyBpZjFfY29uc2VxdWVudAoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo2NgoJLy8gdGhpcy5zZW5kTUJSUGF5bWVudChwcmVNQlIpCglmcmFtZV9kaWcgLTQgLy8gcHJlTUJSOiB1aW50NjQKCWNhbGxzdWIgc2VuZE1CUlBheW1lbnQKCWIgaWYxX2VuZAoKaWYxX2Vsc2U6CgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjY4CgkvLyB0aGlzLnZlcmlmeU1CUlBheW1lbnQodGhpcy50eG5Hcm91cFt0aGlzLnR4bi5ncm91cEluZGV4IC0gMV0sIHByZU1CUikKCWZyYW1lX2RpZyAtNCAvLyBwcmVNQlI6IHVpbnQ2NAoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCgljYWxsc3ViIHZlcmlmeU1CUlBheW1lbnQKCmlmMV9lbmQ6CglyZXRzdWIKCmFiaV9yb3V0ZV9kZWxldGVXaGl0ZWxpc3Q6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgZGVsZXRlV2hpdGVsaXN0CglpbnQgMQoJcmV0dXJuCgpkZWxldGVXaGl0ZWxpc3Q6Cglwcm90byA0IDAKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjgwCgkvLyBwcmVNQlIgPSB0aGlzLmFwcC5hZGRyZXNzLm1pbkJhbGFuY2UKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglhc3NlcnQKCWZyYW1lX2J1cnkgLTMgLy8gcHJlTUJSOiB1aW50NjQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjgxCgkvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdCA9IHsgYWNjb3VudDogdGhpcy50eG4uc2VuZGVyLCBib3hJbmRleDogYm94SW5kZXgsIGFyYzogYXJjIH0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDI0CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJdHhuIFNlbmRlcgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglmcmFtZV9kaWcgLTIgLy8gYm94SW5kZXg6IHVpbnQxNgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglmcmFtZV9kaWcgLTEgLy8gYXJjOiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC00IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo4MwoJLy8gdGhpcy53aGl0ZWxpc3QuZGVsZXRlKHdoaXRlbGlzdCkKCWZyYW1lX2RpZyAtNCAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2RlbAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6ODUKCS8vIHRoaXMuc2VuZE1CUlBheW1lbnQocHJlTUJSKQoJZnJhbWVfZGlnIC0zIC8vIHByZU1CUjogdWludDY0CgljYWxsc3ViIHNlbmRNQlJQYXltZW50CglyZXRzdWIKCmFiaV9yb3V0ZV9kZWxldGVBcHBGcm9tV2hpdGVsaXN0OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIGRlbGV0ZUFwcEZyb21XaGl0ZWxpc3QKCWludCAxCglyZXR1cm4KCmRlbGV0ZUFwcEZyb21XaGl0ZWxpc3Q6Cglwcm90byA3IDAKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjk3CgkvLyBwcmVNQlIgPSB0aGlzLmFwcC5hZGRyZXNzLm1pbkJhbGFuY2UKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglhc3NlcnQKCWZyYW1lX2J1cnkgLTUgLy8gcHJlTUJSOiB1aW50NjQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjk4CgkvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdCA9IHsgYWNjb3VudDogdGhpcy50eG4uc2VuZGVyLCBib3hJbmRleDogYm94SW5kZXgsIGFyYzogYXJjIH0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDI0CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJdHhuIFNlbmRlcgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglmcmFtZV9kaWcgLTIgLy8gYm94SW5kZXg6IHVpbnQxNgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglmcmFtZV9kaWcgLTEgLy8gYXJjOiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoxMDAKCS8vIHNwbGljZWQgPSB0aGlzLndoaXRlbGlzdC5nZXQod2hpdGVsaXN0KS5zcGxpY2UoaW5kZXgsIDEpCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCWFzc2VydAoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtNCAvLyBpbmRleDogdWludDY0CglpbnQgOAoJKgoJaW50IDIKCSsKCXN0b3JlIDEyIC8vIHNwbGljZSBzdGFydAoJaW50IDEKCWludCA4CgkqCglpbnQgOAoJKwoJc3RvcmUgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCWFzc2VydAoJaW50IDIKCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0CglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCWFzc2VydAoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDgKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2dldAoJYXNzZXJ0Cglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWludCA4CgktCglleHRyYWN0MwoJY29uY2F0Cglzd2FwCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWR1cAoJYm94X2RlbAoJcG9wCglzd2FwCglib3hfcHV0CglmcmFtZV9idXJ5IC03IC8vIHNwbGljZWQ6IHVpbnQ2NFtdCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoxMDIKCS8vIGFzc2VydChzcGxpY2VkWzBdID09PSBhcHBJRCkKCWZyYW1lX2RpZyAtNyAvLyBzcGxpY2VkOiB1aW50NjRbXQoJaW50IDAKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFwcElEOiB1aW50NjQKCT09Cglhc3NlcnQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjEwNAoJLy8gdGhpcy5zZW5kTUJSUGF5bWVudChwcmVNQlIpCglmcmFtZV9kaWcgLTUgLy8gcHJlTUJSOiB1aW50NjQKCWNhbGxzdWIgc2VuZE1CUlBheW1lbnQKCXJldHN1YgoKbWFpbjoKCXR4biBOdW1BcHBBcmdzCglibnogcm91dGVfYWJpCgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCT09CglibnogYmFyZV9yb3V0ZV9jcmVhdGUKCnJvdXRlX2FiaToKCW1ldGhvZCAiYWRkQXBwVG9XaGl0ZUxpc3Qoc3RyaW5nLHVpbnQxNix1aW50NjQscGF5KXZvaWQiCgltZXRob2QgInNldEFwcFdoaXRlbGlzdChzdHJpbmcsdWludDE2LHVpbnQ2NFtdKXZvaWQiCgltZXRob2QgImRlbGV0ZVdoaXRlbGlzdChzdHJpbmcsdWludDE2KXZvaWQiCgltZXRob2QgImRlbGV0ZUFwcEZyb21XaGl0ZWxpc3Qoc3RyaW5nLHVpbnQxNix1aW50NjQsdWludDY0KXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCBhYmlfcm91dGVfYWRkQXBwVG9XaGl0ZUxpc3QgYWJpX3JvdXRlX3NldEFwcFdoaXRlbGlzdCBhYmlfcm91dGVfZGVsZXRlV2hpdGVsaXN0IGFiaV9yb3V0ZV9kZWxldGVBcHBGcm9tV2hpdGVsaXN0"; override clearProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"; override methods: algosdk.ABIMethod[] = [ new algosdk.ABIMethod({ name: "addAppToWhiteList", desc: "", args: [{ type: "string", name: "arc", desc: "" }, { type: "uint16", name: "boxIndex", desc: "" }, { type: "uint64", name: "appID", desc: "" }, { type: "pay", name: "payment", desc: "" }], returns: { type: "void", desc: "" } }), diff --git a/examples/arc75/artifacts/ARC75.approval.teal b/examples/arc75/artifacts/ARC75.approval.teal index b2a1dd78f..d804af223 100644 --- a/examples/arc75/artifacts/ARC75.approval.teal +++ b/examples/arc75/artifacts/ARC75.approval.teal @@ -122,16 +122,24 @@ addAppToWhiteList: // examples/arc75/arc75.algo.ts:37 // whitelist: Whitelist = { account: this.txn.sender, boxIndex: boxIndex, arc: arc } + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0024 + store 2 // head offset + load 0 // tuple head txn Sender + concat + store 0 // tuple head + load 0 // tuple head frame_dig -2 // boxIndex: uint16 concat - store 11 // static elements - byte 0x0024 // head end - store 8 // dynamic head - int 36 - store 9 // dynamic head offset - byte 0x - store 10 // dynamic elements + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head frame_dig -1 // arc: bytes dup len @@ -139,14 +147,20 @@ addAppToWhiteList: extract 6 2 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -6 // whitelist: Whitelist @@ -189,9 +203,10 @@ addAppToWhiteList: if0_else: // examples/arc75/arc75.algo.ts:42 // newWhitelist: uint64[] = [appID] - byte 0x0001 frame_dig -3 // appID: uint64 itob + byte 0x0001 + swap concat frame_bury -7 // newWhitelist: uint64[] @@ -245,16 +260,24 @@ setAppWhitelist: // examples/arc75/arc75.algo.ts:59 // whitelist: Whitelist = { account: this.txn.sender, boxIndex: boxIndex, arc: arc } + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0024 + store 2 // head offset + load 0 // tuple head txn Sender + concat + store 0 // tuple head + load 0 // tuple head frame_dig -2 // boxIndex: uint16 concat - store 11 // static elements - byte 0x0024 // head end - store 8 // dynamic head - int 36 - store 9 // dynamic head offset - byte 0x - store 10 // dynamic elements + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head frame_dig -1 // arc: bytes dup len @@ -262,14 +285,20 @@ setAppWhitelist: extract 6 2 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -5 // whitelist: Whitelist @@ -350,16 +379,24 @@ deleteWhitelist: // examples/arc75/arc75.algo.ts:81 // whitelist: Whitelist = { account: this.txn.sender, boxIndex: boxIndex, arc: arc } + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0024 + store 2 // head offset + load 0 // tuple head txn Sender + concat + store 0 // tuple head + load 0 // tuple head frame_dig -2 // boxIndex: uint16 concat - store 11 // static elements - byte 0x0024 // head end - store 8 // dynamic head - int 36 - store 9 // dynamic head offset - byte 0x - store 10 // dynamic elements + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head frame_dig -1 // arc: bytes dup len @@ -367,14 +404,20 @@ deleteWhitelist: extract 6 2 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -4 // whitelist: Whitelist @@ -425,16 +468,24 @@ deleteAppFromWhitelist: // examples/arc75/arc75.algo.ts:98 // whitelist: Whitelist = { account: this.txn.sender, boxIndex: boxIndex, arc: arc } + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0024 + store 2 // head offset + load 0 // tuple head txn Sender + concat + store 0 // tuple head + load 0 // tuple head frame_dig -2 // boxIndex: uint16 concat - store 11 // static elements - byte 0x0024 // head end - store 8 // dynamic head - int 36 - store 9 // dynamic head offset - byte 0x - store 10 // dynamic elements + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head frame_dig -1 // arc: bytes dup len @@ -442,14 +493,20 @@ deleteAppFromWhitelist: extract 6 2 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -6 // whitelist: Whitelist @@ -521,10 +578,10 @@ deleteAppFromWhitelist: // assert(spliced[0] === appID) frame_dig -7 // spliced: uint64[] int 0 - int 8 - * + int 8 // element length + * // element offset int 2 - + + + // add two for length int 8 extract3 btoi diff --git a/examples/arc75/artifacts/ARC75.json b/examples/arc75/artifacts/ARC75.json index f1246caa6..80c25ffb7 100644 --- a/examples/arc75/artifacts/ARC75.json +++ b/examples/arc75/artifacts/ARC75.json @@ -1 +1 @@ -{"hints":{},"schema":{"local":{"declared":{},"reserved":{}},"global":{"declared":{},"reserved":{}}},"state":{"global":{"num_byte_slices":0,"num_uints":0},"local":{"num_byte_slices":0,"num_uints":0}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgY3JlYXRlCglpbnQgMQoJcmV0dXJuCgpjcmVhdGU6Cglwcm90byAwIDAKCXJldHN1YgoKdmVyaWZ5TUJSUGF5bWVudDoKCXByb3RvIDIgMAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MTMKCS8vIGFzc2VydChwYXltZW50LmFtb3VudCA9PT0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlIC0gcHJlTUJSKQoJZnJhbWVfZGlnIC0xIC8vIHBheW1lbnQ6IHBheQoJZ3R4bnMgQW1vdW50Cgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJYXNzZXJ0CglmcmFtZV9kaWcgLTIgLy8gcHJlTUJSOiB1aW50NjQKCS0KCT09Cglhc3NlcnQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjE0CgkvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gdGhpcy5hcHAuYWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBwYXltZW50OiBwYXkKCWd0eG5zIFJlY2VpdmVyCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCT09Cglhc3NlcnQKCXJldHN1YgoKc2VuZE1CUlBheW1lbnQ6Cglwcm90byAxIDAKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjE4CgkvLyBzZW5kUGF5bWVudCh7CglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoxOQoJLy8gc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCWl0eG5fZmllbGQgU2VuZGVyCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoyMAoJLy8gcmVjZWl2ZXI6IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MjEKCS8vIGFtb3VudDogcHJlTUJSIC0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlCglmcmFtZV9kaWcgLTEgLy8gcHJlTUJSOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglhc3NlcnQKCS0KCWl0eG5fZmllbGQgQW1vdW50CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoyMgoJLy8gZmVlOiAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fc3VibWl0CglyZXRzdWIKCmFiaV9yb3V0ZV9hZGRBcHBUb1doaXRlTGlzdDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAyCgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIGFkZEFwcFRvV2hpdGVMaXN0CglpbnQgMQoJcmV0dXJuCgphZGRBcHBUb1doaXRlTGlzdDoKCXByb3RvIDcgMAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MzYKCS8vIHByZU1CUiA9IHRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZQoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJYXNzZXJ0CglhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKCWFzc2VydAoJZnJhbWVfYnVyeSAtNSAvLyBwcmVNQlI6IHVpbnQ2NAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MzcKCS8vIHdoaXRlbGlzdDogV2hpdGVsaXN0ID0geyBhY2NvdW50OiB0aGlzLnR4bi5zZW5kZXIsIGJveEluZGV4OiBib3hJbmRleCwgYXJjOiBhcmMgfQoJdHhuIFNlbmRlcgoJZnJhbWVfZGlnIC0yIC8vIGJveEluZGV4OiB1aW50MTYKCWNvbmNhdAoJc3RvcmUgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglieXRlIDB4MDAyNCAvLyBoZWFkIGVuZAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWludCAzNgoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglmcmFtZV9kaWcgLTEgLy8gYXJjOiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglsb2FkIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoKCS8vIGlmMF9jb25kaXRpb24KCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MzkKCS8vIHRoaXMud2hpdGVsaXN0LmV4aXN0cyh3aGl0ZWxpc3QpCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCXN3YXAKCXBvcAoJYnogaWYwX2Vsc2UKCgkvLyBpZjBfY29uc2VxdWVudAoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo0MAoJLy8gdGhpcy53aGl0ZWxpc3QuZ2V0KHdoaXRlbGlzdCkucHVzaChhcHBJRCkKCWZyYW1lX2RpZyAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2dldAoJYXNzZXJ0CglkdXAKCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCglleHRyYWN0IDIgMAoJY29uY2F0CglmcmFtZV9kaWcgLTMgLy8gYXBwSUQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWR1cAoJYm94X2RlbAoJcG9wCglzd2FwCglib3hfcHV0CgliIGlmMF9lbmQKCmlmMF9lbHNlOgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo0MgoJLy8gbmV3V2hpdGVsaXN0OiB1aW50NjRbXSA9IFthcHBJRF0KCWJ5dGUgMHgwMDAxCglmcmFtZV9kaWcgLTMgLy8gYXBwSUQ6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC03IC8vIG5ld1doaXRlbGlzdDogdWludDY0W10KCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjQzCgkvLyB0aGlzLndoaXRlbGlzdC5wdXQod2hpdGVsaXN0LCBuZXdXaGl0ZWxpc3QpCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWR1cAoJYm94X2RlbAoJcG9wCglmcmFtZV9kaWcgLTcgLy8gbmV3V2hpdGVsaXN0OiB1aW50NjRbXQoJYm94X3B1dAoKaWYwX2VuZDoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NDYKCS8vIHRoaXMudmVyaWZ5TUJSUGF5bWVudChwYXltZW50LCBwcmVNQlIpCglmcmFtZV9kaWcgLTUgLy8gcHJlTUJSOiB1aW50NjQKCWZyYW1lX2RpZyAtNCAvLyBwYXltZW50OiBwYXkKCWNhbGxzdWIgdmVyaWZ5TUJSUGF5bWVudAoJcmV0c3ViCgphYmlfcm91dGVfc2V0QXBwV2hpdGVsaXN0OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIHNldEFwcFdoaXRlbGlzdAoJaW50IDEKCXJldHVybgoKc2V0QXBwV2hpdGVsaXN0OgoJcHJvdG8gNSAwCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo1OAoJLy8gcHJlTUJSID0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJYXNzZXJ0CglmcmFtZV9idXJ5IC00IC8vIHByZU1CUjogdWludDY0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo1OQoJLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QgPSB7IGFjY291bnQ6IHRoaXMudHhuLnNlbmRlciwgYm94SW5kZXg6IGJveEluZGV4LCBhcmM6IGFyYyB9Cgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gYm94SW5kZXg6IHVpbnQxNgoJY29uY2F0CglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDI0IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDM2CglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWJ5dGUgMHgKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWZyYW1lX2RpZyAtMSAvLyBhcmM6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC01IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo2MQoJLy8gdGhpcy53aGl0ZWxpc3QuZGVsZXRlKHdoaXRlbGlzdCkKCWZyYW1lX2RpZyAtNSAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2RlbAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NjMKCS8vIHRoaXMud2hpdGVsaXN0LnB1dCh3aGl0ZWxpc3QsIGFwcElEcykKCWZyYW1lX2RpZyAtNSAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJZHVwCglib3hfZGVsCglwb3AKCWZyYW1lX2RpZyAtMyAvLyBhcHBJRHM6IHVpbnQ2NFtdCglib3hfcHV0CgoJLy8gaWYxX2NvbmRpdGlvbgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo2NQoJLy8gcHJlTUJSID4gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlCglmcmFtZV9kaWcgLTQgLy8gcHJlTUJSOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglhc3NlcnQKCT4KCWJ6IGlmMV9lbHNlCgoJLy8gaWYxX2NvbnNlcXVlbnQKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NjYKCS8vIHRoaXMuc2VuZE1CUlBheW1lbnQocHJlTUJSKQoJZnJhbWVfZGlnIC00IC8vIHByZU1CUjogdWludDY0CgljYWxsc3ViIHNlbmRNQlJQYXltZW50CgliIGlmMV9lbmQKCmlmMV9lbHNlOgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo2OAoJLy8gdGhpcy52ZXJpZnlNQlJQYXltZW50KHRoaXMudHhuR3JvdXBbdGhpcy50eG4uZ3JvdXBJbmRleCAtIDFdLCBwcmVNQlIpCglmcmFtZV9kaWcgLTQgLy8gcHJlTUJSOiB1aW50NjQKCXR4biBHcm91cEluZGV4CglpbnQgMQoJLQoJY2FsbHN1YiB2ZXJpZnlNQlJQYXltZW50CgppZjFfZW5kOgoJcmV0c3ViCgphYmlfcm91dGVfZGVsZXRlV2hpdGVsaXN0OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIGRlbGV0ZVdoaXRlbGlzdAoJaW50IDEKCXJldHVybgoKZGVsZXRlV2hpdGVsaXN0OgoJcHJvdG8gNCAwCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo4MAoJLy8gcHJlTUJSID0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJYXNzZXJ0CglmcmFtZV9idXJ5IC0zIC8vIHByZU1CUjogdWludDY0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo4MQoJLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QgPSB7IGFjY291bnQ6IHRoaXMudHhuLnNlbmRlciwgYm94SW5kZXg6IGJveEluZGV4LCBhcmM6IGFyYyB9Cgl0eG4gU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gYm94SW5kZXg6IHVpbnQxNgoJY29uY2F0CglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDI0IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDM2CglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWJ5dGUgMHgKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWZyYW1lX2RpZyAtMSAvLyBhcmM6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC00IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo4MwoJLy8gdGhpcy53aGl0ZWxpc3QuZGVsZXRlKHdoaXRlbGlzdCkKCWZyYW1lX2RpZyAtNCAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2RlbAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6ODUKCS8vIHRoaXMuc2VuZE1CUlBheW1lbnQocHJlTUJSKQoJZnJhbWVfZGlnIC0zIC8vIHByZU1CUjogdWludDY0CgljYWxsc3ViIHNlbmRNQlJQYXltZW50CglyZXRzdWIKCmFiaV9yb3V0ZV9kZWxldGVBcHBGcm9tV2hpdGVsaXN0OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIGRlbGV0ZUFwcEZyb21XaGl0ZWxpc3QKCWludCAxCglyZXR1cm4KCmRlbGV0ZUFwcEZyb21XaGl0ZWxpc3Q6Cglwcm90byA3IDAKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjk3CgkvLyBwcmVNQlIgPSB0aGlzLmFwcC5hZGRyZXNzLm1pbkJhbGFuY2UKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglhc3NlcnQKCWZyYW1lX2J1cnkgLTUgLy8gcHJlTUJSOiB1aW50NjQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjk4CgkvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdCA9IHsgYWNjb3VudDogdGhpcy50eG4uc2VuZGVyLCBib3hJbmRleDogYm94SW5kZXgsIGFyYzogYXJjIH0KCXR4biBTZW5kZXIKCWZyYW1lX2RpZyAtMiAvLyBib3hJbmRleDogdWludDE2Cgljb25jYXQKCXN0b3JlIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJYnl0ZSAweDAwMjQgLy8gaGVhZCBlbmQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglpbnQgMzYKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJZnJhbWVfZGlnIC0xIC8vIGFyYzogYnl0ZXMKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjEwMAoJLy8gc3BsaWNlZCA9IHRoaXMud2hpdGVsaXN0LmdldCh3aGl0ZWxpc3QpLnNwbGljZShpbmRleCwgMSkKCWZyYW1lX2RpZyAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2dldAoJYXNzZXJ0CglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgktCglpdG9iCglleHRyYWN0IDYgMgoJZnJhbWVfZGlnIC00IC8vIGluZGV4OiB1aW50NjQKCWludCA4CgkqCglpbnQgMgoJKwoJc3RvcmUgMTIgLy8gc3BsaWNlIHN0YXJ0CglpbnQgMQoJaW50IDgKCSoKCWludCA4CgkrCglzdG9yZSAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWZyYW1lX2RpZyAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2dldAoJYXNzZXJ0CglpbnQgMgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2dldAoJYXNzZXJ0CglkdXAKCWxlbgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCgkrCglpbnQgOAoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cgljb25jYXQKCWludCAxCglpdG9iCglleHRyYWN0IDYgMgoJZnJhbWVfZGlnIC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0Cglib3hfZ2V0Cglhc3NlcnQKCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJaW50IDgKCS0KCWV4dHJhY3QzCgljb25jYXQKCXN3YXAKCWZyYW1lX2RpZyAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJZHVwCglib3hfZGVsCglwb3AKCXN3YXAKCWJveF9wdXQKCWZyYW1lX2J1cnkgLTcgLy8gc3BsaWNlZDogdWludDY0W10KCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjEwMgoJLy8gYXNzZXJ0KHNwbGljZWRbMF0gPT09IGFwcElEKQoJZnJhbWVfZGlnIC03IC8vIHNwbGljZWQ6IHVpbnQ2NFtdCglpbnQgMAoJaW50IDgKCSoKCWludCAyCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtMyAvLyBhcHBJRDogdWludDY0Cgk9PQoJYXNzZXJ0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoxMDQKCS8vIHRoaXMuc2VuZE1CUlBheW1lbnQocHJlTUJSKQoJZnJhbWVfZGlnIC01IC8vIHByZU1CUjogdWludDY0CgljYWxsc3ViIHNlbmRNQlJQYXltZW50CglyZXRzdWIKCm1haW46Cgl0eG4gTnVtQXBwQXJncwoJYm56IHJvdXRlX2FiaQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgk9PQoJYm56IGJhcmVfcm91dGVfY3JlYXRlCgpyb3V0ZV9hYmk6CgltZXRob2QgImFkZEFwcFRvV2hpdGVMaXN0KHN0cmluZyx1aW50MTYsdWludDY0LHBheSl2b2lkIgoJbWV0aG9kICJzZXRBcHBXaGl0ZWxpc3Qoc3RyaW5nLHVpbnQxNix1aW50NjRbXSl2b2lkIgoJbWV0aG9kICJkZWxldGVXaGl0ZWxpc3Qoc3RyaW5nLHVpbnQxNil2b2lkIgoJbWV0aG9kICJkZWxldGVBcHBGcm9tV2hpdGVsaXN0KHN0cmluZyx1aW50MTYsdWludDY0LHVpbnQ2NCl2b2lkIgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAoJbWF0Y2ggYWJpX3JvdXRlX2FkZEFwcFRvV2hpdGVMaXN0IGFiaV9yb3V0ZV9zZXRBcHBXaGl0ZWxpc3QgYWJpX3JvdXRlX2RlbGV0ZVdoaXRlbGlzdCBhYmlfcm91dGVfZGVsZXRlQXBwRnJvbVdoaXRlbGlzdA==","clear":"I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"},"contract":{"name":"ARC75","desc":"","methods":[{"name":"addAppToWhiteList","args":[{"name":"arc","type":"string","desc":""},{"name":"boxIndex","type":"uint16","desc":""},{"name":"appID","type":"uint64","desc":""},{"name":"payment","type":"pay","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"setAppWhitelist","args":[{"name":"arc","type":"string","desc":""},{"name":"boxIndex","type":"uint16","desc":""},{"name":"appIDs","type":"uint64[]","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"deleteWhitelist","args":[{"name":"arc","type":"string","desc":""},{"name":"boxIndex","type":"uint16","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"deleteAppFromWhitelist","args":[{"name":"arc","type":"string","desc":""},{"name":"boxIndex","type":"uint16","desc":""},{"name":"appID","type":"uint64","desc":""},{"name":"index","type":"uint64","desc":""}],"desc":"","returns":{"type":"void","desc":""}}]}} \ No newline at end of file +{"hints":{},"schema":{"local":{"declared":{},"reserved":{}},"global":{"declared":{},"reserved":{}}},"state":{"global":{"num_byte_slices":0,"num_uints":0},"local":{"num_byte_slices":0,"num_uints":0}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgY3JlYXRlCglpbnQgMQoJcmV0dXJuCgpjcmVhdGU6Cglwcm90byAwIDAKCXJldHN1YgoKdmVyaWZ5TUJSUGF5bWVudDoKCXByb3RvIDIgMAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MTMKCS8vIGFzc2VydChwYXltZW50LmFtb3VudCA9PT0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlIC0gcHJlTUJSKQoJZnJhbWVfZGlnIC0xIC8vIHBheW1lbnQ6IHBheQoJZ3R4bnMgQW1vdW50Cgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCWFjY3RfcGFyYW1zX2dldCBBY2N0TWluQmFsYW5jZQoJYXNzZXJ0CglmcmFtZV9kaWcgLTIgLy8gcHJlTUJSOiB1aW50NjQKCS0KCT09Cglhc3NlcnQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjE0CgkvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gdGhpcy5hcHAuYWRkcmVzcykKCWZyYW1lX2RpZyAtMSAvLyBwYXltZW50OiBwYXkKCWd0eG5zIFJlY2VpdmVyCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCT09Cglhc3NlcnQKCXJldHN1YgoKc2VuZE1CUlBheW1lbnQ6Cglwcm90byAxIDAKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjE4CgkvLyBzZW5kUGF5bWVudCh7CglpdHhuX2JlZ2luCglpbnQgcGF5CglpdHhuX2ZpZWxkIFR5cGVFbnVtCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoxOQoJLy8gc2VuZGVyOiB0aGlzLmFwcC5hZGRyZXNzCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCglhc3NlcnQKCWl0eG5fZmllbGQgU2VuZGVyCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoyMAoJLy8gcmVjZWl2ZXI6IHRoaXMudHhuLnNlbmRlcgoJdHhuIFNlbmRlcgoJaXR4bl9maWVsZCBSZWNlaXZlcgoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MjEKCS8vIGFtb3VudDogcHJlTUJSIC0gdGhpcy5hcHAuYWRkcmVzcy5taW5CYWxhbmNlCglmcmFtZV9kaWcgLTEgLy8gcHJlTUJSOiB1aW50NjQKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglhc3NlcnQKCS0KCWl0eG5fZmllbGQgQW1vdW50CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoyMgoJLy8gZmVlOiAwCglpbnQgMAoJaXR4bl9maWVsZCBGZWUKCWl0eG5fc3VibWl0CglyZXRzdWIKCmFiaV9yb3V0ZV9hZGRBcHBUb1doaXRlTGlzdDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAyCgl0eG4gR3JvdXBJbmRleAoJaW50IDEKCS0KCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIGFkZEFwcFRvV2hpdGVMaXN0CglpbnQgMQoJcmV0dXJuCgphZGRBcHBUb1doaXRlTGlzdDoKCXByb3RvIDcgMAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MzYKCS8vIHByZU1CUiA9IHRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZQoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJYXNzZXJ0CglhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKCWFzc2VydAoJZnJhbWVfYnVyeSAtNSAvLyBwcmVNQlI6IHVpbnQ2NAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6MzcKCS8vIHdoaXRlbGlzdDogV2hpdGVsaXN0ID0geyBhY2NvdW50OiB0aGlzLnR4bi5zZW5kZXIsIGJveEluZGV4OiBib3hJbmRleCwgYXJjOiBhcmMgfQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMjQKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCgl0eG4gU2VuZGVyCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMiAvLyBib3hJbmRleDogdWludDE2Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMSAvLyBhcmM6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCgkvLyBpZjBfY29uZGl0aW9uCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjM5CgkvLyB0aGlzLndoaXRlbGlzdC5leGlzdHMod2hpdGVsaXN0KQoJZnJhbWVfZGlnIC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0Cglib3hfZ2V0Cglzd2FwCglwb3AKCWJ6IGlmMF9lbHNlCgoJLy8gaWYwX2NvbnNlcXVlbnQKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NDAKCS8vIHRoaXMud2hpdGVsaXN0LmdldCh3aGl0ZWxpc3QpLnB1c2goYXBwSUQpCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCWFzc2VydAoJZHVwCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJZXh0cmFjdCAyIDAKCWNvbmNhdAoJZnJhbWVfZGlnIC0zIC8vIGFwcElEOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CglkdXAKCWJveF9kZWwKCXBvcAoJc3dhcAoJYm94X3B1dAoJYiBpZjBfZW5kCgppZjBfZWxzZToKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NDIKCS8vIG5ld1doaXRlbGlzdDogdWludDY0W10gPSBbYXBwSURdCglmcmFtZV9kaWcgLTMgLy8gYXBwSUQ6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtNyAvLyBuZXdXaGl0ZWxpc3Q6IHVpbnQ2NFtdCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo0MwoJLy8gdGhpcy53aGl0ZWxpc3QucHV0KHdoaXRlbGlzdCwgbmV3V2hpdGVsaXN0KQoJZnJhbWVfZGlnIC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CglkdXAKCWJveF9kZWwKCXBvcAoJZnJhbWVfZGlnIC03IC8vIG5ld1doaXRlbGlzdDogdWludDY0W10KCWJveF9wdXQKCmlmMF9lbmQ6CgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjQ2CgkvLyB0aGlzLnZlcmlmeU1CUlBheW1lbnQocGF5bWVudCwgcHJlTUJSKQoJZnJhbWVfZGlnIC01IC8vIHByZU1CUjogdWludDY0CglmcmFtZV9kaWcgLTQgLy8gcGF5bWVudDogcGF5CgljYWxsc3ViIHZlcmlmeU1CUlBheW1lbnQKCXJldHN1YgoKYWJpX3JvdXRlX3NldEFwcFdoaXRlbGlzdDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBzZXRBcHBXaGl0ZWxpc3QKCWludCAxCglyZXR1cm4KCnNldEFwcFdoaXRlbGlzdDoKCXByb3RvIDUgMAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NTgKCS8vIHByZU1CUiA9IHRoaXMuYXBwLmFkZHJlc3MubWluQmFsYW5jZQoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJYXNzZXJ0CglhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKCWFzc2VydAoJZnJhbWVfYnVyeSAtNCAvLyBwcmVNQlI6IHVpbnQ2NAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6NTkKCS8vIHdoaXRlbGlzdDogV2hpdGVsaXN0ID0geyBhY2NvdW50OiB0aGlzLnR4bi5zZW5kZXIsIGJveEluZGV4OiBib3hJbmRleCwgYXJjOiBhcmMgfQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMjQKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCgl0eG4gU2VuZGVyCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMiAvLyBib3hJbmRleDogdWludDE2Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMSAvLyBhcmM6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTUgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjYxCgkvLyB0aGlzLndoaXRlbGlzdC5kZWxldGUod2hpdGVsaXN0KQoJZnJhbWVfZGlnIC01IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0Cglib3hfZGVsCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo2MwoJLy8gdGhpcy53aGl0ZWxpc3QucHV0KHdoaXRlbGlzdCwgYXBwSURzKQoJZnJhbWVfZGlnIC01IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CglkdXAKCWJveF9kZWwKCXBvcAoJZnJhbWVfZGlnIC0zIC8vIGFwcElEczogdWludDY0W10KCWJveF9wdXQKCgkvLyBpZjFfY29uZGl0aW9uCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjY1CgkvLyBwcmVNQlIgPiB0aGlzLmFwcC5hZGRyZXNzLm1pbkJhbGFuY2UKCWZyYW1lX2RpZyAtNCAvLyBwcmVNQlI6IHVpbnQ2NAoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwoJYXNzZXJ0CglhY2N0X3BhcmFtc19nZXQgQWNjdE1pbkJhbGFuY2UKCWFzc2VydAoJPgoJYnogaWYxX2Vsc2UKCgkvLyBpZjFfY29uc2VxdWVudAoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo2NgoJLy8gdGhpcy5zZW5kTUJSUGF5bWVudChwcmVNQlIpCglmcmFtZV9kaWcgLTQgLy8gcHJlTUJSOiB1aW50NjQKCWNhbGxzdWIgc2VuZE1CUlBheW1lbnQKCWIgaWYxX2VuZAoKaWYxX2Vsc2U6CgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjY4CgkvLyB0aGlzLnZlcmlmeU1CUlBheW1lbnQodGhpcy50eG5Hcm91cFt0aGlzLnR4bi5ncm91cEluZGV4IC0gMV0sIHByZU1CUikKCWZyYW1lX2RpZyAtNCAvLyBwcmVNQlI6IHVpbnQ2NAoJdHhuIEdyb3VwSW5kZXgKCWludCAxCgktCgljYWxsc3ViIHZlcmlmeU1CUlBheW1lbnQKCmlmMV9lbmQ6CglyZXRzdWIKCmFiaV9yb3V0ZV9kZWxldGVXaGl0ZWxpc3Q6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgZGVsZXRlV2hpdGVsaXN0CglpbnQgMQoJcmV0dXJuCgpkZWxldGVXaGl0ZWxpc3Q6Cglwcm90byA0IDAKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjgwCgkvLyBwcmVNQlIgPSB0aGlzLmFwcC5hZGRyZXNzLm1pbkJhbGFuY2UKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglhc3NlcnQKCWZyYW1lX2J1cnkgLTMgLy8gcHJlTUJSOiB1aW50NjQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjgxCgkvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdCA9IHsgYWNjb3VudDogdGhpcy50eG4uc2VuZGVyLCBib3hJbmRleDogYm94SW5kZXgsIGFyYzogYXJjIH0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDI0CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJdHhuIFNlbmRlcgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglmcmFtZV9kaWcgLTIgLy8gYm94SW5kZXg6IHVpbnQxNgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglmcmFtZV9kaWcgLTEgLy8gYXJjOiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC00IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czo4MwoJLy8gdGhpcy53aGl0ZWxpc3QuZGVsZXRlKHdoaXRlbGlzdCkKCWZyYW1lX2RpZyAtNCAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2RlbAoKCS8vIGV4YW1wbGVzL2FyYzc1L2FyYzc1LmFsZ28udHM6ODUKCS8vIHRoaXMuc2VuZE1CUlBheW1lbnQocHJlTUJSKQoJZnJhbWVfZGlnIC0zIC8vIHByZU1CUjogdWludDY0CgljYWxsc3ViIHNlbmRNQlJQYXltZW50CglyZXRzdWIKCmFiaV9yb3V0ZV9kZWxldGVBcHBGcm9tV2hpdGVsaXN0OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDQKCWJ0b2kKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIGRlbGV0ZUFwcEZyb21XaGl0ZWxpc3QKCWludCAxCglyZXR1cm4KCmRlbGV0ZUFwcEZyb21XaGl0ZWxpc3Q6Cglwcm90byA3IDAKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjk3CgkvLyBwcmVNQlIgPSB0aGlzLmFwcC5hZGRyZXNzLm1pbkJhbGFuY2UKCXR4bmEgQXBwbGljYXRpb25zIDAKCWFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKCWFzc2VydAoJYWNjdF9wYXJhbXNfZ2V0IEFjY3RNaW5CYWxhbmNlCglhc3NlcnQKCWZyYW1lX2J1cnkgLTUgLy8gcHJlTUJSOiB1aW50NjQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjk4CgkvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdCA9IHsgYWNjb3VudDogdGhpcy50eG4uc2VuZGVyLCBib3hJbmRleDogYm94SW5kZXgsIGFyYzogYXJjIH0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDI0CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJdHhuIFNlbmRlcgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglmcmFtZV9kaWcgLTIgLy8gYm94SW5kZXg6IHVpbnQxNgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglmcmFtZV9kaWcgLTEgLy8gYXJjOiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC02IC8vIHdoaXRlbGlzdDogV2hpdGVsaXN0CgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoxMDAKCS8vIHNwbGljZWQgPSB0aGlzLndoaXRlbGlzdC5nZXQod2hpdGVsaXN0KS5zcGxpY2UoaW5kZXgsIDEpCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCWFzc2VydAoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtNCAvLyBpbmRleDogdWludDY0CglpbnQgOAoJKgoJaW50IDIKCSsKCXN0b3JlIDEyIC8vIHNwbGljZSBzdGFydAoJaW50IDEKCWludCA4CgkqCglpbnQgOAoJKwoJc3RvcmUgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCWFzc2VydAoJaW50IDIKCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0CglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWJveF9nZXQKCWFzc2VydAoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDgKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtNiAvLyB3aGl0ZWxpc3Q6IFdoaXRlbGlzdAoJYm94X2dldAoJYXNzZXJ0Cglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWludCA4CgktCglleHRyYWN0MwoJY29uY2F0Cglzd2FwCglmcmFtZV9kaWcgLTYgLy8gd2hpdGVsaXN0OiBXaGl0ZWxpc3QKCWR1cAoJYm94X2RlbAoJcG9wCglzd2FwCglib3hfcHV0CglmcmFtZV9idXJ5IC03IC8vIHNwbGljZWQ6IHVpbnQ2NFtdCgoJLy8gZXhhbXBsZXMvYXJjNzUvYXJjNzUuYWxnby50czoxMDIKCS8vIGFzc2VydChzcGxpY2VkWzBdID09PSBhcHBJRCkKCWZyYW1lX2RpZyAtNyAvLyBzcGxpY2VkOiB1aW50NjRbXQoJaW50IDAKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC0zIC8vIGFwcElEOiB1aW50NjQKCT09Cglhc3NlcnQKCgkvLyBleGFtcGxlcy9hcmM3NS9hcmM3NS5hbGdvLnRzOjEwNAoJLy8gdGhpcy5zZW5kTUJSUGF5bWVudChwcmVNQlIpCglmcmFtZV9kaWcgLTUgLy8gcHJlTUJSOiB1aW50NjQKCWNhbGxzdWIgc2VuZE1CUlBheW1lbnQKCXJldHN1YgoKbWFpbjoKCXR4biBOdW1BcHBBcmdzCglibnogcm91dGVfYWJpCgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCT09CglibnogYmFyZV9yb3V0ZV9jcmVhdGUKCnJvdXRlX2FiaToKCW1ldGhvZCAiYWRkQXBwVG9XaGl0ZUxpc3Qoc3RyaW5nLHVpbnQxNix1aW50NjQscGF5KXZvaWQiCgltZXRob2QgInNldEFwcFdoaXRlbGlzdChzdHJpbmcsdWludDE2LHVpbnQ2NFtdKXZvaWQiCgltZXRob2QgImRlbGV0ZVdoaXRlbGlzdChzdHJpbmcsdWludDE2KXZvaWQiCgltZXRob2QgImRlbGV0ZUFwcEZyb21XaGl0ZWxpc3Qoc3RyaW5nLHVpbnQxNix1aW50NjQsdWludDY0KXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCBhYmlfcm91dGVfYWRkQXBwVG9XaGl0ZUxpc3QgYWJpX3JvdXRlX3NldEFwcFdoaXRlbGlzdCBhYmlfcm91dGVfZGVsZXRlV2hpdGVsaXN0IGFiaV9yb3V0ZV9kZWxldGVBcHBGcm9tV2hpdGVsaXN0","clear":"I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"},"contract":{"name":"ARC75","desc":"","methods":[{"name":"addAppToWhiteList","args":[{"name":"arc","type":"string","desc":""},{"name":"boxIndex","type":"uint16","desc":""},{"name":"appID","type":"uint64","desc":""},{"name":"payment","type":"pay","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"setAppWhitelist","args":[{"name":"arc","type":"string","desc":""},{"name":"boxIndex","type":"uint16","desc":""},{"name":"appIDs","type":"uint64[]","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"deleteWhitelist","args":[{"name":"arc","type":"string","desc":""},{"name":"boxIndex","type":"uint16","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"deleteAppFromWhitelist","args":[{"name":"arc","type":"string","desc":""},{"name":"boxIndex","type":"uint16","desc":""},{"name":"appID","type":"uint64","desc":""},{"name":"index","type":"uint64","desc":""}],"desc":"","returns":{"type":"void","desc":""}}]}} \ No newline at end of file diff --git a/examples/arc75/artifacts/ARC75.src_map.json b/examples/arc75/artifacts/ARC75.src_map.json index 5c3af4304..2eb643894 100644 --- a/examples/arc75/artifacts/ARC75.src_map.json +++ b/examples/arc75/artifacts/ARC75.src_map.json @@ -12,329 +12,329 @@ "10": 0, "11": 0, "12": 0, - "13": 0, + "13": 1, "14": 1, "15": 1, - "16": 1, + "16": 4, "17": 4, - "18": 4, - "19": 5, - "20": 6, + "18": 5, + "19": 6, + "20": 7, "21": 7, - "22": 7, - "23": 8, - "24": 9, - "25": 10, - "26": 11, + "22": 8, + "23": 9, + "24": 10, + "25": 11, + "26": 12, "27": 12, "28": 12, - "29": 12, - "30": 13, - "31": 14, + "29": 13, + "30": 14, + "31": 17, "32": 17, "33": 17, - "34": 17, - "35": 18, + "34": 18, + "35": 21, "36": 21, "37": 21, - "38": 21, + "38": 25, "39": 25, - "40": 25, + "40": 26, "41": 26, - "42": 26, + "42": 27, "43": 27, "44": 27, - "45": 27, + "45": 28, "46": 28, - "47": 28, - "48": 29, + "47": 29, + "48": 30, "49": 30, - "50": 30, - "51": 31, + "50": 31, + "51": 32, "52": 32, - "53": 32, - "54": 33, - "55": 34, - "56": 35, + "53": 33, + "54": 34, + "55": 35, + "56": 39, "57": 39, - "58": 39, + "58": 40, "59": 40, - "60": 40, + "60": 41, "61": 41, "62": 41, - "63": 41, + "63": 42, "64": 42, - "65": 42, - "66": 43, - "67": 44, - "68": 45, - "69": 46, + "65": 43, + "66": 44, + "67": 45, + "68": 46, + "69": 49, "70": 49, "71": 49, - "72": 49, - "73": 53, - "74": 54, + "72": 53, + "73": 54, + "74": 55, "75": 55, - "76": 55, + "76": 59, "77": 59, "78": 59, - "79": 59, + "79": 60, "80": 60, - "81": 60, - "82": 61, + "81": 61, + "82": 62, "83": 62, - "84": 62, + "84": 66, "85": 66, - "86": 66, + "86": 67, "87": 67, - "88": 67, + "88": 71, "89": 71, - "90": 71, + "90": 72, "91": 72, "92": 72, - "93": 72, + "93": 73, "94": 73, - "95": 73, - "96": 74, + "95": 74, + "96": 75, "97": 75, - "98": 75, - "99": 76, - "100": 77, + "98": 76, + "99": 77, + "100": 78, "101": 78, - "102": 78, - "103": 82, + "102": 82, + "103": 83, "104": 83, - "105": 83, - "106": 84, - "107": 85, + "105": 84, + "106": 85, + "107": 88, "108": 88, - "109": 88, - "110": 89, - "111": 90, + "109": 89, + "110": 90, + "111": 91, "112": 91, - "113": 91, - "114": 92, - "115": 93, - "116": 94, - "117": 95, - "118": 96, + "113": 92, + "114": 93, + "115": 94, + "116": 95, + "117": 96, + "118": 97, "119": 97, - "120": 97, + "120": 98, "121": 98, - "122": 98, - "123": 99, - "124": 100, + "122": 99, + "123": 100, + "124": 101, "125": 101, "126": 101, - "127": 101, - "128": 102, + "127": 102, + "128": 103, "129": 103, "130": 103, - "131": 103, + "131": 104, "132": 104, "133": 104, - "134": 104, + "134": 105, "135": 105, "136": 105, - "137": 105, + "137": 106, "138": 106, "139": 106, - "140": 106, - "141": 107, - "142": 108, + "140": 107, + "141": 108, + "142": 111, "143": 111, "144": 111, - "145": 111, + "145": 115, "146": 115, "147": 115, - "148": 115, + "148": 116, "149": 116, - "150": 116, - "151": 117, + "150": 117, + "151": 118, "152": 118, - "153": 118, - "154": 119, + "153": 119, + "154": 120, "155": 120, - "156": 120, - "157": 124, - "158": 124, - "159": 125, - "160": 125, - "161": 126, - "162": 127, - "163": 127, - "164": 128, - "165": 129, - "166": 129, - "167": 130, + "156": 124, + "157": 125, + "158": 126, + "159": 126, + "160": 127, + "161": 127, + "162": 128, + "163": 129, + "164": 129, + "165": 130, + "166": 130, + "167": 131, "168": 131, - "169": 131, - "170": 132, + "169": 132, + "170": 133, "171": 133, - "172": 133, + "172": 134, "173": 134, - "174": 134, + "174": 135, "175": 135, "176": 136, "177": 137, - "178": 138, + "178": 137, "179": 138, "180": 138, "181": 139, - "182": 140, - "183": 141, + "182": 139, + "183": 140, "184": 141, - "185": 142, - "186": 143, - "187": 144, - "188": 144, - "189": 145, + "185": 141, + "186": 142, + "187": 142, + "188": 143, + "189": 144, "190": 145, "191": 146, "192": 146, - "193": 147, + "193": 146, "194": 147, "195": 148, "196": 149, "197": 150, - "198": 150, - "199": 155, - "200": 155, - "201": 156, - "202": 157, - "203": 158, - "204": 159, - "205": 159, - "206": 159, - "207": 164, - "208": 164, - "209": 165, - "210": 166, - "211": 167, - "212": 168, - "213": 169, - "214": 170, - "215": 171, - "216": 172, - "217": 173, - "218": 173, - "219": 173, - "220": 174, - "221": 175, - "222": 175, - "223": 175, - "224": 176, - "225": 177, - "226": 177, - "227": 178, - "228": 179, - "229": 180, - "230": 180, - "231": 181, - "232": 182, - "233": 183, - "234": 184, - "235": 185, - "236": 186, - "237": 186, + "198": 151, + "199": 151, + "200": 152, + "201": 153, + "202": 154, + "203": 155, + "204": 155, + "205": 155, + "206": 156, + "207": 156, + "208": 157, + "209": 157, + "210": 158, + "211": 159, + "212": 160, + "213": 160, + "214": 161, + "215": 161, + "216": 162, + "217": 162, + "218": 163, + "219": 164, + "220": 164, + "221": 169, + "222": 169, + "223": 170, + "224": 171, + "225": 172, + "226": 173, + "227": 173, + "228": 173, + "229": 178, + "230": 178, + "231": 179, + "232": 180, + "233": 181, + "234": 182, + "235": 183, + "236": 184, + "237": 185, "238": 186, - "239": 191, - "240": 191, - "241": 191, - "242": 191, - "243": 192, - "244": 192, - "245": 193, - "246": 194, - "247": 195, - "248": 195, - "249": 199, - "250": 199, - "251": 200, - "252": 201, - "253": 202, - "254": 203, - "255": 203, - "256": 204, - "257": 209, - "258": 209, - "259": 210, - "260": 210, - "261": 211, - "262": 211, - "263": 211, - "264": 212, - "265": 215, - "266": 215, - "267": 216, - "268": 217, - "269": 218, - "270": 218, - "271": 219, - "272": 220, - "273": 221, - "274": 222, - "275": 223, - "276": 224, - "277": 225, - "278": 225, - "279": 225, - "280": 226, - "281": 226, - "282": 226, - "283": 227, - "284": 227, - "285": 227, - "286": 228, - "287": 228, - "288": 228, - "289": 229, - "290": 229, - "291": 229, - "292": 230, - "293": 231, + "239": 187, + "240": 187, + "241": 187, + "242": 188, + "243": 189, + "244": 189, + "245": 189, + "246": 190, + "247": 191, + "248": 191, + "249": 192, + "250": 193, + "251": 194, + "252": 194, + "253": 195, + "254": 196, + "255": 197, + "256": 198, + "257": 199, + "258": 200, + "259": 200, + "260": 200, + "261": 205, + "262": 205, + "263": 206, + "264": 207, + "265": 207, + "266": 207, + "267": 207, + "268": 208, + "269": 209, + "270": 210, + "271": 210, + "272": 214, + "273": 214, + "274": 215, + "275": 216, + "276": 217, + "277": 218, + "278": 218, + "279": 219, + "280": 224, + "281": 224, + "282": 225, + "283": 225, + "284": 226, + "285": 226, + "286": 226, + "287": 227, + "288": 230, + "289": 230, + "290": 231, + "291": 232, + "292": 233, + "293": 233, "294": 234, - "295": 234, - "296": 234, - "297": 238, + "295": 235, + "296": 236, + "297": 237, "298": 238, - "299": 238, - "300": 239, - "301": 239, + "299": 239, + "300": 240, + "301": 240, "302": 240, "303": 241, "304": 241, - "305": 242, - "306": 243, - "307": 243, - "308": 247, - "309": 247, - "310": 248, - "311": 248, - "312": 249, - "313": 250, - "314": 250, - "315": 251, - "316": 252, - "317": 252, - "318": 253, - "319": 254, - "320": 254, - "321": 255, - "322": 256, - "323": 256, - "324": 257, - "325": 257, - "326": 258, - "327": 259, - "328": 260, - "329": 261, - "330": 261, - "331": 261, - "332": 262, - "333": 263, + "305": 241, + "306": 242, + "307": 242, + "308": 242, + "309": 243, + "310": 243, + "311": 243, + "312": 244, + "313": 244, + "314": 244, + "315": 245, + "316": 246, + "317": 249, + "318": 249, + "319": 249, + "320": 253, + "321": 253, + "322": 253, + "323": 254, + "324": 254, + "325": 255, + "326": 256, + "327": 256, + "328": 257, + "329": 258, + "330": 258, + "331": 262, + "332": 263, + "333": 264, "334": 264, - "335": 264, + "335": 265, "336": 265, "337": 266, "338": 267, @@ -344,377 +344,466 @@ "342": 269, "343": 269, "344": 270, - "345": 270, + "345": 271, "346": 271, "347": 272, - "348": 273, + "348": 272, "349": 273, - "350": 277, - "351": 277, - "352": 278, - "353": 282, - "354": 282, - "355": 283, - "356": 284, - "357": 285, - "358": 286, - "359": 286, - "360": 287, - "361": 292, - "362": 292, - "363": 293, - "364": 293, - "365": 293, - "366": 294, - "367": 294, - "368": 295, - "369": 296, - "370": 296, - "371": 297, - "372": 298, - "373": 299, - "374": 299, - "375": 299, - "376": 304, - "377": 304, - "378": 305, - "379": 305, - "380": 305, - "381": 306, - "382": 306, - "383": 306, - "384": 311, - "385": 311, - "386": 312, - "387": 312, - "388": 313, - "389": 314, - "390": 315, - "391": 315, - "392": 315, - "393": 318, - "394": 321, - "395": 321, - "396": 322, - "397": 323, - "398": 324, - "399": 324, - "400": 325, - "401": 326, - "402": 327, - "403": 328, - "404": 329, - "405": 330, - "406": 331, - "407": 331, - "408": 331, - "409": 332, - "410": 332, - "411": 332, - "412": 333, - "413": 333, - "414": 333, - "415": 334, - "416": 334, - "417": 334, - "418": 335, - "419": 336, - "420": 339, - "421": 339, - "422": 339, - "423": 343, - "424": 343, - "425": 343, - "426": 344, - "427": 344, - "428": 345, - "429": 346, - "430": 346, - "431": 347, - "432": 348, - "433": 348, - "434": 352, - "435": 352, - "436": 353, - "437": 353, - "438": 354, - "439": 355, - "440": 355, - "441": 356, - "442": 357, - "443": 357, - "444": 358, - "445": 359, - "446": 359, - "447": 360, - "448": 361, - "449": 361, - "450": 362, - "451": 362, - "452": 363, - "453": 364, - "454": 365, - "455": 366, - "456": 366, - "457": 366, - "458": 367, - "459": 368, - "460": 369, - "461": 369, - "462": 370, - "463": 371, - "464": 372, - "465": 372, - "466": 373, - "467": 373, - "468": 374, - "469": 374, - "470": 375, - "471": 375, - "472": 376, - "473": 377, - "474": 378, - "475": 378, - "476": 382, - "477": 382, - "478": 383, - "479": 387, - "480": 387, - "481": 388, - "482": 388, - "483": 388, - "484": 389, - "485": 392, - "486": 392, - "487": 393, - "488": 394, - "489": 395, - "490": 395, - "491": 396, - "492": 397, - "493": 398, - "494": 399, - "495": 400, - "496": 401, - "497": 401, - "498": 402, - "499": 402, - "500": 402, - "501": 403, - "502": 404, - "503": 404, - "504": 404, - "505": 405, - "506": 406, - "507": 406, - "508": 406, - "509": 407, - "510": 407, - "511": 407, - "512": 408, - "513": 408, - "514": 408, - "515": 409, - "516": 409, - "517": 409, - "518": 410, - "519": 411, - "520": 414, - "521": 414, - "522": 414, - "523": 418, - "524": 418, - "525": 418, - "526": 419, - "527": 419, - "528": 420, - "529": 421, - "530": 421, - "531": 422, - "532": 423, - "533": 423, - "534": 427, - "535": 427, - "536": 428, - "537": 428, - "538": 429, - "539": 430, - "540": 430, - "541": 431, - "542": 432, - "543": 432, - "544": 433, - "545": 434, - "546": 434, - "547": 435, - "548": 436, - "549": 436, - "550": 437, - "551": 437, - "552": 438, - "553": 439, - "554": 440, - "555": 441, - "556": 441, - "557": 441, - "558": 442, - "559": 443, - "560": 444, - "561": 444, - "562": 445, - "563": 446, - "564": 447, - "565": 447, - "566": 448, - "567": 448, - "568": 449, - "569": 449, - "570": 450, - "571": 450, - "572": 451, - "573": 452, - "574": 453, - "575": 453, - "576": 457, - "577": 457, - "578": 458, - "579": 459, - "580": 460, - "581": 461, - "582": 462, - "583": 463, - "584": 464, - "585": 465, - "586": 465, - "587": 465, - "588": 466, - "589": 466, - "590": 467, - "591": 468, - "592": 469, - "593": 469, - "594": 470, - "595": 471, - "596": 471, - "597": 472, - "598": 473, - "599": 474, - "600": 475, - "601": 476, - "602": 477, - "603": 477, - "604": 478, - "605": 478, - "606": 479, - "607": 480, - "608": 481, - "609": 481, - "610": 482, - "611": 482, - "612": 483, - "613": 484, - "614": 484, - "615": 485, - "616": 486, - "617": 487, - "618": 488, - "619": 489, - "620": 489, - "621": 490, - "622": 490, - "623": 491, - "624": 492, - "625": 493, - "626": 494, - "627": 495, - "628": 496, - "629": 497, - "630": 498, - "631": 499, - "632": 500, - "633": 500, - "634": 500, - "635": 501, - "636": 501, - "637": 502, - "638": 503, - "639": 504, - "640": 504, - "641": 505, - "642": 505, - "643": 506, - "644": 507, - "645": 508, - "646": 509, - "647": 510, - "648": 511, - "649": 511, - "650": 512, - "651": 513, - "652": 514, - "653": 515, - "654": 516, - "655": 517, - "656": 517, - "657": 521, - "658": 521, - "659": 522, - "660": 523, - "661": 524, - "662": 525, - "663": 525, - "664": 526, - "665": 527, - "666": 528, - "667": 529, - "668": 530, - "669": 530, - "670": 531, - "671": 532, - "672": 536, - "673": 536, - "674": 537, - "675": 537, - "676": 537, - "677": 538, - "678": 541, - "679": 541, - "680": 542, - "681": 542, - "682": 542, - "683": 543, - "684": 543, - "685": 544, - "686": 545, - "687": 546, - "688": 546, - "689": 546, - "690": 549, - "691": 549, - "692": 549, - "693": 549, - "694": 549, - "695": 549, - "696": 550, - "697": 550, - "698": 550, - "699": 550, - "700": 550, - "701": 550, - "702": 551, - "703": 551, - "704": 551, - "705": 551, - "706": 551, - "707": 551, - "708": 552, - "709": 552, - "710": 552, - "711": 552, - "712": 552, - "713": 552, - "714": 553, - "715": 553, - "716": 553, - "717": 554 + "350": 273, + "351": 274, + "352": 275, + "353": 275, + "354": 276, + "355": 276, + "356": 277, + "357": 277, + "358": 278, + "359": 279, + "360": 279, + "361": 280, + "362": 280, + "363": 281, + "364": 282, + "365": 283, + "366": 284, + "367": 284, + "368": 284, + "369": 285, + "370": 286, + "371": 287, + "372": 288, + "373": 289, + "374": 289, + "375": 290, + "376": 291, + "377": 292, + "378": 293, + "379": 293, + "380": 293, + "381": 294, + "382": 294, + "383": 295, + "384": 295, + "385": 296, + "386": 297, + "387": 298, + "388": 298, + "389": 299, + "390": 299, + "391": 300, + "392": 300, + "393": 301, + "394": 302, + "395": 302, + "396": 306, + "397": 306, + "398": 307, + "399": 311, + "400": 311, + "401": 312, + "402": 313, + "403": 314, + "404": 315, + "405": 315, + "406": 316, + "407": 321, + "408": 321, + "409": 322, + "410": 322, + "411": 322, + "412": 323, + "413": 323, + "414": 324, + "415": 325, + "416": 325, + "417": 326, + "418": 327, + "419": 328, + "420": 328, + "421": 328, + "422": 333, + "423": 333, + "424": 334, + "425": 334, + "426": 334, + "427": 335, + "428": 335, + "429": 335, + "430": 340, + "431": 340, + "432": 341, + "433": 341, + "434": 342, + "435": 343, + "436": 344, + "437": 344, + "438": 344, + "439": 347, + "440": 350, + "441": 350, + "442": 351, + "443": 352, + "444": 353, + "445": 353, + "446": 354, + "447": 355, + "448": 356, + "449": 357, + "450": 358, + "451": 359, + "452": 360, + "453": 360, + "454": 360, + "455": 361, + "456": 361, + "457": 361, + "458": 362, + "459": 362, + "460": 362, + "461": 363, + "462": 363, + "463": 363, + "464": 364, + "465": 365, + "466": 368, + "467": 368, + "468": 368, + "469": 372, + "470": 372, + "471": 372, + "472": 373, + "473": 373, + "474": 374, + "475": 375, + "476": 375, + "477": 376, + "478": 377, + "479": 377, + "480": 381, + "481": 382, + "482": 383, + "483": 383, + "484": 384, + "485": 384, + "486": 385, + "487": 386, + "488": 386, + "489": 387, + "490": 387, + "491": 388, + "492": 388, + "493": 389, + "494": 390, + "495": 390, + "496": 391, + "497": 391, + "498": 392, + "499": 392, + "500": 393, + "501": 394, + "502": 394, + "503": 395, + "504": 395, + "505": 396, + "506": 396, + "507": 397, + "508": 398, + "509": 398, + "510": 399, + "511": 399, + "512": 400, + "513": 401, + "514": 402, + "515": 403, + "516": 403, + "517": 403, + "518": 404, + "519": 405, + "520": 406, + "521": 407, + "522": 408, + "523": 408, + "524": 409, + "525": 410, + "526": 411, + "527": 412, + "528": 412, + "529": 412, + "530": 413, + "531": 413, + "532": 414, + "533": 414, + "534": 415, + "535": 416, + "536": 417, + "537": 417, + "538": 418, + "539": 418, + "540": 419, + "541": 419, + "542": 420, + "543": 421, + "544": 421, + "545": 425, + "546": 425, + "547": 426, + "548": 430, + "549": 430, + "550": 431, + "551": 431, + "552": 431, + "553": 432, + "554": 435, + "555": 435, + "556": 436, + "557": 437, + "558": 438, + "559": 438, + "560": 439, + "561": 440, + "562": 441, + "563": 442, + "564": 443, + "565": 444, + "566": 444, + "567": 445, + "568": 445, + "569": 445, + "570": 446, + "571": 447, + "572": 447, + "573": 447, + "574": 448, + "575": 449, + "576": 449, + "577": 449, + "578": 450, + "579": 450, + "580": 450, + "581": 451, + "582": 451, + "583": 451, + "584": 452, + "585": 452, + "586": 452, + "587": 453, + "588": 454, + "589": 457, + "590": 457, + "591": 457, + "592": 461, + "593": 461, + "594": 461, + "595": 462, + "596": 462, + "597": 463, + "598": 464, + "599": 464, + "600": 465, + "601": 466, + "602": 466, + "603": 470, + "604": 471, + "605": 472, + "606": 472, + "607": 473, + "608": 473, + "609": 474, + "610": 475, + "611": 475, + "612": 476, + "613": 476, + "614": 477, + "615": 477, + "616": 478, + "617": 479, + "618": 479, + "619": 480, + "620": 480, + "621": 481, + "622": 481, + "623": 482, + "624": 483, + "625": 483, + "626": 484, + "627": 484, + "628": 485, + "629": 485, + "630": 486, + "631": 487, + "632": 487, + "633": 488, + "634": 488, + "635": 489, + "636": 490, + "637": 491, + "638": 492, + "639": 492, + "640": 492, + "641": 493, + "642": 494, + "643": 495, + "644": 496, + "645": 497, + "646": 497, + "647": 498, + "648": 499, + "649": 500, + "650": 501, + "651": 501, + "652": 501, + "653": 502, + "654": 502, + "655": 503, + "656": 503, + "657": 504, + "658": 505, + "659": 506, + "660": 506, + "661": 507, + "662": 507, + "663": 508, + "664": 508, + "665": 509, + "666": 510, + "667": 510, + "668": 514, + "669": 514, + "670": 515, + "671": 516, + "672": 517, + "673": 518, + "674": 519, + "675": 520, + "676": 521, + "677": 522, + "678": 522, + "679": 522, + "680": 523, + "681": 523, + "682": 524, + "683": 525, + "684": 526, + "685": 527, + "686": 528, + "687": 528, + "688": 529, + "689": 530, + "690": 531, + "691": 532, + "692": 533, + "693": 534, + "694": 534, + "695": 535, + "696": 535, + "697": 536, + "698": 537, + "699": 538, + "700": 539, + "701": 539, + "702": 540, + "703": 541, + "704": 541, + "705": 542, + "706": 543, + "707": 544, + "708": 545, + "709": 546, + "710": 546, + "711": 547, + "712": 547, + "713": 548, + "714": 549, + "715": 550, + "716": 551, + "717": 552, + "718": 553, + "719": 554, + "720": 555, + "721": 556, + "722": 557, + "723": 557, + "724": 557, + "725": 558, + "726": 558, + "727": 559, + "728": 560, + "729": 561, + "730": 561, + "731": 562, + "732": 562, + "733": 563, + "734": 564, + "735": 565, + "736": 566, + "737": 567, + "738": 568, + "739": 568, + "740": 569, + "741": 570, + "742": 571, + "743": 572, + "744": 573, + "745": 574, + "746": 574, + "747": 578, + "748": 578, + "749": 579, + "750": 580, + "751": 581, + "752": 582, + "753": 583, + "754": 584, + "755": 585, + "756": 586, + "757": 587, + "758": 587, + "759": 588, + "760": 589, + "761": 593, + "762": 593, + "763": 594, + "764": 594, + "765": 594, + "766": 595, + "767": 598, + "768": 598, + "769": 599, + "770": 599, + "771": 599, + "772": 600, + "773": 600, + "774": 601, + "775": 602, + "776": 603, + "777": 603, + "778": 603, + "779": 606, + "780": 606, + "781": 606, + "782": 606, + "783": 606, + "784": 606, + "785": 607, + "786": 607, + "787": 607, + "788": 607, + "789": 607, + "790": 607, + "791": 608, + "792": 608, + "793": 608, + "794": 608, + "795": 608, + "796": 608, + "797": 609, + "798": 609, + "799": 609, + "800": 609, + "801": 609, + "802": 609, + "803": 610, + "804": 610, + "805": 610, + "806": 611 } \ No newline at end of file diff --git a/examples/merkle/artifacts/MerkleTree.approval.teal b/examples/merkle/artifacts/MerkleTree.approval.teal index dec93a27b..bddb83580 100644 --- a/examples/merkle/artifacts/MerkleTree.approval.teal +++ b/examples/merkle/artifacts/MerkleTree.approval.teal @@ -90,8 +90,8 @@ for_1: // elem = path[i] frame_dig -2 // path: byte[33][3] frame_dig -4 // i: uint64 - int 33 - * + int 33 // element length + * // element offset int 33 extract3 frame_bury -5 // elem: byte[33] diff --git a/examples/merkle/artifacts/MerkleTree.json b/examples/merkle/artifacts/MerkleTree.json index 96e4182ab..3f8ffbdc0 100644 --- a/examples/merkle/artifacts/MerkleTree.json +++ b/examples/merkle/artifacts/MerkleTree.json @@ -1 +1 @@ -{"hints":{},"schema":{"local":{"declared":{},"reserved":{}},"global":{"declared":{"root":{"type":"bytes","key":"root"},"size":{"type":"uint64","key":"size"}},"reserved":{}}},"state":{"global":{"num_byte_slices":1,"num_uints":1},"local":{"num_byte_slices":0,"num_uints":0}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKY2FsY0luaXRSb290OgoJcHJvdG8gMiAxCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjE3CgkvLyByZXN1bHQgPSBFTVBUWV9IQVNICgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NAoJLy8gaGV4KCdlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1JykKCWJ5dGUgMHhlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1CglmcmFtZV9idXJ5IC0xIC8vIHJlc3VsdDogYnl0ZXMKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MTkKCS8vIGkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCmZvcl8wOgoJZnJhbWVfZGlnIC0yIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6IGZvcl8wX2VuZAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoyMAoJLy8gcmVzdWx0ID0gc2hhMjU2KHJlc3VsdCArIHJlc3VsdCkKCWZyYW1lX2RpZyAtMSAvLyByZXN1bHQ6IGJ5dGVzCglmcmFtZV9kaWcgLTEgLy8gcmVzdWx0OiBieXRlcwoJY29uY2F0CglzaGEyNTYKCWZyYW1lX2J1cnkgLTEgLy8gcmVzdWx0OiBieXRlcwoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoxOQoJLy8gaSA9IGkgKyAxCglmcmFtZV9kaWcgLTIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCWIgZm9yXzAKCmZvcl8wX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoyMwoJLy8gcmV0dXJuIHJlc3VsdDsKCWZyYW1lX2RpZyAtMSAvLyByZXN1bHQ6IGJ5dGVzCglyZXRzdWIKCmhhc2hDb25jYXQ6Cglwcm90byAyIDEKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MjcKCS8vIHJldHVybiBzaGEyNTYobGVmdCArIHJpZ2h0KTsKCWZyYW1lX2RpZyAtMSAvLyBsZWZ0OiBieXRlcwoJZnJhbWVfZGlnIC0yIC8vIHJpZ2h0OiBieXRlcwoJY29uY2F0CglzaGEyNTYKCXJldHN1YgoKaXNSaWdodFNpYmxpbmc6Cglwcm90byAxIDEKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MzEKCS8vIHJldHVybiBnZXRieXRlKGVsZW0sIDApID09PSBSSUdIVF9TSUJMSU5HX1BSRUZJWDsKCWZyYW1lX2RpZyAtMSAvLyBlbGVtOiBieXRlWzMzXQoJaW50IDAKCWdldGJ5dGUKCWludCAxNzAKCT09CglyZXRzdWIKCmNhbGNSb290OgoJcHJvdG8gNSAxCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjM1CgkvLyByZXN1bHQgPSBsZWFmCglmcmFtZV9kaWcgLTEgLy8gbGVhZjogYnl0ZXMKCWZyYW1lX2J1cnkgLTMgLy8gcmVzdWx0OiBieXRlcwoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czozNwoJLy8gaSA9IDAKCWludCAwCglmcmFtZV9idXJ5IC00IC8vIGk6IHVpbnQ2NAoKZm9yXzE6CglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMwoJPAoJYnogZm9yXzFfZW5kCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjM4CgkvLyBlbGVtID0gcGF0aFtpXQoJZnJhbWVfZGlnIC0yIC8vIHBhdGg6IGJ5dGVbMzNdWzNdCglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMzMKCSoKCWludCAzMwoJZXh0cmFjdDMKCWZyYW1lX2J1cnkgLTUgLy8gZWxlbTogYnl0ZVszM10KCgkvLyBpZjBfY29uZGl0aW9uCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NDAKCS8vIHRoaXMuaXNSaWdodFNpYmxpbmcoZWxlbSkKCWZyYW1lX2RpZyAtNSAvLyBlbGVtOiBieXRlWzMzXQoJY2FsbHN1YiBpc1JpZ2h0U2libGluZwoJYnogaWYwX2Vsc2UKCgkvLyBpZjBfY29uc2VxdWVudAoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjQxCgkvLyByZXN1bHQgPSB0aGlzLmhhc2hDb25jYXQocmVzdWx0LCBleHRyYWN0MyhlbGVtLCAxLCAzMikpCglmcmFtZV9kaWcgLTUgLy8gZWxlbTogYnl0ZVszM10KCWludCAxCglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9kaWcgLTMgLy8gcmVzdWx0OiBieXRlcwoJY2FsbHN1YiBoYXNoQ29uY2F0CglmcmFtZV9idXJ5IC0zIC8vIHJlc3VsdDogYnl0ZXMKCWIgaWYwX2VuZAoKaWYwX2Vsc2U6CgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NDMKCS8vIHJlc3VsdCA9IHRoaXMuaGFzaENvbmNhdChleHRyYWN0MyhlbGVtLCAxLCAzMiksIHJlc3VsdCkKCWZyYW1lX2RpZyAtMyAvLyByZXN1bHQ6IGJ5dGVzCglmcmFtZV9kaWcgLTUgLy8gZWxlbTogYnl0ZVszM10KCWludCAxCglpbnQgMzIKCWV4dHJhY3QzCgljYWxsc3ViIGhhc2hDb25jYXQKCWZyYW1lX2J1cnkgLTMgLy8gcmVzdWx0OiBieXRlcwoKaWYwX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czozNwoJLy8gaSA9IGkgKyAxCglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAtNCAvLyBpOiB1aW50NjQKCWIgZm9yXzEKCmZvcl8xX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo0NwoJLy8gcmV0dXJuIHJlc3VsdDsKCWZyYW1lX2RpZyAtMyAvLyByZXN1bHQ6IGJ5dGVzCglyZXRzdWIKCmJhcmVfcm91dGVfRGVsZXRlQXBwbGljYXRpb246Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CgljYWxsc3ViIGRlbGV0ZQoJaW50IDEKCXJldHVybgoKZGVsZXRlOgoJcHJvdG8gMCAwCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjUyCgkvLyBhc3NlcnQodGhpcy50eG4uc2VuZGVyID09PSB0aGlzLmFwcC5jcmVhdG9yKQoJdHhuIFNlbmRlcgoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CglyZXRzdWIKCmJhcmVfcm91dGVfY3JlYXRlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCT09CgkmJgoJYXNzZXJ0CgljYWxsc3ViIGNyZWF0ZQoJaW50IDEKCXJldHVybgoKY3JlYXRlOgoJcHJvdG8gMCAwCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjU3CgkvLyB0aGlzLnJvb3QucHV0KHRoaXMuY2FsY0luaXRSb290KCkpCglieXRlICJyb290IgoJYnl0ZSAweAoJZHVwCgljYWxsc3ViIGNhbGNJbml0Um9vdAoJYXBwX2dsb2JhbF9wdXQKCXJldHN1YgoKYWJpX3JvdXRlX3ZlcmlmeToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgdmVyaWZ5CglpbnQgMQoJcmV0dXJuCgp2ZXJpZnk6Cglwcm90byAyIDAKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NjEKCS8vIGFzc2VydCh0aGlzLnJvb3QuZ2V0KCkgPT09IHRoaXMuY2FsY1Jvb3Qoc2hhMjU2KGRhdGEpLCBwYXRoKSkKCWJ5dGUgInJvb3QiCglhcHBfZ2xvYmFsX2dldAoJYnl0ZSAweAoJZHVwbiAyCglmcmFtZV9kaWcgLTIgLy8gcGF0aDogYnl0ZVszM11bM10KCWZyYW1lX2RpZyAtMSAvLyBkYXRhOiBieXRlcwoJc2hhMjU2CgljYWxsc3ViIGNhbGNSb290Cgk9PQoJYXNzZXJ0CglyZXRzdWIKCmFiaV9yb3V0ZV9hcHBlbmRMZWFmOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBhcHBlbmRMZWFmCglpbnQgMQoJcmV0dXJuCgphcHBlbmRMZWFmOgoJcHJvdG8gMiAwCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjY1CgkvLyBhc3NlcnQoZGF0YSAhPT0gJycpCglmcmFtZV9kaWcgLTEgLy8gZGF0YTogYnl0ZXMKCWJ5dGUgIiIKCSE9Cglhc3NlcnQKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NjYKCS8vIGFzc2VydCh0aGlzLnJvb3QuZ2V0KCkgPT09IHRoaXMuY2FsY1Jvb3QoRU1QVFlfSEFTSCwgcGF0aCkpCglieXRlICJyb290IgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHgKCWR1cG4gMgoJZnJhbWVfZGlnIC0yIC8vIHBhdGg6IGJ5dGVbMzNdWzNdCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjQKCS8vIGhleCgnZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NScpCglieXRlIDB4ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NQoJY2FsbHN1YiBjYWxjUm9vdAoJPT0KCWFzc2VydAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo2OAoJLy8gdGhpcy5yb290LnB1dCh0aGlzLmNhbGNSb290KHNoYTI1NihkYXRhKSwgcGF0aCkpCglieXRlICJyb290IgoJYnl0ZSAweAoJZHVwbiAyCglmcmFtZV9kaWcgLTIgLy8gcGF0aDogYnl0ZVszM11bM10KCWZyYW1lX2RpZyAtMSAvLyBkYXRhOiBieXRlcwoJc2hhMjU2CgljYWxsc3ViIGNhbGNSb290CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo3MAoJLy8gdGhpcy5zaXplLnB1dCh0aGlzLnNpemUuZ2V0KCkgKyAxKQoJYnl0ZSAic2l6ZSIKCWJ5dGUgInNpemUiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVMZWFmOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglleHRyYWN0IDIgMAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgdXBkYXRlTGVhZgoJaW50IDEKCXJldHVybgoKdXBkYXRlTGVhZjoKCXByb3RvIDMgMAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo3NAoJLy8gYXNzZXJ0KG5ld0RhdGEgIT09ICcnKQoJZnJhbWVfZGlnIC0yIC8vIG5ld0RhdGE6IGJ5dGVzCglieXRlICIiCgkhPQoJYXNzZXJ0CgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjc1CgkvLyBhc3NlcnQodGhpcy5yb290LmdldCgpID09PSB0aGlzLmNhbGNSb290KHNoYTI1NihvbGREYXRhKSwgcGF0aCkpCglieXRlICJyb290IgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHgKCWR1cG4gMgoJZnJhbWVfZGlnIC0zIC8vIHBhdGg6IGJ5dGVbMzNdWzNdCglmcmFtZV9kaWcgLTEgLy8gb2xkRGF0YTogYnl0ZXMKCXNoYTI1NgoJY2FsbHN1YiBjYWxjUm9vdAoJPT0KCWFzc2VydAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo3NwoJLy8gdGhpcy5yb290LnB1dCh0aGlzLmNhbGNSb290KHNoYTI1NihuZXdEYXRhKSwgcGF0aCkpCglieXRlICJyb290IgoJYnl0ZSAweAoJZHVwbiAyCglmcmFtZV9kaWcgLTMgLy8gcGF0aDogYnl0ZVszM11bM10KCWZyYW1lX2RpZyAtMiAvLyBuZXdEYXRhOiBieXRlcwoJc2hhMjU2CgljYWxsc3ViIGNhbGNSb290CglhcHBfZ2xvYmFsX3B1dAoJcmV0c3ViCgptYWluOgoJdHhuIE51bUFwcEFyZ3MKCWJueiByb3V0ZV9hYmkKCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCWJueiBiYXJlX3JvdXRlX2NyZWF0ZQoJdHhuIE9uQ29tcGxldGlvbgoJaW50IERlbGV0ZUFwcGxpY2F0aW9uCgk9PQoJaW50IDEKCW1hdGNoIGJhcmVfcm91dGVfRGVsZXRlQXBwbGljYXRpb24KCnJvdXRlX2FiaToKCW1ldGhvZCAidmVyaWZ5KGJ5dGVbXSxieXRlWzMzXVszXSl2b2lkIgoJbWV0aG9kICJhcHBlbmRMZWFmKGJ5dGVbXSxieXRlWzMzXVszXSl2b2lkIgoJbWV0aG9kICJ1cGRhdGVMZWFmKGJ5dGVbXSxieXRlW10sYnl0ZVszM11bM10pdm9pZCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoIGFiaV9yb3V0ZV92ZXJpZnkgYWJpX3JvdXRlX2FwcGVuZExlYWYgYWJpX3JvdXRlX3VwZGF0ZUxlYWY=","clear":"I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"},"contract":{"name":"MerkleTree","desc":"","methods":[{"name":"verify","args":[{"name":"data","type":"byte[]","desc":""},{"name":"path","type":"byte[33][3]","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"appendLeaf","args":[{"name":"data","type":"byte[]","desc":""},{"name":"path","type":"byte[33][3]","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"updateLeaf","args":[{"name":"oldData","type":"byte[]","desc":""},{"name":"newData","type":"byte[]","desc":""},{"name":"path","type":"byte[33][3]","desc":""}],"desc":"","returns":{"type":"void","desc":""}}]}} \ No newline at end of file +{"hints":{},"schema":{"local":{"declared":{},"reserved":{}},"global":{"declared":{"root":{"type":"bytes","key":"root"},"size":{"type":"uint64","key":"size"}},"reserved":{}}},"state":{"global":{"num_byte_slices":1,"num_uints":1},"local":{"num_byte_slices":0,"num_uints":0}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKY2FsY0luaXRSb290OgoJcHJvdG8gMiAxCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjE3CgkvLyByZXN1bHQgPSBFTVBUWV9IQVNICgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NAoJLy8gaGV4KCdlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1JykKCWJ5dGUgMHhlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1CglmcmFtZV9idXJ5IC0xIC8vIHJlc3VsdDogYnl0ZXMKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MTkKCS8vIGkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCmZvcl8wOgoJZnJhbWVfZGlnIC0yIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6IGZvcl8wX2VuZAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoyMAoJLy8gcmVzdWx0ID0gc2hhMjU2KHJlc3VsdCArIHJlc3VsdCkKCWZyYW1lX2RpZyAtMSAvLyByZXN1bHQ6IGJ5dGVzCglmcmFtZV9kaWcgLTEgLy8gcmVzdWx0OiBieXRlcwoJY29uY2F0CglzaGEyNTYKCWZyYW1lX2J1cnkgLTEgLy8gcmVzdWx0OiBieXRlcwoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoxOQoJLy8gaSA9IGkgKyAxCglmcmFtZV9kaWcgLTIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCWIgZm9yXzAKCmZvcl8wX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoyMwoJLy8gcmV0dXJuIHJlc3VsdDsKCWZyYW1lX2RpZyAtMSAvLyByZXN1bHQ6IGJ5dGVzCglyZXRzdWIKCmhhc2hDb25jYXQ6Cglwcm90byAyIDEKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MjcKCS8vIHJldHVybiBzaGEyNTYobGVmdCArIHJpZ2h0KTsKCWZyYW1lX2RpZyAtMSAvLyBsZWZ0OiBieXRlcwoJZnJhbWVfZGlnIC0yIC8vIHJpZ2h0OiBieXRlcwoJY29uY2F0CglzaGEyNTYKCXJldHN1YgoKaXNSaWdodFNpYmxpbmc6Cglwcm90byAxIDEKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MzEKCS8vIHJldHVybiBnZXRieXRlKGVsZW0sIDApID09PSBSSUdIVF9TSUJMSU5HX1BSRUZJWDsKCWZyYW1lX2RpZyAtMSAvLyBlbGVtOiBieXRlWzMzXQoJaW50IDAKCWdldGJ5dGUKCWludCAxNzAKCT09CglyZXRzdWIKCmNhbGNSb290OgoJcHJvdG8gNSAxCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjM1CgkvLyByZXN1bHQgPSBsZWFmCglmcmFtZV9kaWcgLTEgLy8gbGVhZjogYnl0ZXMKCWZyYW1lX2J1cnkgLTMgLy8gcmVzdWx0OiBieXRlcwoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czozNwoJLy8gaSA9IDAKCWludCAwCglmcmFtZV9idXJ5IC00IC8vIGk6IHVpbnQ2NAoKZm9yXzE6CglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMwoJPAoJYnogZm9yXzFfZW5kCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjM4CgkvLyBlbGVtID0gcGF0aFtpXQoJZnJhbWVfZGlnIC0yIC8vIHBhdGg6IGJ5dGVbMzNdWzNdCglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMzMgLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAzMwoJZXh0cmFjdDMKCWZyYW1lX2J1cnkgLTUgLy8gZWxlbTogYnl0ZVszM10KCgkvLyBpZjBfY29uZGl0aW9uCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NDAKCS8vIHRoaXMuaXNSaWdodFNpYmxpbmcoZWxlbSkKCWZyYW1lX2RpZyAtNSAvLyBlbGVtOiBieXRlWzMzXQoJY2FsbHN1YiBpc1JpZ2h0U2libGluZwoJYnogaWYwX2Vsc2UKCgkvLyBpZjBfY29uc2VxdWVudAoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjQxCgkvLyByZXN1bHQgPSB0aGlzLmhhc2hDb25jYXQocmVzdWx0LCBleHRyYWN0MyhlbGVtLCAxLCAzMikpCglmcmFtZV9kaWcgLTUgLy8gZWxlbTogYnl0ZVszM10KCWludCAxCglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9kaWcgLTMgLy8gcmVzdWx0OiBieXRlcwoJY2FsbHN1YiBoYXNoQ29uY2F0CglmcmFtZV9idXJ5IC0zIC8vIHJlc3VsdDogYnl0ZXMKCWIgaWYwX2VuZAoKaWYwX2Vsc2U6CgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NDMKCS8vIHJlc3VsdCA9IHRoaXMuaGFzaENvbmNhdChleHRyYWN0MyhlbGVtLCAxLCAzMiksIHJlc3VsdCkKCWZyYW1lX2RpZyAtMyAvLyByZXN1bHQ6IGJ5dGVzCglmcmFtZV9kaWcgLTUgLy8gZWxlbTogYnl0ZVszM10KCWludCAxCglpbnQgMzIKCWV4dHJhY3QzCgljYWxsc3ViIGhhc2hDb25jYXQKCWZyYW1lX2J1cnkgLTMgLy8gcmVzdWx0OiBieXRlcwoKaWYwX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czozNwoJLy8gaSA9IGkgKyAxCglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAtNCAvLyBpOiB1aW50NjQKCWIgZm9yXzEKCmZvcl8xX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo0NwoJLy8gcmV0dXJuIHJlc3VsdDsKCWZyYW1lX2RpZyAtMyAvLyByZXN1bHQ6IGJ5dGVzCglyZXRzdWIKCmJhcmVfcm91dGVfRGVsZXRlQXBwbGljYXRpb246Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CgljYWxsc3ViIGRlbGV0ZQoJaW50IDEKCXJldHVybgoKZGVsZXRlOgoJcHJvdG8gMCAwCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjUyCgkvLyBhc3NlcnQodGhpcy50eG4uc2VuZGVyID09PSB0aGlzLmFwcC5jcmVhdG9yKQoJdHhuIFNlbmRlcgoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CglyZXRzdWIKCmJhcmVfcm91dGVfY3JlYXRlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCT09CgkmJgoJYXNzZXJ0CgljYWxsc3ViIGNyZWF0ZQoJaW50IDEKCXJldHVybgoKY3JlYXRlOgoJcHJvdG8gMCAwCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjU3CgkvLyB0aGlzLnJvb3QucHV0KHRoaXMuY2FsY0luaXRSb290KCkpCglieXRlICJyb290IgoJYnl0ZSAweAoJZHVwCgljYWxsc3ViIGNhbGNJbml0Um9vdAoJYXBwX2dsb2JhbF9wdXQKCXJldHN1YgoKYWJpX3JvdXRlX3ZlcmlmeToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgdmVyaWZ5CglpbnQgMQoJcmV0dXJuCgp2ZXJpZnk6Cglwcm90byAyIDAKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NjEKCS8vIGFzc2VydCh0aGlzLnJvb3QuZ2V0KCkgPT09IHRoaXMuY2FsY1Jvb3Qoc2hhMjU2KGRhdGEpLCBwYXRoKSkKCWJ5dGUgInJvb3QiCglhcHBfZ2xvYmFsX2dldAoJYnl0ZSAweAoJZHVwbiAyCglmcmFtZV9kaWcgLTIgLy8gcGF0aDogYnl0ZVszM11bM10KCWZyYW1lX2RpZyAtMSAvLyBkYXRhOiBieXRlcwoJc2hhMjU2CgljYWxsc3ViIGNhbGNSb290Cgk9PQoJYXNzZXJ0CglyZXRzdWIKCmFiaV9yb3V0ZV9hcHBlbmRMZWFmOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBhcHBlbmRMZWFmCglpbnQgMQoJcmV0dXJuCgphcHBlbmRMZWFmOgoJcHJvdG8gMiAwCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjY1CgkvLyBhc3NlcnQoZGF0YSAhPT0gJycpCglmcmFtZV9kaWcgLTEgLy8gZGF0YTogYnl0ZXMKCWJ5dGUgIiIKCSE9Cglhc3NlcnQKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NjYKCS8vIGFzc2VydCh0aGlzLnJvb3QuZ2V0KCkgPT09IHRoaXMuY2FsY1Jvb3QoRU1QVFlfSEFTSCwgcGF0aCkpCglieXRlICJyb290IgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHgKCWR1cG4gMgoJZnJhbWVfZGlnIC0yIC8vIHBhdGg6IGJ5dGVbMzNdWzNdCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjQKCS8vIGhleCgnZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NScpCglieXRlIDB4ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NQoJY2FsbHN1YiBjYWxjUm9vdAoJPT0KCWFzc2VydAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo2OAoJLy8gdGhpcy5yb290LnB1dCh0aGlzLmNhbGNSb290KHNoYTI1NihkYXRhKSwgcGF0aCkpCglieXRlICJyb290IgoJYnl0ZSAweAoJZHVwbiAyCglmcmFtZV9kaWcgLTIgLy8gcGF0aDogYnl0ZVszM11bM10KCWZyYW1lX2RpZyAtMSAvLyBkYXRhOiBieXRlcwoJc2hhMjU2CgljYWxsc3ViIGNhbGNSb290CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo3MAoJLy8gdGhpcy5zaXplLnB1dCh0aGlzLnNpemUuZ2V0KCkgKyAxKQoJYnl0ZSAic2l6ZSIKCWJ5dGUgInNpemUiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVMZWFmOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglleHRyYWN0IDIgMAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgdXBkYXRlTGVhZgoJaW50IDEKCXJldHVybgoKdXBkYXRlTGVhZjoKCXByb3RvIDMgMAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo3NAoJLy8gYXNzZXJ0KG5ld0RhdGEgIT09ICcnKQoJZnJhbWVfZGlnIC0yIC8vIG5ld0RhdGE6IGJ5dGVzCglieXRlICIiCgkhPQoJYXNzZXJ0CgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjc1CgkvLyBhc3NlcnQodGhpcy5yb290LmdldCgpID09PSB0aGlzLmNhbGNSb290KHNoYTI1NihvbGREYXRhKSwgcGF0aCkpCglieXRlICJyb290IgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHgKCWR1cG4gMgoJZnJhbWVfZGlnIC0zIC8vIHBhdGg6IGJ5dGVbMzNdWzNdCglmcmFtZV9kaWcgLTEgLy8gb2xkRGF0YTogYnl0ZXMKCXNoYTI1NgoJY2FsbHN1YiBjYWxjUm9vdAoJPT0KCWFzc2VydAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo3NwoJLy8gdGhpcy5yb290LnB1dCh0aGlzLmNhbGNSb290KHNoYTI1NihuZXdEYXRhKSwgcGF0aCkpCglieXRlICJyb290IgoJYnl0ZSAweAoJZHVwbiAyCglmcmFtZV9kaWcgLTMgLy8gcGF0aDogYnl0ZVszM11bM10KCWZyYW1lX2RpZyAtMiAvLyBuZXdEYXRhOiBieXRlcwoJc2hhMjU2CgljYWxsc3ViIGNhbGNSb290CglhcHBfZ2xvYmFsX3B1dAoJcmV0c3ViCgptYWluOgoJdHhuIE51bUFwcEFyZ3MKCWJueiByb3V0ZV9hYmkKCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCWJueiBiYXJlX3JvdXRlX2NyZWF0ZQoJdHhuIE9uQ29tcGxldGlvbgoJaW50IERlbGV0ZUFwcGxpY2F0aW9uCgk9PQoJaW50IDEKCW1hdGNoIGJhcmVfcm91dGVfRGVsZXRlQXBwbGljYXRpb24KCnJvdXRlX2FiaToKCW1ldGhvZCAidmVyaWZ5KGJ5dGVbXSxieXRlWzMzXVszXSl2b2lkIgoJbWV0aG9kICJhcHBlbmRMZWFmKGJ5dGVbXSxieXRlWzMzXVszXSl2b2lkIgoJbWV0aG9kICJ1cGRhdGVMZWFmKGJ5dGVbXSxieXRlW10sYnl0ZVszM11bM10pdm9pZCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoIGFiaV9yb3V0ZV92ZXJpZnkgYWJpX3JvdXRlX2FwcGVuZExlYWYgYWJpX3JvdXRlX3VwZGF0ZUxlYWY=","clear":"I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"},"contract":{"name":"MerkleTree","desc":"","methods":[{"name":"verify","args":[{"name":"data","type":"byte[]","desc":""},{"name":"path","type":"byte[33][3]","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"appendLeaf","args":[{"name":"data","type":"byte[]","desc":""},{"name":"path","type":"byte[33][3]","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"updateLeaf","args":[{"name":"oldData","type":"byte[]","desc":""},{"name":"newData","type":"byte[]","desc":""},{"name":"path","type":"byte[33][3]","desc":""}],"desc":"","returns":{"type":"void","desc":""}}]}} \ No newline at end of file diff --git a/examples/merkle/artifacts/merkletree_client.ts b/examples/merkle/artifacts/merkletree_client.ts index eab897dc4..cd45611b1 100644 --- a/examples/merkle/artifacts/merkletree_client.ts +++ b/examples/merkle/artifacts/merkletree_client.ts @@ -4,7 +4,7 @@ export class MerkleTree extends bkr.ApplicationClient { desc: string = ""; override appSchema: bkr.Schema = { declared: { root: { type: bkr.AVMType.bytes, key: "root", desc: "", static: false }, size: { type: bkr.AVMType.uint64, key: "size", desc: "", static: false } }, reserved: {} }; override acctSchema: bkr.Schema = { declared: {}, reserved: {} }; - override approvalProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKY2FsY0luaXRSb290OgoJcHJvdG8gMiAxCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjE3CgkvLyByZXN1bHQgPSBFTVBUWV9IQVNICgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NAoJLy8gaGV4KCdlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1JykKCWJ5dGUgMHhlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1CglmcmFtZV9idXJ5IC0xIC8vIHJlc3VsdDogYnl0ZXMKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MTkKCS8vIGkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCmZvcl8wOgoJZnJhbWVfZGlnIC0yIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6IGZvcl8wX2VuZAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoyMAoJLy8gcmVzdWx0ID0gc2hhMjU2KHJlc3VsdCArIHJlc3VsdCkKCWZyYW1lX2RpZyAtMSAvLyByZXN1bHQ6IGJ5dGVzCglmcmFtZV9kaWcgLTEgLy8gcmVzdWx0OiBieXRlcwoJY29uY2F0CglzaGEyNTYKCWZyYW1lX2J1cnkgLTEgLy8gcmVzdWx0OiBieXRlcwoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoxOQoJLy8gaSA9IGkgKyAxCglmcmFtZV9kaWcgLTIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCWIgZm9yXzAKCmZvcl8wX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoyMwoJLy8gcmV0dXJuIHJlc3VsdDsKCWZyYW1lX2RpZyAtMSAvLyByZXN1bHQ6IGJ5dGVzCglyZXRzdWIKCmhhc2hDb25jYXQ6Cglwcm90byAyIDEKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MjcKCS8vIHJldHVybiBzaGEyNTYobGVmdCArIHJpZ2h0KTsKCWZyYW1lX2RpZyAtMSAvLyBsZWZ0OiBieXRlcwoJZnJhbWVfZGlnIC0yIC8vIHJpZ2h0OiBieXRlcwoJY29uY2F0CglzaGEyNTYKCXJldHN1YgoKaXNSaWdodFNpYmxpbmc6Cglwcm90byAxIDEKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MzEKCS8vIHJldHVybiBnZXRieXRlKGVsZW0sIDApID09PSBSSUdIVF9TSUJMSU5HX1BSRUZJWDsKCWZyYW1lX2RpZyAtMSAvLyBlbGVtOiBieXRlWzMzXQoJaW50IDAKCWdldGJ5dGUKCWludCAxNzAKCT09CglyZXRzdWIKCmNhbGNSb290OgoJcHJvdG8gNSAxCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjM1CgkvLyByZXN1bHQgPSBsZWFmCglmcmFtZV9kaWcgLTEgLy8gbGVhZjogYnl0ZXMKCWZyYW1lX2J1cnkgLTMgLy8gcmVzdWx0OiBieXRlcwoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czozNwoJLy8gaSA9IDAKCWludCAwCglmcmFtZV9idXJ5IC00IC8vIGk6IHVpbnQ2NAoKZm9yXzE6CglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMwoJPAoJYnogZm9yXzFfZW5kCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjM4CgkvLyBlbGVtID0gcGF0aFtpXQoJZnJhbWVfZGlnIC0yIC8vIHBhdGg6IGJ5dGVbMzNdWzNdCglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMzMKCSoKCWludCAzMwoJZXh0cmFjdDMKCWZyYW1lX2J1cnkgLTUgLy8gZWxlbTogYnl0ZVszM10KCgkvLyBpZjBfY29uZGl0aW9uCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NDAKCS8vIHRoaXMuaXNSaWdodFNpYmxpbmcoZWxlbSkKCWJ5dGUgMHgKCXBvcAoJZnJhbWVfZGlnIC01IC8vIGVsZW06IGJ5dGVbMzNdCgljYWxsc3ViIGlzUmlnaHRTaWJsaW5nCglieiBpZjBfZWxzZQoKCS8vIGlmMF9jb25zZXF1ZW50CgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NDEKCS8vIHJlc3VsdCA9IHRoaXMuaGFzaENvbmNhdChyZXN1bHQsIGV4dHJhY3QzKGVsZW0sIDEsIDMyKSkKCWJ5dGUgMHgKCXBvcAoJZnJhbWVfZGlnIC01IC8vIGVsZW06IGJ5dGVbMzNdCglpbnQgMQoJaW50IDMyCglleHRyYWN0MwoJZnJhbWVfZGlnIC0zIC8vIHJlc3VsdDogYnl0ZXMKCWNhbGxzdWIgaGFzaENvbmNhdAoJZnJhbWVfYnVyeSAtMyAvLyByZXN1bHQ6IGJ5dGVzCgliIGlmMF9lbmQKCmlmMF9lbHNlOgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjQzCgkvLyByZXN1bHQgPSB0aGlzLmhhc2hDb25jYXQoZXh0cmFjdDMoZWxlbSwgMSwgMzIpLCByZXN1bHQpCglieXRlIDB4Cglwb3AKCWZyYW1lX2RpZyAtMyAvLyByZXN1bHQ6IGJ5dGVzCglmcmFtZV9kaWcgLTUgLy8gZWxlbTogYnl0ZVszM10KCWludCAxCglpbnQgMzIKCWV4dHJhY3QzCgljYWxsc3ViIGhhc2hDb25jYXQKCWZyYW1lX2J1cnkgLTMgLy8gcmVzdWx0OiBieXRlcwoKaWYwX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czozNwoJLy8gaSA9IGkgKyAxCglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAtNCAvLyBpOiB1aW50NjQKCWIgZm9yXzEKCmZvcl8xX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo0NwoJLy8gcmV0dXJuIHJlc3VsdDsKCWZyYW1lX2RpZyAtMyAvLyByZXN1bHQ6IGJ5dGVzCglyZXRzdWIKCmJhcmVfcm91dGVfRGVsZXRlQXBwbGljYXRpb246Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4Cglwb3AKCWNhbGxzdWIgZGVsZXRlCglpbnQgMQoJcmV0dXJuCgpkZWxldGU6Cglwcm90byAwIDAKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NTIKCS8vIGFzc2VydCh0aGlzLnR4bi5zZW5kZXIgPT09IHRoaXMuYXBwLmNyZWF0b3IpCgl0eG4gU2VuZGVyCgl0eG5hIEFwcGxpY2F0aW9ucyAwCglhcHBfcGFyYW1zX2dldCBBcHBDcmVhdG9yCglhc3NlcnQKCT09Cglhc3NlcnQKCXJldHN1YgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCXBvcAoJY2FsbHN1YiBjcmVhdGUKCWludCAxCglyZXR1cm4KCmNyZWF0ZToKCXByb3RvIDAgMAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo1NwoJLy8gdGhpcy5yb290LnB1dCh0aGlzLmNhbGNJbml0Um9vdCgpKQoJYnl0ZSAicm9vdCIKCWJ5dGUgMHgKCWR1cG4gMQoJY2FsbHN1YiBjYWxjSW5pdFJvb3QKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCmFiaV9yb3V0ZV92ZXJpZnk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCXBvcAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgdmVyaWZ5CglpbnQgMQoJcmV0dXJuCgp2ZXJpZnk6Cglwcm90byAyIDAKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NjEKCS8vIGFzc2VydCh0aGlzLnJvb3QuZ2V0KCkgPT09IHRoaXMuY2FsY1Jvb3Qoc2hhMjU2KGRhdGEpLCBwYXRoKSkKCWJ5dGUgInJvb3QiCglhcHBfZ2xvYmFsX2dldAoJYnl0ZSAweAoJZHVwbiAyCglmcmFtZV9kaWcgLTIgLy8gcGF0aDogYnl0ZVszM11bM10KCWZyYW1lX2RpZyAtMSAvLyBkYXRhOiBieXRlcwoJc2hhMjU2CgljYWxsc3ViIGNhbGNSb290Cgk9PQoJYXNzZXJ0CglyZXRzdWIKCmFiaV9yb3V0ZV9hcHBlbmRMZWFmOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4Cglwb3AKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIGFwcGVuZExlYWYKCWludCAxCglyZXR1cm4KCmFwcGVuZExlYWY6Cglwcm90byAyIDAKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NjUKCS8vIGFzc2VydChkYXRhICE9PSAnJykKCWZyYW1lX2RpZyAtMSAvLyBkYXRhOiBieXRlcwoJYnl0ZSAiIgoJIT0KCWFzc2VydAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo2NgoJLy8gYXNzZXJ0KHRoaXMucm9vdC5nZXQoKSA9PT0gdGhpcy5jYWxjUm9vdChFTVBUWV9IQVNILCBwYXRoKSkKCWJ5dGUgInJvb3QiCglhcHBfZ2xvYmFsX2dldAoJYnl0ZSAweAoJZHVwbiAyCglmcmFtZV9kaWcgLTIgLy8gcGF0aDogYnl0ZVszM11bM10KCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NAoJLy8gaGV4KCdlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1JykKCWJ5dGUgMHhlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1CgljYWxsc3ViIGNhbGNSb290Cgk9PQoJYXNzZXJ0CgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjY4CgkvLyB0aGlzLnJvb3QucHV0KHRoaXMuY2FsY1Jvb3Qoc2hhMjU2KGRhdGEpLCBwYXRoKSkKCWJ5dGUgInJvb3QiCglieXRlIDB4CglkdXBuIDIKCWZyYW1lX2RpZyAtMiAvLyBwYXRoOiBieXRlWzMzXVszXQoJZnJhbWVfZGlnIC0xIC8vIGRhdGE6IGJ5dGVzCglzaGEyNTYKCWNhbGxzdWIgY2FsY1Jvb3QKCWFwcF9nbG9iYWxfcHV0CgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjcwCgkvLyB0aGlzLnNpemUucHV0KHRoaXMuc2l6ZS5nZXQoKSArIDEpCglieXRlICJzaXplIgoJYnl0ZSAic2l6ZSIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJKwoJYXBwX2dsb2JhbF9wdXQKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZUxlYWY6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCXBvcAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJZXh0cmFjdCAyIDAKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIHVwZGF0ZUxlYWYKCWludCAxCglyZXR1cm4KCnVwZGF0ZUxlYWY6Cglwcm90byAzIDAKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NzQKCS8vIGFzc2VydChuZXdEYXRhICE9PSAnJykKCWZyYW1lX2RpZyAtMiAvLyBuZXdEYXRhOiBieXRlcwoJYnl0ZSAiIgoJIT0KCWFzc2VydAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo3NQoJLy8gYXNzZXJ0KHRoaXMucm9vdC5nZXQoKSA9PT0gdGhpcy5jYWxjUm9vdChzaGEyNTYob2xkRGF0YSksIHBhdGgpKQoJYnl0ZSAicm9vdCIKCWFwcF9nbG9iYWxfZ2V0CglieXRlIDB4CglkdXBuIDIKCWZyYW1lX2RpZyAtMyAvLyBwYXRoOiBieXRlWzMzXVszXQoJZnJhbWVfZGlnIC0xIC8vIG9sZERhdGE6IGJ5dGVzCglzaGEyNTYKCWNhbGxzdWIgY2FsY1Jvb3QKCT09Cglhc3NlcnQKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NzcKCS8vIHRoaXMucm9vdC5wdXQodGhpcy5jYWxjUm9vdChzaGEyNTYobmV3RGF0YSksIHBhdGgpKQoJYnl0ZSAicm9vdCIKCWJ5dGUgMHgKCWR1cG4gMgoJZnJhbWVfZGlnIC0zIC8vIHBhdGg6IGJ5dGVbMzNdWzNdCglmcmFtZV9kaWcgLTIgLy8gbmV3RGF0YTogYnl0ZXMKCXNoYTI1NgoJY2FsbHN1YiBjYWxjUm9vdAoJYXBwX2dsb2JhbF9wdXQKCXJldHN1YgoKbWFpbjoKCXR4biBOdW1BcHBBcmdzCglibnogcm91dGVfYWJpCgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCT09CglibnogYmFyZV9yb3V0ZV9jcmVhdGUKCXR4biBPbkNvbXBsZXRpb24KCWludCBEZWxldGVBcHBsaWNhdGlvbgoJPT0KCWludCAxCgltYXRjaCBiYXJlX3JvdXRlX0RlbGV0ZUFwcGxpY2F0aW9uCgpyb3V0ZV9hYmk6CgltZXRob2QgInZlcmlmeShieXRlW10sYnl0ZVszM11bM10pdm9pZCIKCW1ldGhvZCAiYXBwZW5kTGVhZihieXRlW10sYnl0ZVszM11bM10pdm9pZCIKCW1ldGhvZCAidXBkYXRlTGVhZihieXRlW10sYnl0ZVtdLGJ5dGVbMzNdWzNdKXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCBhYmlfcm91dGVfdmVyaWZ5IGFiaV9yb3V0ZV9hcHBlbmRMZWFmIGFiaV9yb3V0ZV91cGRhdGVMZWFm"; + override approvalProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKY2FsY0luaXRSb290OgoJcHJvdG8gMiAxCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjE3CgkvLyByZXN1bHQgPSBFTVBUWV9IQVNICgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NAoJLy8gaGV4KCdlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1JykKCWJ5dGUgMHhlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1CglmcmFtZV9idXJ5IC0xIC8vIHJlc3VsdDogYnl0ZXMKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MTkKCS8vIGkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCmZvcl8wOgoJZnJhbWVfZGlnIC0yIC8vIGk6IHVpbnQ2NAoJaW50IDMKCTwKCWJ6IGZvcl8wX2VuZAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoyMAoJLy8gcmVzdWx0ID0gc2hhMjU2KHJlc3VsdCArIHJlc3VsdCkKCWZyYW1lX2RpZyAtMSAvLyByZXN1bHQ6IGJ5dGVzCglmcmFtZV9kaWcgLTEgLy8gcmVzdWx0OiBieXRlcwoJY29uY2F0CglzaGEyNTYKCWZyYW1lX2J1cnkgLTEgLy8gcmVzdWx0OiBieXRlcwoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoxOQoJLy8gaSA9IGkgKyAxCglmcmFtZV9kaWcgLTIgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCWIgZm9yXzAKCmZvcl8wX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czoyMwoJLy8gcmV0dXJuIHJlc3VsdDsKCWZyYW1lX2RpZyAtMSAvLyByZXN1bHQ6IGJ5dGVzCglyZXRzdWIKCmhhc2hDb25jYXQ6Cglwcm90byAyIDEKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MjcKCS8vIHJldHVybiBzaGEyNTYobGVmdCArIHJpZ2h0KTsKCWZyYW1lX2RpZyAtMSAvLyBsZWZ0OiBieXRlcwoJZnJhbWVfZGlnIC0yIC8vIHJpZ2h0OiBieXRlcwoJY29uY2F0CglzaGEyNTYKCXJldHN1YgoKaXNSaWdodFNpYmxpbmc6Cglwcm90byAxIDEKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6MzEKCS8vIHJldHVybiBnZXRieXRlKGVsZW0sIDApID09PSBSSUdIVF9TSUJMSU5HX1BSRUZJWDsKCWZyYW1lX2RpZyAtMSAvLyBlbGVtOiBieXRlWzMzXQoJaW50IDAKCWdldGJ5dGUKCWludCAxNzAKCT09CglyZXRzdWIKCmNhbGNSb290OgoJcHJvdG8gNSAxCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjM1CgkvLyByZXN1bHQgPSBsZWFmCglmcmFtZV9kaWcgLTEgLy8gbGVhZjogYnl0ZXMKCWZyYW1lX2J1cnkgLTMgLy8gcmVzdWx0OiBieXRlcwoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czozNwoJLy8gaSA9IDAKCWludCAwCglmcmFtZV9idXJ5IC00IC8vIGk6IHVpbnQ2NAoKZm9yXzE6CglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMwoJPAoJYnogZm9yXzFfZW5kCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjM4CgkvLyBlbGVtID0gcGF0aFtpXQoJZnJhbWVfZGlnIC0yIC8vIHBhdGg6IGJ5dGVbMzNdWzNdCglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMzMgLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAzMwoJZXh0cmFjdDMKCWZyYW1lX2J1cnkgLTUgLy8gZWxlbTogYnl0ZVszM10KCgkvLyBpZjBfY29uZGl0aW9uCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NDAKCS8vIHRoaXMuaXNSaWdodFNpYmxpbmcoZWxlbSkKCWZyYW1lX2RpZyAtNSAvLyBlbGVtOiBieXRlWzMzXQoJY2FsbHN1YiBpc1JpZ2h0U2libGluZwoJYnogaWYwX2Vsc2UKCgkvLyBpZjBfY29uc2VxdWVudAoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjQxCgkvLyByZXN1bHQgPSB0aGlzLmhhc2hDb25jYXQocmVzdWx0LCBleHRyYWN0MyhlbGVtLCAxLCAzMikpCglmcmFtZV9kaWcgLTUgLy8gZWxlbTogYnl0ZVszM10KCWludCAxCglpbnQgMzIKCWV4dHJhY3QzCglmcmFtZV9kaWcgLTMgLy8gcmVzdWx0OiBieXRlcwoJY2FsbHN1YiBoYXNoQ29uY2F0CglmcmFtZV9idXJ5IC0zIC8vIHJlc3VsdDogYnl0ZXMKCWIgaWYwX2VuZAoKaWYwX2Vsc2U6CgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NDMKCS8vIHJlc3VsdCA9IHRoaXMuaGFzaENvbmNhdChleHRyYWN0MyhlbGVtLCAxLCAzMiksIHJlc3VsdCkKCWZyYW1lX2RpZyAtMyAvLyByZXN1bHQ6IGJ5dGVzCglmcmFtZV9kaWcgLTUgLy8gZWxlbTogYnl0ZVszM10KCWludCAxCglpbnQgMzIKCWV4dHJhY3QzCgljYWxsc3ViIGhhc2hDb25jYXQKCWZyYW1lX2J1cnkgLTMgLy8gcmVzdWx0OiBieXRlcwoKaWYwX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czozNwoJLy8gaSA9IGkgKyAxCglmcmFtZV9kaWcgLTQgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAtNCAvLyBpOiB1aW50NjQKCWIgZm9yXzEKCmZvcl8xX2VuZDoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo0NwoJLy8gcmV0dXJuIHJlc3VsdDsKCWZyYW1lX2RpZyAtMyAvLyByZXN1bHQ6IGJ5dGVzCglyZXRzdWIKCmJhcmVfcm91dGVfRGVsZXRlQXBwbGljYXRpb246Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgRGVsZXRlQXBwbGljYXRpb24KCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CgljYWxsc3ViIGRlbGV0ZQoJaW50IDEKCXJldHVybgoKZGVsZXRlOgoJcHJvdG8gMCAwCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjUyCgkvLyBhc3NlcnQodGhpcy50eG4uc2VuZGVyID09PSB0aGlzLmFwcC5jcmVhdG9yKQoJdHhuIFNlbmRlcgoJdHhuYSBBcHBsaWNhdGlvbnMgMAoJYXBwX3BhcmFtc19nZXQgQXBwQ3JlYXRvcgoJYXNzZXJ0Cgk9PQoJYXNzZXJ0CglyZXRzdWIKCmJhcmVfcm91dGVfY3JlYXRlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCT09CgkmJgoJYXNzZXJ0CgljYWxsc3ViIGNyZWF0ZQoJaW50IDEKCXJldHVybgoKY3JlYXRlOgoJcHJvdG8gMCAwCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjU3CgkvLyB0aGlzLnJvb3QucHV0KHRoaXMuY2FsY0luaXRSb290KCkpCglieXRlICJyb290IgoJYnl0ZSAweAoJZHVwCgljYWxsc3ViIGNhbGNJbml0Um9vdAoJYXBwX2dsb2JhbF9wdXQKCXJldHN1YgoKYWJpX3JvdXRlX3ZlcmlmeToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgdmVyaWZ5CglpbnQgMQoJcmV0dXJuCgp2ZXJpZnk6Cglwcm90byAyIDAKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NjEKCS8vIGFzc2VydCh0aGlzLnJvb3QuZ2V0KCkgPT09IHRoaXMuY2FsY1Jvb3Qoc2hhMjU2KGRhdGEpLCBwYXRoKSkKCWJ5dGUgInJvb3QiCglhcHBfZ2xvYmFsX2dldAoJYnl0ZSAweAoJZHVwbiAyCglmcmFtZV9kaWcgLTIgLy8gcGF0aDogYnl0ZVszM11bM10KCWZyYW1lX2RpZyAtMSAvLyBkYXRhOiBieXRlcwoJc2hhMjU2CgljYWxsc3ViIGNhbGNSb290Cgk9PQoJYXNzZXJ0CglyZXRzdWIKCmFiaV9yb3V0ZV9hcHBlbmRMZWFmOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBhcHBlbmRMZWFmCglpbnQgMQoJcmV0dXJuCgphcHBlbmRMZWFmOgoJcHJvdG8gMiAwCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjY1CgkvLyBhc3NlcnQoZGF0YSAhPT0gJycpCglmcmFtZV9kaWcgLTEgLy8gZGF0YTogYnl0ZXMKCWJ5dGUgIiIKCSE9Cglhc3NlcnQKCgkvLyBleGFtcGxlcy9tZXJrbGUvbWVya2xlLmFsZ28udHM6NjYKCS8vIGFzc2VydCh0aGlzLnJvb3QuZ2V0KCkgPT09IHRoaXMuY2FsY1Jvb3QoRU1QVFlfSEFTSCwgcGF0aCkpCglieXRlICJyb290IgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHgKCWR1cG4gMgoJZnJhbWVfZGlnIC0yIC8vIHBhdGg6IGJ5dGVbMzNdWzNdCgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjQKCS8vIGhleCgnZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NScpCglieXRlIDB4ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NQoJY2FsbHN1YiBjYWxjUm9vdAoJPT0KCWFzc2VydAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo2OAoJLy8gdGhpcy5yb290LnB1dCh0aGlzLmNhbGNSb290KHNoYTI1NihkYXRhKSwgcGF0aCkpCglieXRlICJyb290IgoJYnl0ZSAweAoJZHVwbiAyCglmcmFtZV9kaWcgLTIgLy8gcGF0aDogYnl0ZVszM11bM10KCWZyYW1lX2RpZyAtMSAvLyBkYXRhOiBieXRlcwoJc2hhMjU2CgljYWxsc3ViIGNhbGNSb290CglhcHBfZ2xvYmFsX3B1dAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo3MAoJLy8gdGhpcy5zaXplLnB1dCh0aGlzLnNpemUuZ2V0KCkgKyAxKQoJYnl0ZSAic2l6ZSIKCWJ5dGUgInNpemUiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCSsKCWFwcF9nbG9iYWxfcHV0CglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVMZWFmOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglleHRyYWN0IDIgMAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgdXBkYXRlTGVhZgoJaW50IDEKCXJldHVybgoKdXBkYXRlTGVhZjoKCXByb3RvIDMgMAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo3NAoJLy8gYXNzZXJ0KG5ld0RhdGEgIT09ICcnKQoJZnJhbWVfZGlnIC0yIC8vIG5ld0RhdGE6IGJ5dGVzCglieXRlICIiCgkhPQoJYXNzZXJ0CgoJLy8gZXhhbXBsZXMvbWVya2xlL21lcmtsZS5hbGdvLnRzOjc1CgkvLyBhc3NlcnQodGhpcy5yb290LmdldCgpID09PSB0aGlzLmNhbGNSb290KHNoYTI1NihvbGREYXRhKSwgcGF0aCkpCglieXRlICJyb290IgoJYXBwX2dsb2JhbF9nZXQKCWJ5dGUgMHgKCWR1cG4gMgoJZnJhbWVfZGlnIC0zIC8vIHBhdGg6IGJ5dGVbMzNdWzNdCglmcmFtZV9kaWcgLTEgLy8gb2xkRGF0YTogYnl0ZXMKCXNoYTI1NgoJY2FsbHN1YiBjYWxjUm9vdAoJPT0KCWFzc2VydAoKCS8vIGV4YW1wbGVzL21lcmtsZS9tZXJrbGUuYWxnby50czo3NwoJLy8gdGhpcy5yb290LnB1dCh0aGlzLmNhbGNSb290KHNoYTI1NihuZXdEYXRhKSwgcGF0aCkpCglieXRlICJyb290IgoJYnl0ZSAweAoJZHVwbiAyCglmcmFtZV9kaWcgLTMgLy8gcGF0aDogYnl0ZVszM11bM10KCWZyYW1lX2RpZyAtMiAvLyBuZXdEYXRhOiBieXRlcwoJc2hhMjU2CgljYWxsc3ViIGNhbGNSb290CglhcHBfZ2xvYmFsX3B1dAoJcmV0c3ViCgptYWluOgoJdHhuIE51bUFwcEFyZ3MKCWJueiByb3V0ZV9hYmkKCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCWJueiBiYXJlX3JvdXRlX2NyZWF0ZQoJdHhuIE9uQ29tcGxldGlvbgoJaW50IERlbGV0ZUFwcGxpY2F0aW9uCgk9PQoJaW50IDEKCW1hdGNoIGJhcmVfcm91dGVfRGVsZXRlQXBwbGljYXRpb24KCnJvdXRlX2FiaToKCW1ldGhvZCAidmVyaWZ5KGJ5dGVbXSxieXRlWzMzXVszXSl2b2lkIgoJbWV0aG9kICJhcHBlbmRMZWFmKGJ5dGVbXSxieXRlWzMzXVszXSl2b2lkIgoJbWV0aG9kICJ1cGRhdGVMZWFmKGJ5dGVbXSxieXRlW10sYnl0ZVszM11bM10pdm9pZCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoIGFiaV9yb3V0ZV92ZXJpZnkgYWJpX3JvdXRlX2FwcGVuZExlYWYgYWJpX3JvdXRlX3VwZGF0ZUxlYWY="; override clearProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"; override methods: algosdk.ABIMethod[] = [ new algosdk.ABIMethod({ name: "verify", desc: "", args: [{ type: "byte[]", name: "data", desc: "" }, { type: "byte[33][3]", name: "path", desc: "" }], returns: { type: "void", desc: "" } }), diff --git a/examples/tuple_in_box/app.algo.ts b/examples/tuple_in_box/app.algo.ts index 8219ef0cb..b214cedec 100644 --- a/examples/tuple_in_box/app.algo.ts +++ b/examples/tuple_in_box/app.algo.ts @@ -28,7 +28,7 @@ class ContactsApp extends Contract { this.contacts.get(address).name = value; } else if (field === 'company') { this.contacts.get(address).company = value; - } else err(); + } else throw Error('Invalid field'); } verifyContactName(name: string, address: Account): void { diff --git a/examples/tuple_in_box/tealscript_artifacts/ContactsApp.approval.teal b/examples/tuple_in_box/tealscript_artifacts/ContactsApp.approval.teal index ef2658235..86931b169 100644 --- a/examples/tuple_in_box/tealscript_artifacts/ContactsApp.approval.teal +++ b/examples/tuple_in_box/tealscript_artifacts/ContactsApp.approval.teal @@ -1,114 +1,75 @@ #pragma version 8 b main -preArrayAccess: - proto 3 0 - frame_dig -3 // full tuple - store 0 // full tuple - load 0 // full tuple +update_dynamic_tuple_element: + proto 3 1 + load 3 // full tuple + load 3 // full tuple frame_dig -1 // head offset - extract_uint16 // extract array offset - store 1 // array offset - load 0 // full tuple - load 1 // array offset - extract_uint16 // extract array length - frame_dig -2 // type length - * // array size - int 2 - + // array size + len - store 2 // full array length - retsub - -updateDynamicElement: - proto 8 1 - frame_dig -8 // newArray - store 6 // new array - load 0 // full tuple + extract_uint16 // extract dynamic array offset of element int 0 - frame_dig -2 // startOfHeads - extract3 - store 3 // static part of tuple - load 0 // full tuple - frame_dig -2 // startOfHeads - frame_dig -3 // totalHeadLength - extract3 - store 4 // dynamic heads - byte 0x - dup - store 5 // values after array - store 7 // values before array - frame_dig -4 // lastDynamicElement - bnz skip_values_after_array - load 0 // full tuple - load 1 // array offset - load 2 // full array length + swap + extract3 // extract portion of tuple before element + frame_dig -2 // new tuple element + concat + load 3 // full tuple + load 3 // full tuple + frame_dig -1 // head offset + extract_uint16 // extract dynamic array offset of element + frame_dig -3 // old element length + - load 0 // full tuple + load 3 // full tuple len substring3 - store 5 // values after array + concat + store 3 // full tuple + frame_dig -2 // new tuple element + len // length of new element + frame_dig -3 // old element length + < + bnz swapped_difference + frame_dig -2 // new tuple element + len // length of new element + frame_dig -3 // old element length + int 1 + store 7 // subtract head difference + b get_difference -skip_values_after_array: - frame_dig -5 // firstDynamicElement - bnz skip_values_before_array - load 0 // full tuple - frame_dig -1 // headEnd - load 1 // array offset - substring3 - store 7 // values before array +swapped_difference: + frame_dig -3 // old element length + frame_dig -2 // new tuple element + len // length of new element + int 0 + store 7 // subtract head difference -skip_values_before_array: - load 4 // dynamic heads - frame_dig -6 // headUpdateBitmask - load 6 // new array - len - load 2 // full array length - load 6 // new array - len - load 2 // full array length - >= - bnz skip_len_swap - swap +get_difference: + - // get length difference + retsub -skip_len_swap: - - - itob - extract 6 2 - dup - concat - dup - concat - dup - concat - dup - concat - dup - concat - b& - load 6 // new array - len - load 2 // full array length - >= - bnz add_head - b- - b sub_or_add_head_end +update_dynamic_head: + proto 2 0 + frame_dig -2 // length difference + load 3 // full tuple + frame_dig -1 // dynamic array offset + extract_uint16 // extract dynamic array offset + load 7 // subtract head difference + bz subtract_head_difference + + // add difference to offset + b end_calc_new_head -add_head: - b+ +subtract_head_difference: + swap + - // subtract difference from offet -sub_or_add_head_end: - frame_dig -7 // fullHeadBitmask - b& - store 4 // dynamic heads - load 3 // static part of tuple - load 4 // dynamic heads - load 7 // values before array - load 6 // new array - load 5 // values after array - concat - concat - concat - concat +end_calc_new_head: + itob // convert to bytes + extract 6 2 // convert to uint16 + load 3 // full tuple + swap + frame_dig -1 // offset + swap + replace3 // update offset + store 3 // full tuple retsub bare_route_create: @@ -151,14 +112,16 @@ setMyContact: // examples/tuple_in_box/app.algo.ts:15 // contact: Contact = { name: name, company: company } - byte 0x // no static elements - store 11 // static elements - byte 0x0004 // head end - store 8 // dynamic head - int 4 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0004 + store 2 // head offset + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head frame_dig -1 // name: bytes dup len @@ -168,20 +131,20 @@ setMyContact: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head frame_dig -2 // company: bytes dup len @@ -189,14 +152,20 @@ setMyContact: extract 6 2 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -3 // contact: Contact @@ -242,14 +211,16 @@ addContact: // examples/tuple_in_box/app.algo.ts:22 // contact: Contact = { name: name, company: company } - byte 0x // no static elements - store 11 // static elements - byte 0x0004 // head end - store 8 // dynamic head - int 4 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0004 + store 2 // head offset + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head frame_dig -1 // name: bytes dup len @@ -259,20 +230,20 @@ addContact: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head frame_dig -2 // company: bytes dup len @@ -280,14 +251,20 @@ addContact: extract 6 2 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -4 // contact: Contact @@ -340,9 +317,28 @@ updateContactField: frame_dig -3 // address: account box_get assert - int 1 // type length - int 0 // head offset - callsub preArrayAccess + dup + store 3 // full tuple + int 0 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element frame_dig -2 // value: bytes dup len @@ -350,14 +346,13 @@ updateContactField: extract 6 2 swap concat - byte 0xFFFFFFFF - byte 0x0000FFFF // head update bitmask - int 1 // is first dynamic element - int 0 // is last dynamic element - int 4 // total head length - int 0 // startOfHeads - int 4 // head end - callsub updateDynamicElement + int 0 + callsub update_dynamic_tuple_element + dup // dup length difference + int 2 + callsub update_dynamic_head + pop // pop length difference + load 3 // full tuple frame_dig -3 // address: account dup box_del @@ -382,9 +377,28 @@ if0_elseif1_condition: frame_dig -3 // address: account box_get assert - int 1 // type length - int 2 // head offset - callsub preArrayAccess + dup + store 3 // full tuple + int 2 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element frame_dig -2 // value: bytes dup len @@ -392,14 +406,10 @@ if0_elseif1_condition: extract 6 2 swap concat - byte 0xFFFFFFFF - byte 0x00000000 // head update bitmask - int 0 // is first dynamic element - int 1 // is last dynamic element - int 4 // total head length - int 0 // startOfHeads - int 4 // head end - callsub updateDynamicElement + int 2 + callsub update_dynamic_tuple_element + pop // pop length difference + load 3 // full tuple frame_dig -3 // address: account dup box_del @@ -409,9 +419,7 @@ if0_elseif1_condition: b if0_end if0_else: - // examples/tuple_in_box/app.algo.ts:31 - // err() - err + err // 'Invalid field' if0_end: retsub @@ -445,14 +453,26 @@ verifyContactName: frame_dig -2 // address: account box_get assert - int 1 // type length - int 0 // head offset - callsub preArrayAccess - load 0 // full tuple - load 1 // array offset - load 2 // full array length + dup + store 3 // full tuple + int 0 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length extract3 - extract 2 0 // extract bytes from string + extract 2 0 frame_dig -1 // name: bytes == assert diff --git a/examples/tuple_in_box/tealscript_artifacts/ContactsApp.json b/examples/tuple_in_box/tealscript_artifacts/ContactsApp.json index 0678998c9..eabe33ddc 100644 --- a/examples/tuple_in_box/tealscript_artifacts/ContactsApp.json +++ b/examples/tuple_in_box/tealscript_artifacts/ContactsApp.json @@ -1 +1 @@ -{"hints":{},"schema":{"local":{"declared":{},"reserved":{}},"global":{"declared":{"myContact":{"type":"bytes","key":"myContact"}},"reserved":{}}},"state":{"global":{"num_byte_slices":1,"num_uints":0},"local":{"num_byte_slices":0,"num_uints":0}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKcHJlQXJyYXlBY2Nlc3M6Cglwcm90byAzIDAKCWZyYW1lX2RpZyAtMyAvLyBmdWxsIHR1cGxlCglzdG9yZSAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZCBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgYXJyYXkgb2Zmc2V0CglzdG9yZSAxIC8vIGFycmF5IG9mZnNldAoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgYXJyYXkgbGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gdHlwZSBsZW5ndGgKCSogLy8gYXJyYXkgc2l6ZQoJaW50IDIKCSsgLy8gYXJyYXkgc2l6ZSArIGxlbgoJc3RvcmUgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJcmV0c3ViCgp1cGRhdGVEeW5hbWljRWxlbWVudDoKCXByb3RvIDggMQoJZnJhbWVfZGlnIC04IC8vIG5ld0FycmF5CglzdG9yZSA2IC8vIG5ldyBhcnJheQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWludCAwCglmcmFtZV9kaWcgLTIgLy8gc3RhcnRPZkhlYWRzCglleHRyYWN0MwoJc3RvcmUgMyAvLyBzdGF0aWMgcGFydCBvZiB0dXBsZQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2RpZyAtMiAvLyBzdGFydE9mSGVhZHMKCWZyYW1lX2RpZyAtMyAvLyB0b3RhbEhlYWRMZW5ndGgKCWV4dHJhY3QzIAoJc3RvcmUgNCAvLyBkeW5hbWljIGhlYWRzCglieXRlIDB4CglkdXAKCXN0b3JlIDUgLy8gdmFsdWVzIGFmdGVyIGFycmF5CglzdG9yZSA3IC8vIHZhbHVlcyBiZWZvcmUgYXJyYXkKCWZyYW1lX2RpZyAtNCAvLyBsYXN0RHluYW1pY0VsZW1lbnQKCWJueiBza2lwX3ZhbHVlc19hZnRlcl9hcnJheQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJKwoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxlbgoJc3Vic3RyaW5nMwoJc3RvcmUgNSAvLyB2YWx1ZXMgYWZ0ZXIgYXJyYXkKCnNraXBfdmFsdWVzX2FmdGVyX2FycmF5OgoJZnJhbWVfZGlnIC01IC8vIGZpcnN0RHluYW1pY0VsZW1lbnQKCWJueiBza2lwX3ZhbHVlc19iZWZvcmVfYXJyYXkKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZEVuZAoJbG9hZCAxIC8vIGFycmF5IG9mZnNldAoJc3Vic3RyaW5nMwoJc3RvcmUgNyAvLyB2YWx1ZXMgYmVmb3JlIGFycmF5Cgpza2lwX3ZhbHVlc19iZWZvcmVfYXJyYXk6Cglsb2FkIDQgLy8gZHluYW1pYyBoZWFkcwoJZnJhbWVfZGlnIC02IC8vIGhlYWRVcGRhdGVCaXRtYXNrCglsb2FkIDYgLy8gbmV3IGFycmF5CglsZW4KCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJbG9hZCA2IC8vIG5ldyBhcnJheQoJbGVuCglsb2FkIDIgLy8gZnVsbCBhcnJheSBsZW5ndGgKCT49Cglibnogc2tpcF9sZW5fc3dhcAoJc3dhcAoKc2tpcF9sZW5fc3dhcDoKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglkdXAKCWNvbmNhdAoJZHVwCgljb25jYXQKCWR1cAoJY29uY2F0CglkdXAKCWNvbmNhdAoJZHVwCgljb25jYXQKCWImCglsb2FkIDYgLy8gbmV3IGFycmF5CglsZW4KCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJPj0KCWJueiBhZGRfaGVhZAoJYi0KCWIgc3ViX29yX2FkZF9oZWFkX2VuZAoKYWRkX2hlYWQ6CgliKwoKc3ViX29yX2FkZF9oZWFkX2VuZDoKCWZyYW1lX2RpZyAtNyAvLyBmdWxsSGVhZEJpdG1hc2sKCWImCglzdG9yZSA0IC8vIGR5bmFtaWMgaGVhZHMKCWxvYWQgMyAvLyBzdGF0aWMgcGFydCBvZiB0dXBsZQoJbG9hZCA0IC8vIGR5bmFtaWMgaGVhZHMKCWxvYWQgNyAvLyB2YWx1ZXMgYmVmb3JlIGFycmF5Cglsb2FkIDYgLy8gbmV3IGFycmF5Cglsb2FkIDUgLy8gdmFsdWVzIGFmdGVyIGFycmF5Cgljb25jYXQKCWNvbmNhdAoJY29uY2F0Cgljb25jYXQKCXJldHN1YgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgY3JlYXRlCglpbnQgMQoJcmV0dXJuCgpjcmVhdGU6Cglwcm90byAwIDAKCXJldHN1YgoKYWJpX3JvdXRlX3NldE15Q29udGFjdDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJZXh0cmFjdCAyIDAKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIHNldE15Q29udGFjdAoJaW50IDEKCXJldHVybgoKc2V0TXlDb250YWN0OgoJcHJvdG8gMyAwCgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjE1CgkvLyBjb250YWN0OiBDb250YWN0ID0geyBuYW1lOiBuYW1lLCBjb21wYW55OiBjb21wYW55IH0KCWJ5dGUgMHggLy8gbm8gc3RhdGljIGVsZW1lbnRzCglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDA0IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDQKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglmcmFtZV9kaWcgLTIgLy8gY29tcGFueTogYnl0ZXMKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTMgLy8gY29udGFjdDogQ29udGFjdAoKCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czoxNwoJLy8gdGhpcy5teUNvbnRhY3QucHV0KGNvbnRhY3QpCglieXRlICJteUNvbnRhY3QiCglmcmFtZV9kaWcgLTMgLy8gY29udGFjdDogQ29udGFjdAoJYXBwX2dsb2JhbF9wdXQKCgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MTgKCS8vIHRoaXMuY29udGFjdHMucHV0KHRoaXMudHhuLnNlbmRlciwgY29udGFjdCkKCXR4biBTZW5kZXIKCWR1cAoJYm94X2RlbAoJcG9wCglmcmFtZV9kaWcgLTMgLy8gY29udGFjdDogQ29udGFjdAoJYm94X3B1dAoJcmV0c3ViCgphYmlfcm91dGVfYWRkQ29udGFjdDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoJdHhuYXMgQWNjb3VudHMKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBhZGRDb250YWN0CglpbnQgMQoJcmV0dXJuCgphZGRDb250YWN0OgoJcHJvdG8gNCAwCgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjIyCgkvLyBjb250YWN0OiBDb250YWN0ID0geyBuYW1lOiBuYW1lLCBjb21wYW55OiBjb21wYW55IH0KCWJ5dGUgMHggLy8gbm8gc3RhdGljIGVsZW1lbnRzCglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDA0IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDQKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglmcmFtZV9kaWcgLTIgLy8gY29tcGFueTogYnl0ZXMKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTQgLy8gY29udGFjdDogQ29udGFjdAoKCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czoyMwoJLy8gdGhpcy5jb250YWN0cy5wdXQoYWRkcmVzcywgY29udGFjdCkKCWZyYW1lX2RpZyAtMyAvLyBhZGRyZXNzOiBhY2NvdW50CglkdXAKCWJveF9kZWwKCXBvcAoJZnJhbWVfZGlnIC00IC8vIGNvbnRhY3Q6IENvbnRhY3QKCWJveF9wdXQKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZUNvbnRhY3RGaWVsZDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoJdHhuYXMgQWNjb3VudHMKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiB1cGRhdGVDb250YWN0RmllbGQKCWludCAxCglyZXR1cm4KCnVwZGF0ZUNvbnRhY3RGaWVsZDoKCXByb3RvIDMgMAoKCS8vIGlmMF9jb25kaXRpb24KCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czoyNwoJLy8gZmllbGQgPT09ICduYW1lJwoJZnJhbWVfZGlnIC0xIC8vIGZpZWxkOiBieXRlcwoJYnl0ZSAibmFtZSIKCT09CglieiBpZjBfZWxzZWlmMV9jb25kaXRpb24KCgkvLyBpZjBfY29uc2VxdWVudAoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjI4CgkvLyB0aGlzLmNvbnRhY3RzLmdldChhZGRyZXNzKS5uYW1lID0gdmFsdWUKCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czoxCgkvLyB0aGlzLmNvbnRhY3RzLmdldChhZGRyZXNzKQoJZnJhbWVfZGlnIC0zIC8vIGFkZHJlc3M6IGFjY291bnQKCWJveF9nZXQKCWFzc2VydAoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCAwIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglmcmFtZV9kaWcgLTIgLy8gdmFsdWU6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJYnl0ZSAweEZGRkZGRkZGCglieXRlIDB4MDAwMEZGRkYgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDEgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMCAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDQgLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAwIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDQgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2RpZyAtMyAvLyBhZGRyZXNzOiBhY2NvdW50CglkdXAKCWJveF9kZWwKCXBvcAoJc3dhcAoJYm94X3B1dAoJYiBpZjBfZW5kCgppZjBfZWxzZWlmMV9jb25kaXRpb246CgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MjkKCS8vIGZpZWxkID09PSAnY29tcGFueScKCWZyYW1lX2RpZyAtMSAvLyBmaWVsZDogYnl0ZXMKCWJ5dGUgImNvbXBhbnkiCgk9PQoJYnogaWYwX2Vsc2UKCgkvLyBpZjBfZWxzZWlmMV9jb25zZXF1ZW50CgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MzAKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpLmNvbXBhbnkgPSB2YWx1ZQoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjEKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpCglmcmFtZV9kaWcgLTMgLy8gYWRkcmVzczogYWNjb3VudAoJYm94X2dldAoJYXNzZXJ0CglpbnQgMSAvLyB0eXBlIGxlbmd0aAoJaW50IDIgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZTogYnl0ZXMKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglieXRlIDB4RkZGRkZGRkYKCWJ5dGUgMHgwMDAwMDAwMCAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMCAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAxIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgNCAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDAgLy8gc3RhcnRPZkhlYWRzCglpbnQgNCAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfZGlnIC0zIC8vIGFkZHJlc3M6IGFjY291bnQKCWR1cAoJYm94X2RlbAoJcG9wCglzd2FwCglib3hfcHV0CgliIGlmMF9lbmQKCmlmMF9lbHNlOgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjMxCgkvLyBlcnIoKQoJZXJyCgppZjBfZW5kOgoJcmV0c3ViCgphYmlfcm91dGVfdmVyaWZ5Q29udGFjdE5hbWU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWJ0b2kKCXR4bmFzIEFjY291bnRzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiB2ZXJpZnlDb250YWN0TmFtZQoJaW50IDEKCXJldHVybgoKdmVyaWZ5Q29udGFjdE5hbWU6Cglwcm90byAyIDAKCgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MzUKCS8vIGFzc2VydCh0aGlzLmNvbnRhY3RzLmdldChhZGRyZXNzKS5uYW1lID09PSBuYW1lKQoJZnJhbWVfZGlnIC0yIC8vIGFkZHJlc3M6IGFjY291bnQKCWJveF9nZXQKCWFzc2VydAoJZnJhbWVfZGlnIC0yIC8vIGFkZHJlc3M6IGFjY291bnQKCWJveF9nZXQKCWFzc2VydAoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCAwIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglsb2FkIDAgLy8gZnVsbCB0dXBsZQoJbG9hZCAxIC8vIGFycmF5IG9mZnNldAoJbG9hZCAyIC8vIGZ1bGwgYXJyYXkgbGVuZ3RoCglleHRyYWN0MwoJZXh0cmFjdCAyIDAgLy8gZXh0cmFjdCBieXRlcyBmcm9tIHN0cmluZwoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IGJ5dGVzCgk9PQoJYXNzZXJ0CglyZXRzdWIKCm1haW46Cgl0eG4gTnVtQXBwQXJncwoJYm56IHJvdXRlX2FiaQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgk9PQoJYm56IGJhcmVfcm91dGVfY3JlYXRlCgpyb3V0ZV9hYmk6CgltZXRob2QgInNldE15Q29udGFjdChzdHJpbmcsc3RyaW5nKXZvaWQiCgltZXRob2QgImFkZENvbnRhY3Qoc3RyaW5nLHN0cmluZyxhY2NvdW50KXZvaWQiCgltZXRob2QgInVwZGF0ZUNvbnRhY3RGaWVsZChzdHJpbmcsc3RyaW5nLGFjY291bnQpdm9pZCIKCW1ldGhvZCAidmVyaWZ5Q29udGFjdE5hbWUoc3RyaW5nLGFjY291bnQpdm9pZCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoIGFiaV9yb3V0ZV9zZXRNeUNvbnRhY3QgYWJpX3JvdXRlX2FkZENvbnRhY3QgYWJpX3JvdXRlX3VwZGF0ZUNvbnRhY3RGaWVsZCBhYmlfcm91dGVfdmVyaWZ5Q29udGFjdE5hbWU=","clear":"I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"},"contract":{"name":"ContactsApp","desc":"","methods":[{"name":"setMyContact","args":[{"name":"name","type":"string","desc":""},{"name":"company","type":"string","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"addContact","args":[{"name":"name","type":"string","desc":""},{"name":"company","type":"string","desc":""},{"name":"address","type":"account","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"updateContactField","args":[{"name":"field","type":"string","desc":""},{"name":"value","type":"string","desc":""},{"name":"address","type":"account","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"verifyContactName","args":[{"name":"name","type":"string","desc":""},{"name":"address","type":"account","desc":""}],"desc":"","returns":{"type":"void","desc":""}}]}} \ No newline at end of file +{"hints":{},"schema":{"local":{"declared":{},"reserved":{}},"global":{"declared":{"myContact":{"type":"bytes","key":"myContact"}},"reserved":{}}},"state":{"global":{"num_byte_slices":1,"num_uints":0},"local":{"num_byte_slices":0,"num_uints":0}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudDoKCXByb3RvIDMgMQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZCBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgZHluYW1pYyBhcnJheSBvZmZzZXQgb2YgZWxlbWVudAoJaW50IDAKCXN3YXAKCWV4dHJhY3QzIC8vIGV4dHJhY3QgcG9ydGlvbiBvZiB0dXBsZSBiZWZvcmUgZWxlbWVudAoJZnJhbWVfZGlnIC0yIC8vIG5ldyB0dXBsZSBlbGVtZW50Cgljb25jYXQKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfZGlnIC0xIC8vIGhlYWQgb2Zmc2V0CglleHRyYWN0X3VpbnQxNiAvLyBleHRyYWN0IGR5bmFtaWMgYXJyYXkgb2Zmc2V0IG9mIGVsZW1lbnQKCWZyYW1lX2RpZyAtMyAvLyBvbGQgZWxlbWVudCBsZW5ndGgKCSsKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglsZW4KCXN1YnN0cmluZzMKCWNvbmNhdAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTIgLy8gbmV3IHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2YgbmV3IGVsZW1lbnQKCWZyYW1lX2RpZyAtMyAvLyBvbGQgZWxlbWVudCBsZW5ndGgKCTwKCWJueiBzd2FwcGVkX2RpZmZlcmVuY2UKCWZyYW1lX2RpZyAtMiAvLyBuZXcgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBuZXcgZWxlbWVudAoJZnJhbWVfZGlnIC0zIC8vIG9sZCBlbGVtZW50IGxlbmd0aAoJaW50IDEKCXN0b3JlIDcgLy8gc3VidHJhY3QgaGVhZCBkaWZmZXJlbmNlCgliIGdldF9kaWZmZXJlbmNlCgpzd2FwcGVkX2RpZmZlcmVuY2U6CglmcmFtZV9kaWcgLTMgLy8gb2xkIGVsZW1lbnQgbGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gbmV3IHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2YgbmV3IGVsZW1lbnQKCWludCAwCglzdG9yZSA3IC8vIHN1YnRyYWN0IGhlYWQgZGlmZmVyZW5jZQoKZ2V0X2RpZmZlcmVuY2U6CgktIC8vIGdldCBsZW5ndGggZGlmZmVyZW5jZQoJcmV0c3ViCgp1cGRhdGVfZHluYW1pY19oZWFkOgoJcHJvdG8gMiAwCglmcmFtZV9kaWcgLTIgLy8gbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gZHluYW1pYyBhcnJheSBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgZHluYW1pYyBhcnJheSBvZmZzZXQKCWxvYWQgNyAvLyBzdWJ0cmFjdCBoZWFkIGRpZmZlcmVuY2UKCWJ6IHN1YnRyYWN0X2hlYWRfZGlmZmVyZW5jZQoJKyAvLyBhZGQgZGlmZmVyZW5jZSB0byBvZmZzZXQKCWIgZW5kX2NhbGNfbmV3X2hlYWQKCnN1YnRyYWN0X2hlYWRfZGlmZmVyZW5jZToKCXN3YXAKCS0gLy8gc3VidHJhY3QgZGlmZmVyZW5jZSBmcm9tIG9mZmV0CgplbmRfY2FsY19uZXdfaGVhZDoKCWl0b2IgLy8gY29udmVydCB0byBieXRlcwoJZXh0cmFjdCA2IDIgLy8gY29udmVydCB0byB1aW50MTYKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglzd2FwCglmcmFtZV9kaWcgLTEgLy8gb2Zmc2V0Cglzd2FwCglyZXBsYWNlMyAvLyB1cGRhdGUgb2Zmc2V0CglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCXJldHN1YgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgY3JlYXRlCglpbnQgMQoJcmV0dXJuCgpjcmVhdGU6Cglwcm90byAwIDAKCXJldHN1YgoKYWJpX3JvdXRlX3NldE15Q29udGFjdDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJZXh0cmFjdCAyIDAKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIHNldE15Q29udGFjdAoJaW50IDEKCXJldHVybgoKc2V0TXlDb250YWN0OgoJcHJvdG8gMyAwCgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjE1CgkvLyBjb250YWN0OiBDb250YWN0ID0geyBuYW1lOiBuYW1lLCBjb21wYW55OiBjb21wYW55IH0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA0CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMiAvLyBjb21wYW55OiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0zIC8vIGNvbnRhY3Q6IENvbnRhY3QKCgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MTcKCS8vIHRoaXMubXlDb250YWN0LnB1dChjb250YWN0KQoJYnl0ZSAibXlDb250YWN0IgoJZnJhbWVfZGlnIC0zIC8vIGNvbnRhY3Q6IENvbnRhY3QKCWFwcF9nbG9iYWxfcHV0CgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjE4CgkvLyB0aGlzLmNvbnRhY3RzLnB1dCh0aGlzLnR4bi5zZW5kZXIsIGNvbnRhY3QpCgl0eG4gU2VuZGVyCglkdXAKCWJveF9kZWwKCXBvcAoJZnJhbWVfZGlnIC0zIC8vIGNvbnRhY3Q6IENvbnRhY3QKCWJveF9wdXQKCXJldHN1YgoKYWJpX3JvdXRlX2FkZENvbnRhY3Q6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCXR4bmFzIEFjY291bnRzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglleHRyYWN0IDIgMAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgYWRkQ29udGFjdAoJaW50IDEKCXJldHVybgoKYWRkQ29udGFjdDoKCXByb3RvIDQgMAoKCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czoyMgoJLy8gY29udGFjdDogQ29udGFjdCA9IHsgbmFtZTogbmFtZSwgY29tcGFueTogY29tcGFueSB9CglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAwNAoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMSAvLyBuYW1lOiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglmcmFtZV9kaWcgLTIgLy8gY29tcGFueTogYnl0ZXMKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtNCAvLyBjb250YWN0OiBDb250YWN0CgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjIzCgkvLyB0aGlzLmNvbnRhY3RzLnB1dChhZGRyZXNzLCBjb250YWN0KQoJZnJhbWVfZGlnIC0zIC8vIGFkZHJlc3M6IGFjY291bnQKCWR1cAoJYm94X2RlbAoJcG9wCglmcmFtZV9kaWcgLTQgLy8gY29udGFjdDogQ29udGFjdAoJYm94X3B1dAoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlQ29udGFjdEZpZWxkOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgl0eG5hcyBBY2NvdW50cwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJZXh0cmFjdCAyIDAKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIHVwZGF0ZUNvbnRhY3RGaWVsZAoJaW50IDEKCXJldHVybgoKdXBkYXRlQ29udGFjdEZpZWxkOgoJcHJvdG8gMyAwCgoJLy8gaWYwX2NvbmRpdGlvbgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjI3CgkvLyBmaWVsZCA9PT0gJ25hbWUnCglmcmFtZV9kaWcgLTEgLy8gZmllbGQ6IGJ5dGVzCglieXRlICJuYW1lIgoJPT0KCWJ6IGlmMF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vIGlmMF9jb25zZXF1ZW50CgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MjgKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpLm5hbWUgPSB2YWx1ZQoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjEKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpCglmcmFtZV9kaWcgLTMgLy8gYWRkcmVzczogYWNjb3VudAoJYm94X2dldAoJYXNzZXJ0CglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDAKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglmcmFtZV9kaWcgLTIgLy8gdmFsdWU6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJaW50IDAKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDIKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2RpZyAtMyAvLyBhZGRyZXNzOiBhY2NvdW50CglkdXAKCWJveF9kZWwKCXBvcAoJc3dhcAoJYm94X3B1dAoJYiBpZjBfZW5kCgppZjBfZWxzZWlmMV9jb25kaXRpb246CgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MjkKCS8vIGZpZWxkID09PSAnY29tcGFueScKCWZyYW1lX2RpZyAtMSAvLyBmaWVsZDogYnl0ZXMKCWJ5dGUgImNvbXBhbnkiCgk9PQoJYnogaWYwX2Vsc2UKCgkvLyBpZjBfZWxzZWlmMV9jb25zZXF1ZW50CgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MzAKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpLmNvbXBhbnkgPSB2YWx1ZQoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjEKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpCglmcmFtZV9kaWcgLTMgLy8gYWRkcmVzczogYWNjb3VudAoJYm94X2dldAoJYXNzZXJ0CglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglmcmFtZV9kaWcgLTIgLy8gdmFsdWU6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJaW50IDIKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2RpZyAtMyAvLyBhZGRyZXNzOiBhY2NvdW50CglkdXAKCWJveF9kZWwKCXBvcAoJc3dhcAoJYm94X3B1dAoJYiBpZjBfZW5kCgppZjBfZWxzZToKCWVyciAvLyAnSW52YWxpZCBmaWVsZCcKCmlmMF9lbmQ6CglyZXRzdWIKCmFiaV9yb3V0ZV92ZXJpZnlDb250YWN0TmFtZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJYnRvaQoJdHhuYXMgQWNjb3VudHMKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIHZlcmlmeUNvbnRhY3ROYW1lCglpbnQgMQoJcmV0dXJuCgp2ZXJpZnlDb250YWN0TmFtZToKCXByb3RvIDIgMAoKCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czozNQoJLy8gYXNzZXJ0KHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpLm5hbWUgPT09IG5hbWUpCglmcmFtZV9kaWcgLTIgLy8gYWRkcmVzczogYWNjb3VudAoJYm94X2dldAoJYXNzZXJ0CglmcmFtZV9kaWcgLTIgLy8gYWRkcmVzczogYWNjb3VudAoJYm94X2dldAoJYXNzZXJ0CglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDAKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJZXh0cmFjdCAyIDAKCWZyYW1lX2RpZyAtMSAvLyBuYW1lOiBieXRlcwoJPT0KCWFzc2VydAoJcmV0c3ViCgptYWluOgoJdHhuIE51bUFwcEFyZ3MKCWJueiByb3V0ZV9hYmkKCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCWJueiBiYXJlX3JvdXRlX2NyZWF0ZQoKcm91dGVfYWJpOgoJbWV0aG9kICJzZXRNeUNvbnRhY3Qoc3RyaW5nLHN0cmluZyl2b2lkIgoJbWV0aG9kICJhZGRDb250YWN0KHN0cmluZyxzdHJpbmcsYWNjb3VudCl2b2lkIgoJbWV0aG9kICJ1cGRhdGVDb250YWN0RmllbGQoc3RyaW5nLHN0cmluZyxhY2NvdW50KXZvaWQiCgltZXRob2QgInZlcmlmeUNvbnRhY3ROYW1lKHN0cmluZyxhY2NvdW50KXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCBhYmlfcm91dGVfc2V0TXlDb250YWN0IGFiaV9yb3V0ZV9hZGRDb250YWN0IGFiaV9yb3V0ZV91cGRhdGVDb250YWN0RmllbGQgYWJpX3JvdXRlX3ZlcmlmeUNvbnRhY3ROYW1l","clear":"I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"},"contract":{"name":"ContactsApp","desc":"","methods":[{"name":"setMyContact","args":[{"name":"name","type":"string","desc":""},{"name":"company","type":"string","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"addContact","args":[{"name":"name","type":"string","desc":""},{"name":"company","type":"string","desc":""},{"name":"address","type":"account","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"updateContactField","args":[{"name":"field","type":"string","desc":""},{"name":"value","type":"string","desc":""},{"name":"address","type":"account","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"verifyContactName","args":[{"name":"name","type":"string","desc":""},{"name":"address","type":"account","desc":""}],"desc":"","returns":{"type":"void","desc":""}}]}} \ No newline at end of file diff --git a/examples/tuple_in_box/tealscript_artifacts/ContactsApp.src_map.json b/examples/tuple_in_box/tealscript_artifacts/ContactsApp.src_map.json index ed0966668..ed22a252c 100644 --- a/examples/tuple_in_box/tealscript_artifacts/ContactsApp.src_map.json +++ b/examples/tuple_in_box/tealscript_artifacts/ContactsApp.src_map.json @@ -11,685 +11,693 @@ "9": 0, "10": 0, "11": 0, - "12": 0, - "13": 0, - "14": 0, - "15": 0, - "16": 0, - "17": 0, - "18": 1, - "19": 1, - "20": 1, - "21": 4, - "22": 4, - "23": 4, - "24": 5, - "25": 5, - "26": 6, - "27": 6, - "28": 7, - "29": 7, - "30": 8, - "31": 8, - "32": 9, - "33": 10, - "34": 10, - "35": 11, - "36": 11, - "37": 12, - "38": 12, - "39": 13, - "40": 14, - "41": 14, - "42": 15, - "43": 16, - "44": 17, - "45": 18, - "46": 18, - "47": 19, - "48": 22, - "49": 22, - "50": 22, - "51": 23, - "52": 23, - "53": 24, - "54": 24, - "55": 25, - "56": 25, - "57": 26, - "58": 27, - "59": 27, - "60": 28, - "61": 29, - "62": 29, - "63": 30, - "64": 30, - "65": 31, - "66": 31, - "67": 32, - "68": 32, - "69": 33, - "70": 34, - "71": 34, - "72": 35, - "73": 36, - "74": 37, - "75": 37, - "76": 38, - "77": 38, - "78": 39, - "79": 39, - "80": 40, - "81": 40, - "82": 40, - "83": 41, - "84": 41, - "85": 42, - "86": 42, - "87": 43, - "88": 43, - "89": 44, - "90": 45, - "91": 45, - "92": 46, - "93": 47, - "94": 48, - "95": 48, - "96": 51, - "97": 51, - "98": 52, - "99": 52, - "100": 52, - "101": 53, - "102": 53, - "103": 54, - "104": 54, - "105": 55, - "106": 55, - "107": 56, - "108": 57, - "109": 57, - "110": 60, - "111": 60, - "112": 61, - "113": 61, - "114": 62, - "115": 62, - "116": 63, - "117": 64, - "118": 64, - "119": 65, - "120": 65, - "121": 66, - "122": 67, - "123": 67, - "124": 68, - "125": 69, - "126": 69, - "127": 69, - "128": 70, - "129": 73, - "130": 74, - "131": 75, - "132": 75, - "133": 75, - "134": 76, - "135": 77, - "136": 78, - "137": 79, - "138": 80, - "139": 81, - "140": 82, - "141": 83, - "142": 84, - "143": 85, - "144": 86, - "145": 87, - "146": 87, - "147": 88, - "148": 89, - "149": 89, - "150": 90, - "151": 91, - "152": 91, - "153": 91, - "154": 92, - "155": 93, - "156": 93, - "157": 93, - "158": 96, - "159": 99, - "160": 99, - "161": 100, - "162": 101, - "163": 101, - "164": 102, - "165": 102, - "166": 103, - "167": 103, - "168": 104, - "169": 104, - "170": 105, - "171": 105, - "172": 106, - "173": 106, - "174": 107, - "175": 108, - "176": 109, - "177": 110, - "178": 111, - "179": 114, - "180": 114, - "181": 115, - "182": 116, - "183": 117, - "184": 117, - "185": 118, - "186": 119, - "187": 120, - "188": 121, - "189": 122, - "190": 122, - "191": 122, - "192": 123, - "193": 124, - "194": 127, - "195": 127, - "196": 127, - "197": 128, - "198": 131, - "199": 131, - "200": 132, - "201": 133, - "202": 134, - "203": 134, - "204": 135, - "205": 136, - "206": 137, - "207": 138, - "208": 139, - "209": 140, - "210": 140, - "211": 140, - "212": 141, - "213": 141, - "214": 141, - "215": 142, - "216": 142, - "217": 142, - "218": 143, - "219": 143, - "220": 143, - "221": 144, - "222": 144, - "223": 144, - "224": 145, - "225": 146, - "226": 149, - "227": 149, - "228": 149, - "229": 153, - "230": 154, - "231": 154, - "232": 155, - "233": 156, - "234": 156, - "235": 157, - "236": 158, - "237": 158, - "238": 159, - "239": 160, - "240": 160, - "241": 161, - "242": 161, - "243": 162, - "244": 163, - "245": 164, - "246": 165, - "247": 165, - "248": 165, - "249": 166, - "250": 167, - "251": 168, - "252": 169, - "253": 170, - "254": 170, - "255": 171, - "256": 172, + "12": 1, + "13": 1, + "14": 1, + "15": 4, + "16": 4, + "17": 4, + "18": 5, + "19": 5, + "20": 6, + "21": 6, + "22": 7, + "23": 7, + "24": 8, + "25": 9, + "26": 10, + "27": 11, + "28": 12, + "29": 12, + "30": 13, + "31": 14, + "32": 14, + "33": 15, + "34": 15, + "35": 16, + "36": 16, + "37": 17, + "38": 18, + "39": 18, + "40": 19, + "41": 20, + "42": 20, + "43": 21, + "44": 22, + "45": 23, + "46": 24, + "47": 24, + "48": 25, + "49": 25, + "50": 26, + "51": 27, + "52": 27, + "53": 28, + "54": 29, + "55": 29, + "56": 29, + "57": 30, + "58": 30, + "59": 31, + "60": 32, + "61": 32, + "62": 33, + "63": 34, + "64": 34, + "65": 35, + "66": 35, + "67": 35, + "68": 38, + "69": 38, + "70": 39, + "71": 39, + "72": 40, + "73": 41, + "74": 42, + "75": 42, + "76": 45, + "77": 46, + "78": 49, + "79": 49, + "80": 49, + "81": 50, + "82": 50, + "83": 51, + "84": 51, + "85": 52, + "86": 52, + "87": 53, + "88": 54, + "89": 54, + "90": 55, + "91": 55, + "92": 55, + "93": 56, + "94": 57, + "95": 57, + "96": 57, + "97": 60, + "98": 61, + "99": 64, + "100": 65, + "101": 65, + "102": 65, + "103": 66, + "104": 66, + "105": 67, + "106": 68, + "107": 68, + "108": 69, + "109": 70, + "110": 71, + "111": 71, + "112": 72, + "113": 75, + "114": 75, + "115": 76, + "116": 77, + "117": 78, + "118": 78, + "119": 79, + "120": 80, + "121": 81, + "122": 82, + "123": 83, + "124": 83, + "125": 83, + "126": 84, + "127": 85, + "128": 88, + "129": 88, + "130": 88, + "131": 89, + "132": 92, + "133": 92, + "134": 93, + "135": 94, + "136": 95, + "137": 95, + "138": 96, + "139": 97, + "140": 98, + "141": 99, + "142": 100, + "143": 101, + "144": 101, + "145": 101, + "146": 102, + "147": 102, + "148": 102, + "149": 103, + "150": 103, + "151": 103, + "152": 104, + "153": 104, + "154": 104, + "155": 105, + "156": 105, + "157": 105, + "158": 106, + "159": 107, + "160": 110, + "161": 110, + "162": 110, + "163": 114, + "164": 115, + "165": 116, + "166": 116, + "167": 117, + "168": 117, + "169": 118, + "170": 119, + "171": 119, + "172": 120, + "173": 120, + "174": 121, + "175": 121, + "176": 122, + "177": 123, + "178": 123, + "179": 124, + "180": 124, + "181": 125, + "182": 126, + "183": 127, + "184": 128, + "185": 128, + "186": 128, + "187": 129, + "188": 130, + "189": 131, + "190": 132, + "191": 133, + "192": 133, + "193": 134, + "194": 135, + "195": 136, + "196": 137, + "197": 137, + "198": 137, + "199": 138, + "200": 138, + "201": 139, + "202": 139, + "203": 140, + "204": 141, + "205": 142, + "206": 142, + "207": 143, + "208": 143, + "209": 144, + "210": 144, + "211": 145, + "212": 146, + "213": 146, + "214": 147, + "215": 147, + "216": 148, + "217": 149, + "218": 150, + "219": 151, + "220": 151, + "221": 151, + "222": 152, + "223": 153, + "224": 154, + "225": 155, + "226": 156, + "227": 156, + "228": 157, + "229": 158, + "230": 159, + "231": 160, + "232": 160, + "233": 160, + "234": 161, + "235": 161, + "236": 162, + "237": 162, + "238": 163, + "239": 164, + "240": 165, + "241": 165, + "242": 166, + "243": 166, + "244": 167, + "245": 167, + "246": 168, + "247": 169, + "248": 169, + "249": 173, + "250": 173, + "251": 173, + "252": 173, + "253": 173, + "254": 173, + "255": 173, + "256": 173, "257": 173, "258": 173, - "259": 174, - "260": 175, - "261": 175, + "259": 173, + "260": 174, + "261": 174, "262": 175, - "263": 176, - "264": 176, - "265": 177, - "266": 178, - "267": 179, - "268": 179, - "269": 180, - "270": 180, - "271": 181, - "272": 182, - "273": 183, - "274": 183, - "275": 184, - "276": 184, - "277": 185, - "278": 186, - "279": 187, - "280": 188, - "281": 188, - "282": 188, - "283": 189, - "284": 190, - "285": 191, - "286": 191, - "287": 192, - "288": 193, - "289": 194, - "290": 194, - "291": 195, - "292": 195, - "293": 196, - "294": 196, - "295": 197, - "296": 197, - "297": 198, - "298": 199, - "299": 200, - "300": 200, + "263": 179, + "264": 179, + "265": 180, + "266": 181, + "267": 182, + "268": 183, + "269": 183, + "270": 184, + "271": 185, + "272": 188, + "273": 188, + "274": 189, + "275": 190, + "276": 191, + "277": 191, + "278": 192, + "279": 193, + "280": 194, + "281": 195, + "282": 196, + "283": 197, + "284": 197, + "285": 197, + "286": 198, + "287": 199, + "288": 199, + "289": 200, + "290": 200, + "291": 200, + "292": 201, + "293": 201, + "294": 201, + "295": 202, + "296": 202, + "297": 202, + "298": 203, + "299": 203, + "300": 203, "301": 204, "302": 204, "303": 204, - "304": 204, - "305": 204, - "306": 204, - "307": 204, - "308": 204, - "309": 204, - "310": 204, - "311": 204, - "312": 205, - "313": 205, - "314": 206, - "315": 210, - "316": 210, - "317": 211, - "318": 212, - "319": 213, - "320": 214, - "321": 214, - "322": 215, - "323": 216, - "324": 219, - "325": 219, - "326": 220, - "327": 221, - "328": 222, - "329": 222, - "330": 223, - "331": 224, - "332": 225, - "333": 226, - "334": 227, - "335": 228, - "336": 228, - "337": 228, - "338": 229, - "339": 230, - "340": 230, - "341": 231, - "342": 231, - "343": 231, - "344": 232, - "345": 232, - "346": 232, - "347": 233, - "348": 233, - "349": 233, - "350": 234, - "351": 234, - "352": 234, - "353": 235, - "354": 235, - "355": 235, - "356": 236, - "357": 237, - "358": 240, - "359": 240, - "360": 240, - "361": 244, - "362": 245, - "363": 245, - "364": 246, - "365": 247, - "366": 247, - "367": 248, - "368": 249, - "369": 249, - "370": 250, - "371": 251, - "372": 251, - "373": 252, - "374": 252, - "375": 253, - "376": 254, - "377": 255, - "378": 256, - "379": 256, - "380": 256, - "381": 257, - "382": 258, - "383": 259, - "384": 260, - "385": 261, - "386": 261, - "387": 262, - "388": 263, - "389": 264, - "390": 264, - "391": 265, - "392": 266, - "393": 266, - "394": 266, - "395": 267, - "396": 267, - "397": 268, - "398": 269, - "399": 270, - "400": 270, - "401": 271, - "402": 271, - "403": 272, - "404": 273, - "405": 274, - "406": 274, - "407": 275, - "408": 275, - "409": 276, - "410": 277, - "411": 278, - "412": 279, - "413": 279, - "414": 279, - "415": 280, - "416": 281, - "417": 282, - "418": 282, - "419": 283, - "420": 284, - "421": 285, - "422": 285, - "423": 286, - "424": 286, - "425": 287, - "426": 287, - "427": 288, - "428": 288, - "429": 289, - "430": 290, - "431": 291, - "432": 291, - "433": 295, - "434": 295, - "435": 296, - "436": 297, - "437": 298, - "438": 299, - "439": 299, - "440": 300, - "441": 301, - "442": 304, - "443": 304, - "444": 305, - "445": 306, + "304": 205, + "305": 206, + "306": 209, + "307": 209, + "308": 209, + "309": 213, + "310": 214, + "311": 215, + "312": 215, + "313": 216, + "314": 216, + "315": 217, + "316": 218, + "317": 218, + "318": 219, + "319": 219, + "320": 220, + "321": 220, + "322": 221, + "323": 222, + "324": 222, + "325": 223, + "326": 223, + "327": 224, + "328": 225, + "329": 226, + "330": 227, + "331": 227, + "332": 227, + "333": 228, + "334": 229, + "335": 230, + "336": 231, + "337": 232, + "338": 232, + "339": 233, + "340": 234, + "341": 235, + "342": 236, + "343": 236, + "344": 236, + "345": 237, + "346": 237, + "347": 238, + "348": 238, + "349": 239, + "350": 240, + "351": 241, + "352": 241, + "353": 242, + "354": 242, + "355": 243, + "356": 243, + "357": 244, + "358": 245, + "359": 245, + "360": 246, + "361": 246, + "362": 247, + "363": 248, + "364": 249, + "365": 250, + "366": 250, + "367": 250, + "368": 251, + "369": 252, + "370": 253, + "371": 254, + "372": 255, + "373": 255, + "374": 256, + "375": 257, + "376": 258, + "377": 259, + "378": 259, + "379": 259, + "380": 260, + "381": 260, + "382": 261, + "383": 261, + "384": 262, + "385": 263, + "386": 264, + "387": 264, + "388": 265, + "389": 265, + "390": 266, + "391": 266, + "392": 267, + "393": 268, + "394": 268, + "395": 272, + "396": 272, + "397": 273, + "398": 274, + "399": 275, + "400": 276, + "401": 276, + "402": 277, + "403": 278, + "404": 281, + "405": 281, + "406": 282, + "407": 283, + "408": 284, + "409": 284, + "410": 285, + "411": 286, + "412": 287, + "413": 288, + "414": 289, + "415": 289, + "416": 289, + "417": 290, + "418": 291, + "419": 291, + "420": 292, + "421": 292, + "422": 292, + "423": 293, + "424": 293, + "425": 293, + "426": 294, + "427": 294, + "428": 294, + "429": 295, + "430": 295, + "431": 295, + "432": 296, + "433": 296, + "434": 296, + "435": 297, + "436": 298, + "437": 301, + "438": 301, + "439": 301, + "440": 306, + "441": 306, + "442": 307, + "443": 307, + "444": 307, + "445": 307, "446": 307, "447": 307, "448": 308, "449": 309, - "450": 310, - "451": 311, - "452": 312, - "453": 312, - "454": 312, - "455": 313, - "456": 314, - "457": 314, - "458": 315, - "459": 315, - "460": 315, - "461": 316, - "462": 316, - "463": 316, - "464": 317, - "465": 317, - "466": 317, - "467": 318, - "468": 318, - "469": 318, - "470": 319, - "471": 319, - "472": 319, - "473": 320, - "474": 321, - "475": 324, - "476": 324, - "477": 324, - "478": 329, - "479": 329, - "480": 330, - "481": 330, - "482": 330, - "483": 330, - "484": 330, - "485": 330, - "486": 331, - "487": 332, - "488": 332, - "489": 332, - "490": 339, - "491": 339, - "492": 340, - "493": 341, - "494": 342, - "495": 343, - "496": 344, - "497": 344, - "498": 344, - "499": 345, - "500": 345, - "501": 346, - "502": 347, - "503": 348, - "504": 349, - "505": 349, - "506": 349, - "507": 350, - "508": 351, - "509": 352, - "510": 353, - "511": 353, - "512": 353, - "513": 353, - "514": 353, - "515": 353, - "516": 354, - "517": 355, - "518": 356, - "519": 357, - "520": 358, - "521": 359, - "522": 359, - "523": 359, - "524": 360, - "525": 360, - "526": 361, - "527": 362, - "528": 363, - "529": 364, - "530": 365, - "531": 366, - "532": 366, - "533": 366, - "534": 371, - "535": 371, - "536": 372, - "537": 372, - "538": 372, - "539": 372, - "540": 372, - "541": 372, - "542": 372, - "543": 372, - "544": 372, - "545": 373, - "546": 374, - "547": 374, - "548": 374, - "549": 381, - "550": 381, - "551": 382, - "552": 383, - "553": 384, - "554": 385, - "555": 386, - "556": 386, - "557": 386, - "558": 387, - "559": 387, - "560": 388, - "561": 389, - "562": 390, - "563": 391, - "564": 391, - "565": 391, - "566": 392, - "567": 393, - "568": 394, - "569": 395, - "570": 395, - "571": 395, - "572": 395, - "573": 395, - "574": 395, - "575": 396, - "576": 397, - "577": 398, - "578": 399, - "579": 400, - "580": 401, - "581": 401, - "582": 401, - "583": 402, - "584": 402, - "585": 403, - "586": 404, - "587": 405, - "588": 406, - "589": 407, - "590": 408, - "591": 408, - "592": 408, - "593": 413, - "594": 416, - "595": 419, - "596": 419, - "597": 420, - "598": 421, - "599": 422, - "600": 422, - "601": 423, - "602": 424, - "603": 425, - "604": 426, - "605": 427, - "606": 427, - "607": 427, - "608": 428, - "609": 429, - "610": 429, - "611": 430, - "612": 430, - "613": 430, - "614": 431, - "615": 431, - "616": 431, - "617": 432, - "618": 432, - "619": 432, - "620": 433, - "621": 434, - "622": 437, - "623": 437, - "624": 437, - "625": 441, - "626": 441, - "627": 442, - "628": 443, - "629": 444, - "630": 444, - "631": 445, - "632": 446, - "633": 447, - "634": 448, - "635": 449, - "636": 449, - "637": 449, - "638": 450, - "639": 450, - "640": 451, - "641": 451, - "642": 452, - "643": 452, - "644": 453, - "645": 454, - "646": 454, - "647": 454, - "648": 455, - "649": 455, - "650": 456, - "651": 457, - "652": 458, - "653": 461, - "654": 461, - "655": 462, - "656": 462, - "657": 462, - "658": 463, - "659": 463, - "660": 464, - "661": 465, - "662": 466, - "663": 466, - "664": 466, - "665": 469, - "666": 469, - "667": 469, - "668": 469, - "669": 469, - "670": 469, - "671": 470, - "672": 470, - "673": 470, - "674": 470, - "675": 470, - "676": 470, - "677": 471, - "678": 471, - "679": 471, - "680": 471, - "681": 471, - "682": 471, - "683": 472, - "684": 472, - "685": 472, - "686": 472, - "687": 472, - "688": 472, - "689": 473, - "690": 473, - "691": 473, - "692": 474 + "450": 309, + "451": 309, + "452": 316, + "453": 316, + "454": 317, + "455": 318, + "456": 319, + "457": 320, + "458": 320, + "459": 321, + "460": 322, + "461": 323, + "462": 323, + "463": 324, + "464": 324, + "465": 325, + "466": 326, + "467": 327, + "468": 328, + "469": 329, + "470": 329, + "471": 330, + "472": 331, + "473": 332, + "474": 333, + "475": 334, + "476": 335, + "477": 336, + "478": 337, + "479": 338, + "480": 338, + "481": 339, + "482": 339, + "483": 340, + "484": 341, + "485": 341, + "486": 342, + "487": 343, + "488": 344, + "489": 345, + "490": 345, + "491": 345, + "492": 346, + "493": 347, + "494": 348, + "495": 349, + "496": 349, + "497": 349, + "498": 350, + "499": 351, + "500": 352, + "501": 352, + "502": 352, + "503": 353, + "504": 354, + "505": 354, + "506": 355, + "507": 355, + "508": 356, + "509": 357, + "510": 358, + "511": 359, + "512": 360, + "513": 361, + "514": 361, + "515": 361, + "516": 366, + "517": 366, + "518": 367, + "519": 367, + "520": 367, + "521": 367, + "522": 367, + "523": 367, + "524": 367, + "525": 367, + "526": 367, + "527": 368, + "528": 369, + "529": 369, + "530": 369, + "531": 376, + "532": 376, + "533": 377, + "534": 378, + "535": 379, + "536": 380, + "537": 380, + "538": 381, + "539": 382, + "540": 383, + "541": 383, + "542": 384, + "543": 384, + "544": 385, + "545": 386, + "546": 387, + "547": 388, + "548": 389, + "549": 389, + "550": 390, + "551": 391, + "552": 392, + "553": 393, + "554": 394, + "555": 395, + "556": 396, + "557": 397, + "558": 398, + "559": 398, + "560": 399, + "561": 399, + "562": 400, + "563": 401, + "564": 401, + "565": 402, + "566": 403, + "567": 404, + "568": 405, + "569": 405, + "570": 405, + "571": 406, + "572": 407, + "573": 408, + "574": 409, + "575": 409, + "576": 409, + "577": 410, + "578": 411, + "579": 411, + "580": 412, + "581": 412, + "582": 413, + "583": 414, + "584": 415, + "585": 416, + "586": 417, + "587": 418, + "588": 418, + "589": 418, + "590": 421, + "591": 424, + "592": 427, + "593": 427, + "594": 428, + "595": 429, + "596": 430, + "597": 430, + "598": 431, + "599": 432, + "600": 433, + "601": 434, + "602": 435, + "603": 435, + "604": 435, + "605": 436, + "606": 437, + "607": 437, + "608": 438, + "609": 438, + "610": 438, + "611": 439, + "612": 439, + "613": 439, + "614": 440, + "615": 440, + "616": 440, + "617": 441, + "618": 442, + "619": 445, + "620": 445, + "621": 445, + "622": 449, + "623": 449, + "624": 450, + "625": 451, + "626": 452, + "627": 452, + "628": 453, + "629": 454, + "630": 455, + "631": 456, + "632": 456, + "633": 457, + "634": 458, + "635": 459, + "636": 459, + "637": 460, + "638": 460, + "639": 461, + "640": 462, + "641": 463, + "642": 464, + "643": 465, + "644": 465, + "645": 466, + "646": 467, + "647": 468, + "648": 469, + "649": 470, + "650": 471, + "651": 472, + "652": 473, + "653": 474, + "654": 474, + "655": 474, + "656": 475, + "657": 475, + "658": 476, + "659": 477, + "660": 478, + "661": 481, + "662": 481, + "663": 482, + "664": 482, + "665": 482, + "666": 483, + "667": 483, + "668": 484, + "669": 485, + "670": 486, + "671": 486, + "672": 486, + "673": 489, + "674": 489, + "675": 489, + "676": 489, + "677": 489, + "678": 489, + "679": 490, + "680": 490, + "681": 490, + "682": 490, + "683": 490, + "684": 490, + "685": 491, + "686": 491, + "687": 491, + "688": 491, + "689": 491, + "690": 491, + "691": 492, + "692": 492, + "693": 492, + "694": 492, + "695": 492, + "696": 492, + "697": 493, + "698": 493, + "699": 493, + "700": 494 } \ No newline at end of file diff --git a/examples/tuple_in_box/tealscript_artifacts/contactsapp_client.ts b/examples/tuple_in_box/tealscript_artifacts/contactsapp_client.ts index fcd6474d8..b736e3691 100644 --- a/examples/tuple_in_box/tealscript_artifacts/contactsapp_client.ts +++ b/examples/tuple_in_box/tealscript_artifacts/contactsapp_client.ts @@ -4,7 +4,7 @@ export class ContactsApp extends bkr.ApplicationClient { desc: string = ""; override appSchema: bkr.Schema = { declared: { myContact: { type: bkr.AVMType.bytes, key: "myContact", desc: "", static: false } }, reserved: {} }; override acctSchema: bkr.Schema = { declared: {}, reserved: {} }; - override approvalProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKcHJlQXJyYXlBY2Nlc3M6Cglwcm90byAzIDAKCWZyYW1lX2RpZyAtMyAvLyBmdWxsIHR1cGxlCglzdG9yZSAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZCBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgYXJyYXkgb2Zmc2V0CglzdG9yZSAxIC8vIGFycmF5IG9mZnNldAoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgYXJyYXkgbGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gdHlwZSBsZW5ndGgKCSogLy8gYXJyYXkgc2l6ZQoJaW50IDIKCSsgLy8gYXJyYXkgc2l6ZSArIGxlbgoJc3RvcmUgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJcmV0c3ViCgp1cGRhdGVEeW5hbWljRWxlbWVudDoKCXByb3RvIDggMQoJZnJhbWVfZGlnIC04IC8vIG5ld0FycmF5CglzdG9yZSA2IC8vIG5ldyBhcnJheQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWludCAwCglmcmFtZV9kaWcgLTIgLy8gc3RhcnRPZkhlYWRzCglleHRyYWN0MwoJc3RvcmUgMyAvLyBzdGF0aWMgcGFydCBvZiB0dXBsZQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2RpZyAtMiAvLyBzdGFydE9mSGVhZHMKCWZyYW1lX2RpZyAtMyAvLyB0b3RhbEhlYWRMZW5ndGgKCWV4dHJhY3QzIAoJc3RvcmUgNCAvLyBkeW5hbWljIGhlYWRzCglieXRlIDB4CglkdXAKCXN0b3JlIDUgLy8gdmFsdWVzIGFmdGVyIGFycmF5CglzdG9yZSA3IC8vIHZhbHVlcyBiZWZvcmUgYXJyYXkKCWZyYW1lX2RpZyAtNCAvLyBsYXN0RHluYW1pY0VsZW1lbnQKCWJueiBza2lwX3ZhbHVlc19hZnRlcl9hcnJheQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJKwoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxlbgoJc3Vic3RyaW5nMwoJc3RvcmUgNSAvLyB2YWx1ZXMgYWZ0ZXIgYXJyYXkKCnNraXBfdmFsdWVzX2FmdGVyX2FycmF5OgoJZnJhbWVfZGlnIC01IC8vIGZpcnN0RHluYW1pY0VsZW1lbnQKCWJueiBza2lwX3ZhbHVlc19iZWZvcmVfYXJyYXkKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZEVuZAoJbG9hZCAxIC8vIGFycmF5IG9mZnNldAoJc3Vic3RyaW5nMwoJc3RvcmUgNyAvLyB2YWx1ZXMgYmVmb3JlIGFycmF5Cgpza2lwX3ZhbHVlc19iZWZvcmVfYXJyYXk6Cglsb2FkIDQgLy8gZHluYW1pYyBoZWFkcwoJZnJhbWVfZGlnIC02IC8vIGhlYWRVcGRhdGVCaXRtYXNrCglsb2FkIDYgLy8gbmV3IGFycmF5CglsZW4KCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJbG9hZCA2IC8vIG5ldyBhcnJheQoJbGVuCglsb2FkIDIgLy8gZnVsbCBhcnJheSBsZW5ndGgKCT49Cglibnogc2tpcF9sZW5fc3dhcAoJc3dhcAoKc2tpcF9sZW5fc3dhcDoKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglkdXAKCWNvbmNhdAoJZHVwCgljb25jYXQKCWR1cAoJY29uY2F0CglkdXAKCWNvbmNhdAoJZHVwCgljb25jYXQKCWImCglsb2FkIDYgLy8gbmV3IGFycmF5CglsZW4KCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJPj0KCWJueiBhZGRfaGVhZAoJYi0KCWIgc3ViX29yX2FkZF9oZWFkX2VuZAoKYWRkX2hlYWQ6CgliKwoKc3ViX29yX2FkZF9oZWFkX2VuZDoKCWZyYW1lX2RpZyAtNyAvLyBmdWxsSGVhZEJpdG1hc2sKCWImCglzdG9yZSA0IC8vIGR5bmFtaWMgaGVhZHMKCWxvYWQgMyAvLyBzdGF0aWMgcGFydCBvZiB0dXBsZQoJbG9hZCA0IC8vIGR5bmFtaWMgaGVhZHMKCWxvYWQgNyAvLyB2YWx1ZXMgYmVmb3JlIGFycmF5Cglsb2FkIDYgLy8gbmV3IGFycmF5Cglsb2FkIDUgLy8gdmFsdWVzIGFmdGVyIGFycmF5Cgljb25jYXQKCWNvbmNhdAoJY29uY2F0Cgljb25jYXQKCXJldHN1YgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCXBvcAoJY2FsbHN1YiBjcmVhdGUKCWludCAxCglyZXR1cm4KCmNyZWF0ZToKCXByb3RvIDAgMAoJcmV0c3ViCgphYmlfcm91dGVfc2V0TXlDb250YWN0OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBzZXRNeUNvbnRhY3QKCWludCAxCglyZXR1cm4KCnNldE15Q29udGFjdDoKCXByb3RvIDMgMAoKCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czoxNQoJLy8gY29udGFjdDogQ29udGFjdCA9IHsgbmFtZTogbmFtZSwgY29tcGFueTogY29tcGFueSB9CglieXRlIDB4IC8vIG5vIHN0YXRpYyBlbGVtZW50cwoJc3RvcmUgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglieXRlIDB4MDAwNCAvLyBoZWFkIGVuZAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWludCA0CglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWJ5dGUgMHgKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWZyYW1lX2RpZyAtMSAvLyBuYW1lOiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJZnJhbWVfZGlnIC0yIC8vIGNvbXBhbnk6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0zIC8vIGNvbnRhY3Q6IENvbnRhY3QKCgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MTcKCS8vIHRoaXMubXlDb250YWN0LnB1dChjb250YWN0KQoJYnl0ZSAibXlDb250YWN0IgoJZnJhbWVfZGlnIC0zIC8vIGNvbnRhY3Q6IENvbnRhY3QKCWFwcF9nbG9iYWxfcHV0CgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjE4CgkvLyB0aGlzLmNvbnRhY3RzLnB1dCh0aGlzLnR4bi5zZW5kZXIsIGNvbnRhY3QpCgl0eG4gU2VuZGVyCglkdXAKCWJveF9kZWwKCXBvcAoJZnJhbWVfZGlnIC0zIC8vIGNvbnRhY3Q6IENvbnRhY3QKCWJveF9wdXQKCXJldHN1YgoKYWJpX3JvdXRlX2FkZENvbnRhY3Q6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwoJYnRvaQoJdHhuYXMgQWNjb3VudHMKCXR4bmEgQXBwbGljYXRpb25BcmdzIDIKCWV4dHJhY3QgMiAwCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBhZGRDb250YWN0CglpbnQgMQoJcmV0dXJuCgphZGRDb250YWN0OgoJcHJvdG8gNCAwCgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjIyCgkvLyBjb250YWN0OiBDb250YWN0ID0geyBuYW1lOiBuYW1lLCBjb21wYW55OiBjb21wYW55IH0KCWJ5dGUgMHggLy8gbm8gc3RhdGljIGVsZW1lbnRzCglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDA0IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDQKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglmcmFtZV9kaWcgLTIgLy8gY29tcGFueTogYnl0ZXMKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTQgLy8gY29udGFjdDogQ29udGFjdAoKCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czoyMwoJLy8gdGhpcy5jb250YWN0cy5wdXQoYWRkcmVzcywgY29udGFjdCkKCWZyYW1lX2RpZyAtMyAvLyBhZGRyZXNzOiBhY2NvdW50CglkdXAKCWJveF9kZWwKCXBvcAoJZnJhbWVfZGlnIC00IC8vIGNvbnRhY3Q6IENvbnRhY3QKCWJveF9wdXQKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZUNvbnRhY3RGaWVsZDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJcG9wCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgl0eG5hcyBBY2NvdW50cwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJZXh0cmFjdCAyIDAKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIHVwZGF0ZUNvbnRhY3RGaWVsZAoJaW50IDEKCXJldHVybgoKdXBkYXRlQ29udGFjdEZpZWxkOgoJcHJvdG8gMyAwCgoJLy8gaWYwX2NvbmRpdGlvbgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjI3CgkvLyBmaWVsZCA9PT0gJ25hbWUnCglmcmFtZV9kaWcgLTEgLy8gZmllbGQ6IGJ5dGVzCglieXRlICJuYW1lIgoJPT0KCWJ6IGlmMF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vIGlmMF9jb25zZXF1ZW50CgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MjgKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpLm5hbWUgPSB2YWx1ZQoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjEKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpCglmcmFtZV9kaWcgLTMgLy8gYWRkcmVzczogYWNjb3VudAoJYm94X2dldAoJYXNzZXJ0CglpbnQgMSAvLyB0eXBlIGxlbmd0aAoJaW50IDAgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWZyYW1lX2RpZyAtMiAvLyB2YWx1ZTogYnl0ZXMKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglieXRlIDB4RkZGRkZGRkYKCWJ5dGUgMHgwMDAwRkZGRiAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMSAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAwIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgNCAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDAgLy8gc3RhcnRPZkhlYWRzCglpbnQgNCAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfZGlnIC0zIC8vIGFkZHJlc3M6IGFjY291bnQKCWR1cAoJYm94X2RlbAoJcG9wCglzd2FwCglib3hfcHV0CgliIGlmMF9lbmQKCmlmMF9lbHNlaWYxX2NvbmRpdGlvbjoKCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czoyOQoJLy8gZmllbGQgPT09ICdjb21wYW55JwoJZnJhbWVfZGlnIC0xIC8vIGZpZWxkOiBieXRlcwoJYnl0ZSAiY29tcGFueSIKCT09CglieiBpZjBfZWxzZQoKCS8vIGlmMF9lbHNlaWYxX2NvbnNlcXVlbnQKCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czozMAoJLy8gdGhpcy5jb250YWN0cy5nZXQoYWRkcmVzcykuY29tcGFueSA9IHZhbHVlCgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MQoJLy8gdGhpcy5jb250YWN0cy5nZXQoYWRkcmVzcykKCWZyYW1lX2RpZyAtMyAvLyBhZGRyZXNzOiBhY2NvdW50Cglib3hfZ2V0Cglhc3NlcnQKCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgMiAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJZnJhbWVfZGlnIC0yIC8vIHZhbHVlOiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHhGRkZGRkZGRgoJYnl0ZSAweDAwMDAwMDAwIC8vIGhlYWQgdXBkYXRlIGJpdG1hc2sKCWludCAwIC8vIGlzIGZpcnN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDEgLy8gaXMgbGFzdCBkeW5hbWljIGVsZW1lbnQKCWludCA0IC8vIHRvdGFsIGhlYWQgbGVuZ3RoCglpbnQgMCAvLyBzdGFydE9mSGVhZHMKCWludCA0IC8vIGhlYWQgZW5kCgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNFbGVtZW50CglmcmFtZV9kaWcgLTMgLy8gYWRkcmVzczogYWNjb3VudAoJZHVwCglib3hfZGVsCglwb3AKCXN3YXAKCWJveF9wdXQKCWIgaWYwX2VuZAoKaWYwX2Vsc2U6CgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MzEKCS8vIGVycigpCgllcnIKCmlmMF9lbmQ6CglyZXRzdWIKCmFiaV9yb3V0ZV92ZXJpZnlDb250YWN0TmFtZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJcG9wCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgl0eG5hcyBBY2NvdW50cwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgdmVyaWZ5Q29udGFjdE5hbWUKCWludCAxCglyZXR1cm4KCnZlcmlmeUNvbnRhY3ROYW1lOgoJcHJvdG8gMiAwCgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjM1CgkvLyBhc3NlcnQodGhpcy5jb250YWN0cy5nZXQoYWRkcmVzcykubmFtZSA9PT0gbmFtZSkKCWZyYW1lX2RpZyAtMiAvLyBhZGRyZXNzOiBhY2NvdW50Cglib3hfZ2V0Cglhc3NlcnQKCWZyYW1lX2RpZyAtMiAvLyBhZGRyZXNzOiBhY2NvdW50Cglib3hfZ2V0Cglhc3NlcnQKCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgMCAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJZXh0cmFjdDMKCWV4dHJhY3QgMiAwIC8vIGV4dHJhY3QgYnl0ZXMgZnJvbSBzdHJpbmcKCWZyYW1lX2RpZyAtMSAvLyBuYW1lOiBieXRlcwoJPT0KCWFzc2VydAoJcmV0c3ViCgptYWluOgoJdHhuIE51bUFwcEFyZ3MKCWJueiByb3V0ZV9hYmkKCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCWJueiBiYXJlX3JvdXRlX2NyZWF0ZQoKcm91dGVfYWJpOgoJbWV0aG9kICJzZXRNeUNvbnRhY3Qoc3RyaW5nLHN0cmluZyl2b2lkIgoJbWV0aG9kICJhZGRDb250YWN0KHN0cmluZyxzdHJpbmcsYWNjb3VudCl2b2lkIgoJbWV0aG9kICJ1cGRhdGVDb250YWN0RmllbGQoc3RyaW5nLHN0cmluZyxhY2NvdW50KXZvaWQiCgltZXRob2QgInZlcmlmeUNvbnRhY3ROYW1lKHN0cmluZyxhY2NvdW50KXZvaWQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCBhYmlfcm91dGVfc2V0TXlDb250YWN0IGFiaV9yb3V0ZV9hZGRDb250YWN0IGFiaV9yb3V0ZV91cGRhdGVDb250YWN0RmllbGQgYWJpX3JvdXRlX3ZlcmlmeUNvbnRhY3ROYW1l"; + override approvalProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudDoKCXByb3RvIDMgMQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZCBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgZHluYW1pYyBhcnJheSBvZmZzZXQgb2YgZWxlbWVudAoJaW50IDAKCXN3YXAKCWV4dHJhY3QzIC8vIGV4dHJhY3QgcG9ydGlvbiBvZiB0dXBsZSBiZWZvcmUgZWxlbWVudAoJZnJhbWVfZGlnIC0yIC8vIG5ldyB0dXBsZSBlbGVtZW50Cgljb25jYXQKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfZGlnIC0xIC8vIGhlYWQgb2Zmc2V0CglleHRyYWN0X3VpbnQxNiAvLyBleHRyYWN0IGR5bmFtaWMgYXJyYXkgb2Zmc2V0IG9mIGVsZW1lbnQKCWZyYW1lX2RpZyAtMyAvLyBvbGQgZWxlbWVudCBsZW5ndGgKCSsKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglsZW4KCXN1YnN0cmluZzMKCWNvbmNhdAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTIgLy8gbmV3IHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2YgbmV3IGVsZW1lbnQKCWZyYW1lX2RpZyAtMyAvLyBvbGQgZWxlbWVudCBsZW5ndGgKCTwKCWJueiBzd2FwcGVkX2RpZmZlcmVuY2UKCWZyYW1lX2RpZyAtMiAvLyBuZXcgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBuZXcgZWxlbWVudAoJZnJhbWVfZGlnIC0zIC8vIG9sZCBlbGVtZW50IGxlbmd0aAoJaW50IDEKCXN0b3JlIDcgLy8gc3VidHJhY3QgaGVhZCBkaWZmZXJlbmNlCgliIGdldF9kaWZmZXJlbmNlCgpzd2FwcGVkX2RpZmZlcmVuY2U6CglmcmFtZV9kaWcgLTMgLy8gb2xkIGVsZW1lbnQgbGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gbmV3IHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2YgbmV3IGVsZW1lbnQKCWludCAwCglzdG9yZSA3IC8vIHN1YnRyYWN0IGhlYWQgZGlmZmVyZW5jZQoKZ2V0X2RpZmZlcmVuY2U6CgktIC8vIGdldCBsZW5ndGggZGlmZmVyZW5jZQoJcmV0c3ViCgp1cGRhdGVfZHluYW1pY19oZWFkOgoJcHJvdG8gMiAwCglmcmFtZV9kaWcgLTIgLy8gbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gZHluYW1pYyBhcnJheSBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgZHluYW1pYyBhcnJheSBvZmZzZXQKCWxvYWQgNyAvLyBzdWJ0cmFjdCBoZWFkIGRpZmZlcmVuY2UKCWJ6IHN1YnRyYWN0X2hlYWRfZGlmZmVyZW5jZQoJKyAvLyBhZGQgZGlmZmVyZW5jZSB0byBvZmZzZXQKCWIgZW5kX2NhbGNfbmV3X2hlYWQKCnN1YnRyYWN0X2hlYWRfZGlmZmVyZW5jZToKCXN3YXAKCS0gLy8gc3VidHJhY3QgZGlmZmVyZW5jZSBmcm9tIG9mZmV0CgplbmRfY2FsY19uZXdfaGVhZDoKCWl0b2IgLy8gY29udmVydCB0byBieXRlcwoJZXh0cmFjdCA2IDIgLy8gY29udmVydCB0byB1aW50MTYKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglzd2FwCglmcmFtZV9kaWcgLTEgLy8gb2Zmc2V0Cglzd2FwCglyZXBsYWNlMyAvLyB1cGRhdGUgb2Zmc2V0CglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCXJldHN1YgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgY3JlYXRlCglpbnQgMQoJcmV0dXJuCgpjcmVhdGU6Cglwcm90byAwIDAKCXJldHN1YgoKYWJpX3JvdXRlX3NldE15Q29udGFjdDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJZXh0cmFjdCAyIDAKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIHNldE15Q29udGFjdAoJaW50IDEKCXJldHVybgoKc2V0TXlDb250YWN0OgoJcHJvdG8gMyAwCgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjE1CgkvLyBjb250YWN0OiBDb250YWN0ID0geyBuYW1lOiBuYW1lLCBjb21wYW55OiBjb21wYW55IH0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA0CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMiAvLyBjb21wYW55OiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0zIC8vIGNvbnRhY3Q6IENvbnRhY3QKCgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MTcKCS8vIHRoaXMubXlDb250YWN0LnB1dChjb250YWN0KQoJYnl0ZSAibXlDb250YWN0IgoJZnJhbWVfZGlnIC0zIC8vIGNvbnRhY3Q6IENvbnRhY3QKCWFwcF9nbG9iYWxfcHV0CgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjE4CgkvLyB0aGlzLmNvbnRhY3RzLnB1dCh0aGlzLnR4bi5zZW5kZXIsIGNvbnRhY3QpCgl0eG4gU2VuZGVyCglkdXAKCWJveF9kZWwKCXBvcAoJZnJhbWVfZGlnIC0zIC8vIGNvbnRhY3Q6IENvbnRhY3QKCWJveF9wdXQKCXJldHN1YgoKYWJpX3JvdXRlX2FkZENvbnRhY3Q6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCXR4bmEgQXBwbGljYXRpb25BcmdzIDMKCWJ0b2kKCXR4bmFzIEFjY291bnRzCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglleHRyYWN0IDIgMAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgYWRkQ29udGFjdAoJaW50IDEKCXJldHVybgoKYWRkQ29udGFjdDoKCXByb3RvIDQgMAoKCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czoyMgoJLy8gY29udGFjdDogQ29udGFjdCA9IHsgbmFtZTogbmFtZSwgY29tcGFueTogY29tcGFueSB9CglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAwNAoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWZyYW1lX2RpZyAtMSAvLyBuYW1lOiBieXRlcwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglmcmFtZV9kaWcgLTIgLy8gY29tcGFueTogYnl0ZXMKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtNCAvLyBjb250YWN0OiBDb250YWN0CgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjIzCgkvLyB0aGlzLmNvbnRhY3RzLnB1dChhZGRyZXNzLCBjb250YWN0KQoJZnJhbWVfZGlnIC0zIC8vIGFkZHJlc3M6IGFjY291bnQKCWR1cAoJYm94X2RlbAoJcG9wCglmcmFtZV9kaWcgLTQgLy8gY29udGFjdDogQ29udGFjdAoJYm94X3B1dAoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlQ29udGFjdEZpZWxkOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAzCglidG9pCgl0eG5hcyBBY2NvdW50cwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgoJZXh0cmFjdCAyIDAKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWV4dHJhY3QgMiAwCgljYWxsc3ViIHVwZGF0ZUNvbnRhY3RGaWVsZAoJaW50IDEKCXJldHVybgoKdXBkYXRlQ29udGFjdEZpZWxkOgoJcHJvdG8gMyAwCgoJLy8gaWYwX2NvbmRpdGlvbgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjI3CgkvLyBmaWVsZCA9PT0gJ25hbWUnCglmcmFtZV9kaWcgLTEgLy8gZmllbGQ6IGJ5dGVzCglieXRlICJuYW1lIgoJPT0KCWJ6IGlmMF9lbHNlaWYxX2NvbmRpdGlvbgoKCS8vIGlmMF9jb25zZXF1ZW50CgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MjgKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpLm5hbWUgPSB2YWx1ZQoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjEKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpCglmcmFtZV9kaWcgLTMgLy8gYWRkcmVzczogYWNjb3VudAoJYm94X2dldAoJYXNzZXJ0CglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDAKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglmcmFtZV9kaWcgLTIgLy8gdmFsdWU6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJaW50IDAKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDIKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2RpZyAtMyAvLyBhZGRyZXNzOiBhY2NvdW50CglkdXAKCWJveF9kZWwKCXBvcAoJc3dhcAoJYm94X3B1dAoJYiBpZjBfZW5kCgppZjBfZWxzZWlmMV9jb25kaXRpb246CgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MjkKCS8vIGZpZWxkID09PSAnY29tcGFueScKCWZyYW1lX2RpZyAtMSAvLyBmaWVsZDogYnl0ZXMKCWJ5dGUgImNvbXBhbnkiCgk9PQoJYnogaWYwX2Vsc2UKCgkvLyBpZjBfZWxzZWlmMV9jb25zZXF1ZW50CgkvLyBleGFtcGxlcy90dXBsZV9pbl9ib3gvYXBwLmFsZ28udHM6MzAKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpLmNvbXBhbnkgPSB2YWx1ZQoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjEKCS8vIHRoaXMuY29udGFjdHMuZ2V0KGFkZHJlc3MpCglmcmFtZV9kaWcgLTMgLy8gYWRkcmVzczogYWNjb3VudAoJYm94X2dldAoJYXNzZXJ0CglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglmcmFtZV9kaWcgLTIgLy8gdmFsdWU6IGJ5dGVzCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJaW50IDIKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2RpZyAtMyAvLyBhZGRyZXNzOiBhY2NvdW50CglkdXAKCWJveF9kZWwKCXBvcAoJc3dhcAoJYm94X3B1dAoJYiBpZjBfZW5kCgppZjBfZWxzZToKCS8vIGV4YW1wbGVzL3R1cGxlX2luX2JveC9hcHAuYWxnby50czozMQoJLy8gZXJyKCkKCWVycgoKaWYwX2VuZDoKCXJldHN1YgoKYWJpX3JvdXRlX3ZlcmlmeUNvbnRhY3ROYW1lOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCglidG9pCgl0eG5hcyBBY2NvdW50cwoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgdmVyaWZ5Q29udGFjdE5hbWUKCWludCAxCglyZXR1cm4KCnZlcmlmeUNvbnRhY3ROYW1lOgoJcHJvdG8gMiAwCgoJLy8gZXhhbXBsZXMvdHVwbGVfaW5fYm94L2FwcC5hbGdvLnRzOjM1CgkvLyBhc3NlcnQodGhpcy5jb250YWN0cy5nZXQoYWRkcmVzcykubmFtZSA9PT0gbmFtZSkKCWZyYW1lX2RpZyAtMiAvLyBhZGRyZXNzOiBhY2NvdW50Cglib3hfZ2V0Cglhc3NlcnQKCWZyYW1lX2RpZyAtMiAvLyBhZGRyZXNzOiBhY2NvdW50Cglib3hfZ2V0Cglhc3NlcnQKCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMAoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglleHRyYWN0IDIgMAoJZnJhbWVfZGlnIC0xIC8vIG5hbWU6IGJ5dGVzCgk9PQoJYXNzZXJ0CglyZXRzdWIKCm1haW46Cgl0eG4gTnVtQXBwQXJncwoJYm56IHJvdXRlX2FiaQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgk9PQoJYm56IGJhcmVfcm91dGVfY3JlYXRlCgpyb3V0ZV9hYmk6CgltZXRob2QgInNldE15Q29udGFjdChzdHJpbmcsc3RyaW5nKXZvaWQiCgltZXRob2QgImFkZENvbnRhY3Qoc3RyaW5nLHN0cmluZyxhY2NvdW50KXZvaWQiCgltZXRob2QgInVwZGF0ZUNvbnRhY3RGaWVsZChzdHJpbmcsc3RyaW5nLGFjY291bnQpdm9pZCIKCW1ldGhvZCAidmVyaWZ5Q29udGFjdE5hbWUoc3RyaW5nLGFjY291bnQpdm9pZCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoIGFiaV9yb3V0ZV9zZXRNeUNvbnRhY3QgYWJpX3JvdXRlX2FkZENvbnRhY3QgYWJpX3JvdXRlX3VwZGF0ZUNvbnRhY3RGaWVsZCBhYmlfcm91dGVfdmVyaWZ5Q29udGFjdE5hbWU="; override clearProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"; override methods: algosdk.ABIMethod[] = [ new algosdk.ABIMethod({ name: "setMyContact", desc: "", args: [{ type: "string", name: "name", desc: "" }, { type: "string", name: "company", desc: "" }], returns: { type: "void", desc: "" } }), diff --git a/package.json b/package.json index dca7a3936..c460bf796 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@algorandfoundation/tealscript", - "version": "0.10.2", + "version": "0.11.0", "description": "Enables Algorand smart contract development with native TypeScript syntax, tooling, and IDE support", "homepage": "https://github.com/algorand-devrel/TEALScript", "bugs": { diff --git a/pages/abi.md b/pages/abi.md index 84de50117..e12f1706b 100644 --- a/pages/abi.md +++ b/pages/abi.md @@ -31,7 +31,7 @@ const staticUint8Array: uint8<3> = [1, 2, 3] ## Tuples -Tuples are arrays with multiple types. They can contain both static and dynamic types, but dynamic types MUST come at the end of the tuple. TEALScript does not support nested tuples. +Tuples are arrays with multiple types. TEALScript does not support nested dynamic tuples (yet). ### Example @@ -41,7 +41,7 @@ const tuple: [uint8, uint64<3>, string] = [1, [2, 3, 4], 'Hello World!'] ## Objects -Objects are essentially tuples, but they are accessed via keys rather than numbers. This means they must follow the same rules as tuples: limited to 32 dynamic types, static types must come first (in type definition, assignment can occur in any order). +Objects are essentially tuples, but they are accessed via keys rather than numbers. ### Example diff --git a/src/lib/compiler.ts b/src/lib/compiler.ts index c4056825b..235e82748 100644 --- a/src/lib/compiler.ts +++ b/src/lib/compiler.ts @@ -1,7 +1,7 @@ /* eslint-disable no-unused-vars */ import fetch from 'node-fetch'; import * as vlq from 'vlq'; -import ts, { getEffectiveTypeParameterDeclarations } from 'typescript'; +import ts from 'typescript'; import * as langspec from '../langspec.json'; function stringToExpression(str: string): ts.Expression { @@ -168,18 +168,12 @@ function isRefType(t: string): boolean { } const scratch = { - fullTuple: '0 // full tuple', - arrayOffset: '1 // array offset', - fullArrayLength: '2 // full array length', - staticPartOfTuple: '3 // static part of tuple', - dynamicHeads: '4 // dynamic heads', - valuesAfterArray: '5 // values after array', - newArray: '6 // new array', - valuesBeforeArray: '7 // values before array', - dynamicHead: '8 // dynamic head', - dynamicHeadOffset: '9 // dynamic head offset', - dynamicElements: '10 // dynamic elements', - staticElements: '11 // static elements', + tupleHead: '0 // tuple head', + tupleTail: '1 // tuple tail', + headOffset: '2 // head offset', + fullTuple: '3 // full tuple', + oldTupleElement: '4 // old tuple element', + subtractHeadDifference: '7 // subtract head difference', spliceStart: '12 // splice start', spliceByteLength: '13 // splice byte length', }; @@ -1165,191 +1159,60 @@ export default class Compiler { lines.forEach((l) => this.push(l, 'void')); } - private getTypes(typeString: string): {static: string[], dynamic: string[]} { - const abiType = this.getABIType(typeString); - const typeNode = stringToExpression(abiType); - const staticLengthRegex = /(\[\d+\])+$/; - const types: {static: string[], dynamic: string[]} = { static: [], dynamic: [] }; + private getArrayTypes(elements: number): string[] { + if (this.typeHint === undefined) throw new Error('Type hint is undefined'); + const typeHintNode = stringToExpression(this.getABIType(this.typeHint)); - if (abiType === 'string') { - types.dynamic.push('string'); - } else if (abiType.match(staticLengthRegex)) { - const baseType = abiType.replace(staticLengthRegex, ''); + if (ts.isElementAccessExpression(typeHintNode)) { + const length = parseInt(typeHintNode.argumentExpression.getText(), 10); + const type = typeHintNode.expression.getText().replace(/\[\]$/, ''); - let count: number = 1; - abiType.match(staticLengthRegex)![0].match(/\d+/g)!.forEach((n) => { - count *= parseInt(n, 10); - }); - - types.static.push(...Array(count).fill(this.getTypes(baseType).static)); - } else if (ts.isTupleTypeNode(typeNode) || ts.isArrayLiteralExpression(typeNode)) { - typeNode.elements.forEach((e) => { - const innerTypes = this.getTypes(e.getText()); - types.static.push(...innerTypes.static); - types.dynamic.push(...innerTypes.dynamic); - }); - } else if (ts.isIdentifier(typeNode)) { - types.static.push(typeNode.getText()); - } else if (ts.isElementAccessExpression(typeNode)) { - const dynamicArrayRegex = /\[\]$/; - const baseType = typeString.replace(dynamicArrayRegex, ''); - if (baseType.match(dynamicArrayRegex)) throw new Error('Nested dynamic types not supported'); - types.dynamic.push(baseType); - } else throw new Error(`${ts.SyntaxKind[typeNode.kind]} ${typeNode.getText()}`); - - return { static: types.static.flat(), dynamic: types.dynamic }; - } - - private getArrayNodes(node: ts.ArrayLiteralExpression): ts.Node[] { - const nodes: ts.Node[] = []; + if (length && length !== elements) throw new Error(`Array length mismatch: ${length} !== ${elements}`); - node.elements.forEach((e) => { - if (ts.isArrayLiteralExpression(e)) { - nodes.push(...this.getArrayNodes(e)); - } else { - nodes.push(e); - } - }); - - return nodes.flat(); - } - - private processStaticArrayElement( - e: ts.Node, - type: string, - isLast: boolean, - context: {bytesOnStack: boolean, hexString: string}, - ) { - const length = this.getTypeLength(type); - - if (ts.isNumericLiteral(e)) { - context.hexString += parseInt(e.getText(), 10).toString(16).padStart(length * 2, '0'); - - if (isLast) { - this.pushVoid(`byte 0x${context.hexString}`); - if (context.bytesOnStack) this.pushVoid('concat'); - } - - return; + return new Array(elements).fill(type); } - if (context.hexString.length > 0) { - this.pushVoid(`byte 0x${context.hexString}`); - if (context.bytesOnStack) this.pushVoid('concat'); - context.bytesOnStack = true; - - context.hexString = ''; + if (ts.isArrayLiteralExpression(typeHintNode)) { + return typeHintNode.elements.map((e) => this.getABIType(e.getText())); } - this.processNode(e); - if (isNumeric(this.lastType)) this.pushVoid('itob'); - - if (this.lastType.match(/uint\d+$/) && this.lastType !== type) { - this.fixBitWidth(parseInt(type.match(/\d+/)![0], 10), !ts.isNumericLiteral(e)); + if (ts.isIdentifier(typeHintNode)) { + return new Array(elements).fill(this.typeHint); } - if (context.bytesOnStack) this.pushVoid('concat'); - - context.bytesOnStack = true; + throw new Error(typeHintNode.getText()); } - private processArrayLiteralExpression(node: ts.ArrayLiteralExpression) { - const types = this.getTypes(this.typeHint!); - const nodes = this.getArrayNodes(node); - - const context = { bytesOnStack: false, hexString: '' }; - if (types.static.length === 0 && types.dynamic.length === 1) { - const baseType = types.dynamic[0]; - - if (baseType.startsWith('[')) { - const innerTypes = this.getTypes(baseType).static; - context.hexString = (nodes.length / innerTypes.length).toString(16).padStart(4, '0'); - - nodes.forEach((e, i) => { - this.processStaticArrayElement( - e, - innerTypes[i % innerTypes.length], - i === nodes.length - 1, - context, - ); - }); - } else { - context.hexString = (nodes.length).toString(16).padStart(4, '0'); + private processTuple(node: ts.ArrayLiteralExpression) { + if (this.typeHint === undefined) throw new Error('Type hint is undefined'); + let { typeHint } = this; - nodes.forEach((e, i) => { - this.processStaticArrayElement(e, baseType, i === nodes.length - 1, context); - }); - } + if (!this.getABIType(typeHint).includes(']')) typeHint = `${typeHint}[]`; - this.lastType = this.getABIType(this.typeHint!); - return; - } + const types = this.getArrayTypes(node.elements.length); + const headLength = types.reduce((sum, t) => { + const length = this.isDynamicType(t) ? 2 : this.getTypeLength(t); + return sum + length; + }, 0); - // Process static elements - // TODO: Throw error if size is wrong - nodes.slice(0, types.static.length).forEach((e, i) => { - this.processStaticArrayElement( - e, - types.static[i], - i === types.static.length - 1, - context, - ); - }); - - if (types.dynamic.length === 0) { - this.lastType = this.getABIType(this.typeHint!); - return; - } - - // Process dynamic elements - // TODO: Optimize this when there are literal dynamic elements - const staticLen = types.static.map((m) => this.getTypeLength(m)).reduce((a, b) => a + b, 0); - - if (staticLen === 0) this.pushVoid('byte 0x // no static elements'); - - const headEnd = staticLen + (2 * types.dynamic.length); this.pushLines( - `store ${scratch.staticElements}`, - `byte 0x${headEnd.toString(16).padStart(4, '0')} // head end`, - `store ${scratch.dynamicHead}`, - `int ${headEnd}`, - `store ${scratch.dynamicHeadOffset}`, 'byte 0x', - `store ${scratch.dynamicElements}`, + 'dup', + `store ${scratch.tupleHead}`, + `store ${scratch.tupleTail}`, + `byte 0x${headLength.toString(16).padStart(4, '0')}`, + `store ${scratch.headOffset}`, ); - node.elements.slice(-types.dynamic.length).forEach((e, i) => { - if (ts.isArrayLiteralExpression(e)) { - const baseType = types.dynamic[i]; - const innerTypes = this.getTypes(baseType); - const innerNodes = this.getArrayNodes(e); - - innerNodes.forEach((n, j) => { - const type = innerTypes.static[j % innerTypes.static.length]; - - this.processNode(n); - if (isNumeric(this.lastType)) this.pushVoid('itob'); - - if (this.lastType.match(/uint\d+$/) && this.lastType !== type) { - this.fixBitWidth(parseInt(type.match(/\d+/)![0], 10), !ts.isNumericLiteral(n)); - } + node.elements.forEach((e, i) => { + this.typeHint = types[i]; + this.pushLines(`load ${scratch.tupleHead}`); - if (j) this.pushVoid('concat'); - }); + if (this.isDynamicType(types[i])) { + this.pushLines(`load ${scratch.headOffset}`, 'concat', `store ${scratch.tupleHead}`); + this.processNode(e); - this.pushLines( - `byte 0x${e.elements.length.toString(16).padStart(4, '0')}`, - 'swap', - 'concat', - ); - } else if (types.dynamic[i] === 'string') { - if (ts.isStringLiteral(e)) { - const len = e.text.length.toString(16).padStart(4, '0'); - const val = Buffer.from(e.text, 'utf-8').toString('hex'); - this.push(`byte 0x${len}${val} // ${e.text}`, 'string'); - } else this.processNode(e); - - if (this.lastType === StackType.bytes) { + if (types[i] === 'bytes' || types[i] === 'string') { this.pushLines( 'dup', 'len', @@ -1358,48 +1221,59 @@ export default class Compiler { 'swap', 'concat', ); - this.lastType = 'string'; } - } else { - this.processNode(e); - const expectedType = `${types.dynamic[i]}[]`; - if (expectedType !== this.lastType) throw new Error(`Expected type of ${expectedType}, but got ${this.lastType}`); - } - // update head if not last element - if (i !== types.dynamic.length - 1) { this.pushLines( 'dup', 'len', - `load ${scratch.dynamicHeadOffset}`, + `load ${scratch.headOffset}`, + 'btoi', '+', - 'dup', - `store ${scratch.dynamicHeadOffset}`, 'itob', 'extract 6 2', - `load ${scratch.dynamicHead}`, + `store ${scratch.headOffset}`, + `load ${scratch.tupleTail}`, 'swap', 'concat', - `store ${scratch.dynamicHead}`, + `store ${scratch.tupleTail}`, ); + } else { + this.processNode(e); + + if (isNumeric(this.lastType)) this.pushVoid('itob'); + if (this.lastType.match(/uint\d+$/) && this.lastType !== types[i]) this.fixBitWidth(parseInt(types[i].match(/\d+$/)![0], 10), !ts.isNumericLiteral(e)); + this.pushLines('concat', `store ${scratch.tupleHead}`); } + }); - this.pushLines( - `load ${scratch.dynamicElements}`, - 'swap', - 'concat', - `store ${scratch.dynamicElements}`, - ); + this.pushLines(`load ${scratch.tupleHead}`, `load ${scratch.tupleTail}`, 'concat'); + } + + private processArrayLiteralExpression(node: ts.ArrayLiteralExpression) { + if (this.typeHint === undefined) throw new Error('Type hint is undefined'); + let { typeHint } = this; + + if (typeHint.startsWith('[') && !typeHint.match(/\[\d*\]$/)) { + this.processTuple(node); + this.lastType = this.getABIType(typeHint); + return; + } + + if (!this.getABIType(typeHint).includes(']')) typeHint = `${typeHint}[]`; + + const types = this.getArrayTypes(node.elements.length); + node.elements.forEach((e, i) => { + this.typeHint = types[i]; + this.processNode(e); + if (isNumeric(this.lastType)) this.pushVoid('itob'); + if (this.lastType.match(/uint\d+$/) && this.lastType !== types[i]) this.fixBitWidth(parseInt(types[i].match(/\d+$/)![0], 10), !ts.isNumericLiteral(e)); + if (i) this.pushVoid('concat'); }); - this.pushLines( - `load ${scratch.staticElements}`, - `load ${scratch.dynamicHead}`, - `load ${scratch.dynamicElements}`, - 'concat', - 'concat', - ); - this.lastType = this.getABIType(this.typeHint!); + if (this.getABIType(typeHint).endsWith('[]')) { + this.pushLines(`byte 0x${node.elements.length.toString(16).padStart(4, '0')}`, 'swap', 'concat'); + } + this.lastType = this.getABIType(typeHint); } private getAccessChain( @@ -1440,320 +1314,270 @@ export default class Compiler { } private compilerSubroutines: {[name: string]: () => string[]} = { - updateDynamicElement: () => { - const frame = { - newArray: '-8 // newArray', // already on stack - startOfHeads: '-2 // startOfHeads', // startOfHeads - totalHeadLength: '-3 // totalHeadLength', // types.dynamic.length * 2; - lastDynamicElement: '-4 // lastDynamicElement', // dynamicTypeIndex === types.dynamic.length - 1 - firstDynamicElement: '-5 // firstDynamicElement', // dynamicTypeIndex === 0 - headUpdateBitmask: '-6 // headUpdateBitmask', // `byte 0x${'0000'.repeat(types.dynamic.slice(0, dynamicTypeIndex + 1).length) + 'FFFF'.repeat(types.dynamic.slice(dynamicTypeIndex + 1).length)}`, - fullHeadBitmask: '-7 // fullHeadBitmask', // `byte 0x${'FFFF'.repeat(types.dynamic.length)}`, - headEnd: '-1 // headEnd', // startOfHeads + totalHeadLength - }; - - const subTeal = [ - 'updateDynamicElement:', - 'proto 8 1', - `frame_dig ${frame.newArray}`, - ]; - - subTeal.push( - `store ${scratch.newArray}`, - // get static part of tuple - `load ${scratch.fullTuple}`, - 'int 0', - `frame_dig ${frame.startOfHeads}`, - 'extract3', - `store ${scratch.staticPartOfTuple}`, - // get dynamic heads - `load ${scratch.fullTuple}`, - `frame_dig ${frame.startOfHeads}`, - `frame_dig ${frame.totalHeadLength}`, - 'extract3 ', - `store ${scratch.dynamicHeads}`, - 'byte 0x', - 'dup', - `store ${scratch.valuesAfterArray}`, - `store ${scratch.valuesBeforeArray}`, - - // Get values AFTER the updated array - `frame_dig ${frame.lastDynamicElement}`, - 'bnz skip_values_after_array', - `load ${scratch.fullTuple}`, - `load ${scratch.arrayOffset}`, - `load ${scratch.fullArrayLength}`, - '+', - `load ${scratch.fullTuple}`, - 'len', - 'substring3', - `store ${scratch.valuesAfterArray}`, - 'skip_values_after_array:', - // Get values BEFORE the updated array - `frame_dig ${frame.firstDynamicElement}`, - 'bnz skip_values_before_array', - `load ${scratch.fullTuple}`, - `frame_dig ${frame.headEnd}`, - `load ${scratch.arrayOffset}`, - 'substring3', - `store ${scratch.valuesBeforeArray}`, - 'skip_values_before_array:', - - // Update dynamic heads - `load ${scratch.dynamicHeads}`, - `frame_dig ${frame.headUpdateBitmask}`, - - `load ${scratch.newArray}`, - 'len', - `load ${scratch.fullArrayLength}`, - `load ${scratch.newArray}`, - 'len', - `load ${scratch.fullArrayLength}`, - '>=', - 'bnz skip_len_swap', - 'swap', - 'skip_len_swap:', - '-', - - 'itob', - 'extract 6 2', - 'dup', - 'concat', // 4 - 'dup', - 'concat', // 8 - 'dup', - 'concat', // 16 - 'dup', - 'concat', // 32 - 'dup', - 'concat', // 64 - 'b&', - - `load ${scratch.newArray}`, - 'len', - `load ${scratch.fullArrayLength}`, - '>=', // if this is true, subtract - 'bnz add_head', - 'b-', - 'b sub_or_add_head_end', - 'add_head:', - 'b+', - 'sub_or_add_head_end:', - - `frame_dig ${frame.fullHeadBitmask}`, - 'b&', - `store ${scratch.dynamicHeads}`, - // form new array - `load ${scratch.staticPartOfTuple}`, - `load ${scratch.dynamicHeads}`, - `load ${scratch.valuesBeforeArray}`, - `load ${scratch.newArray}`, - `load ${scratch.valuesAfterArray}`, - 'concat', - 'concat', - 'concat', - 'concat', - 'retsub', - ); - return subTeal; - }, - preArrayAccess: () => { - const frame = { - headOffset: '-1 // head offset', - typeLength: '-2 // type length', - fullTuple: '-3 // full tuple', - }; + // -2: length difference + // -1: offset + update_dynamic_head: () => [ + 'update_dynamic_head:', + 'proto 2 0', + 'frame_dig -2 // length difference', + `load ${scratch.fullTuple}`, + 'frame_dig -1 // dynamic array offset', + 'extract_uint16 // extract dynamic array offset', + + `load ${scratch.subtractHeadDifference}`, + 'bz subtract_head_difference', + '+ // add difference to offset', + 'b end_calc_new_head', + + 'subtract_head_difference:', + 'swap', + '- // subtract difference from offet', + + 'end_calc_new_head:', + + 'itob // convert to bytes', + 'extract 6 2 // convert to uint16', + `load ${scratch.fullTuple}`, + 'swap', + 'frame_dig -1 // offset', + 'swap', + 'replace3 // update offset', + `store ${scratch.fullTuple}`, + 'retsub', + ], + + // -3: oldElementLength + // -2: newTupleElement + // -1: headOffset + update_dynamic_tuple_element: () => [ + 'update_dynamic_tuple_element:', + 'proto 3 1', + // Update tail + // Before element + `load ${scratch.fullTuple}`, + `load ${scratch.fullTuple}`, + 'frame_dig -1 // head offset', + 'extract_uint16 // extract dynamic array offset of element', + 'int 0', + 'swap', + 'extract3 // extract portion of tuple before element', + + // New element + 'frame_dig -2 // new tuple element', + 'concat', - return [ - 'preArrayAccess:', - 'proto 3 0', - `frame_dig ${frame.fullTuple}`, - `store ${scratch.fullTuple}`, - `load ${scratch.fullTuple}`, - `frame_dig ${frame.headOffset}`, - 'extract_uint16 // extract array offset', - `store ${scratch.arrayOffset}`, - `load ${scratch.fullTuple}`, - `load ${scratch.arrayOffset}`, - 'extract_uint16 // extract array length', - `frame_dig ${frame.typeLength}`, - '* // array size', - 'int 2', - '+ // array size + len', - `store ${scratch.fullArrayLength}`, - 'retsub', - ]; - }, + // After element + `load ${scratch.fullTuple}`, + `load ${scratch.fullTuple}`, + 'frame_dig -1 // head offset', + 'extract_uint16 // extract dynamic array offset of element', + 'frame_dig -3 // old element length', + '+', + `load ${scratch.fullTuple}`, + 'len', + 'substring3', + 'concat', + `store ${scratch.fullTuple}`, + + /* Update heads */ + + // Get new element length + 'frame_dig -2 // new tuple element', + 'len // length of new element', + 'frame_dig -3 // old element length', + '<', + + 'bnz swapped_difference', + 'frame_dig -2 // new tuple element', + 'len // length of new element', + 'frame_dig -3 // old element length', + 'int 1', + `store ${scratch.subtractHeadDifference}`, + 'b get_difference', + + 'swapped_difference:', + 'frame_dig -3 // old element length', + 'frame_dig -2 // new tuple element', + 'len // length of new element', + 'int 0', + `store ${scratch.subtractHeadDifference}`, + + 'get_difference:', + '- // get length difference', + 'retsub', + ], }; - private processStaticArray(node: ts.ElementAccessExpression, newValue?: ts.Node): void { - const chain = this.getAccessChain(node).reverse(); + private updateDynamicTupleElement( + elementType: string, + newValue: ts.Node, + dynamicHeads: {index: number, offset: number}[], + accessor: number, + ) { + // Get old element + this.extractDynamicTupleElement(elementType); + this.pushLines(`store ${scratch.oldTupleElement}`); - let offset = 0; - let type: string = ''; - let intsOnStack = false; + // Get old element length + this.pushLines( + `load ${scratch.oldTupleElement}`, + 'len // length of old element', + ); - this.processNode(chain[0].expression); - if (this.customTypes[this.lastType]) { - this.lastType = this.customTypes[this.lastType]; + // Get new element + this.processNode(newValue); + if (isNumeric(this.lastType)) this.pushVoid('itob'); + if (['bytes', 'string'].includes(this.lastType)) { + this.pushLines('dup', 'len', 'itob', 'extract 6 2', 'swap', 'concat'); } - let staticArrayType = ''; - - if (this.lastType.match(/\[\d+\]$/)) { - const baseType = this.lastType.replace(/\[\d+\]$/, ''); - if (this.isDynamicType(baseType)) { - const length = parseInt(this.lastType.match(/\[\d+\]/)!.at(-1)!.match(/\d+/)![0], 10); + const headOffset = dynamicHeads.find((dh) => dh.index === accessor)!.offset; - // TODO figure out where string is getting converted to bytes - this.lastType = `[${new Array(length).fill(baseType).join(',')}]`.replace(/bytes/g, 'string'); - staticArrayType = baseType.replace(/bytes/g, 'string'); - } - } + this.pushLines(`int ${headOffset}`, 'callsub update_dynamic_tuple_element'); - const lastTypeExpression = stringToExpression(this.lastType); + dynamicHeads.forEach(({ index, offset }) => { + if (index <= accessor) return; - if (ts.isArrayLiteralExpression(lastTypeExpression)) { - const isLiteralAccessor = ts.isNumericLiteral(chain[0].argumentExpression); - const accessor = parseInt(chain[0].argumentExpression.getText(), 10); + this.pushLines('dup // dup length difference', `int ${offset}`, 'callsub update_dynamic_head'); + }); - const accessedType = isLiteralAccessor - ? lastTypeExpression.elements[accessor].getText() : staticArrayType; + this.pushVoid('pop // pop length difference'); - if (accessedType.endsWith('[]') || accessedType === 'string') { - const types = this.getTypes(this.lastType); + this.pushVoid(`load ${scratch.fullTuple}`); + } - const numStaticElements = lastTypeExpression.elements.length - types.dynamic.length; - const dynamicTypeIndex = accessor - numStaticElements; + private extractDynamicTupleElementOffset() { + this.pushLines( + 'swap', + 'dupn 2', + 'uncover 3', + 'int 2', + 'extract3', + 'btoi // start of dynamic array', + ); + } - let headOffset = 0; - headOffset += types.static.reduce((a, b) => a + this.getTypeLength(b), 0); + private extractDynamicTupleElement(elementType: string) { + this.pushLines( + 'dup', + 'cover 2 // duplicate start for later', + 'int 2', + 'extract3 // extract length of array', + 'btoi', + `int ${this.getTypeLength(elementType.replace(/\[\d*\]$/, ''))}`, + '* // get array length', + 'int 2', + '+ // add two for length', + 'extract3', + ); + } - const startOfHeads = headOffset; + private getDynamicHeads(node: ts.ArrayLiteralExpression): {index: number, offset: number}[] { + const dynamicHeads: {index: number, offset: number}[] = []; + let offset = 0; - headOffset += (dynamicTypeIndex) * 2; + node.elements.forEach((typeNode, index) => { + const type = typeNode.getText(); + if (this.isDynamicType(type)) dynamicHeads.push({ index, offset }); + offset += this.isDynamicType(type) ? 2 : this.getTypeLength(type); + }); - this.pushVoid(`int ${this.getTypeLength(accessedType.replace(/\[\]$/, ''))} // type length`); + return dynamicHeads; + } - if (isLiteralAccessor) { - this.pushVoid(`int ${headOffset} // head offset`); - } else { - this.processNode(chain[0].argumentExpression); - this.pushLines('int 2', '* // head offset'); - } + private processArrayAccess(node: ts.ElementAccessExpression, newValue?: ts.Node): void { + const chain = this.getAccessChain(node).reverse(); + this.processNode(chain[0].expression); + let parentType = this.getABIType(this.lastType); + let isStaticArrayOfDynamicType = false; - this.pushVoid('callsub preArrayAccess'); + if (parentType.match(/\[\d+\]$/)) { + const baseType = parentType.replace(/\[\d+\]$/, ''); + const length = parseInt(parentType.match(/\d+/)!.at(-1)!, 10); + if (this.isDynamicType(baseType)) { + parentType = `[${new Array(length).fill(baseType).join(',')}]`; + isStaticArrayOfDynamicType = true; + } + } - if (newValue === undefined) { - this.pushLines( - `load ${scratch.fullTuple}`, - `load ${scratch.arrayOffset}`, - `load ${scratch.fullArrayLength}`, - 'extract3', - ); + if (parentType.startsWith('[') || parentType.startsWith('{')) this.pushLines('dup', `store ${scratch.fullTuple}`); - if (accessedType === 'string') { - this.push('extract 2 0 // extract bytes from string', 'bytes'); - } else this.lastType = accessedType; - } else { - if (ts.isStringLiteral(newValue)) { - const len = newValue.text.length.toString(16).padStart(4, '0'); - const val = Buffer.from(newValue.text, 'utf-8').toString('hex'); - this.push(`byte 0x${len}${val} // ${newValue.text}`, 'string'); - } else this.processNode(newValue); - - if (this.lastType === StackType.bytes) { - this.pushLines( - 'dup', - 'len', - 'itob', - 'extract 6 2', - 'swap', - 'concat', - ); - } + let elementType: string = ''; + let elementLength: number = 0; + let dynamicHeads: {index: number, offset: number}[] = []; + let accessor = 0; - const totalHeadLength = types.dynamic.length * 2; - this.pushLines( - `byte 0x${'FFFF'.repeat(types.dynamic.length)}`, - `byte 0x${'0000'.repeat(types.dynamic.slice(0, dynamicTypeIndex + 1).length) + 'FFFF'.repeat(types.dynamic.slice(dynamicTypeIndex + 1).length)} // head update bitmask`, - `int ${(!isLiteralAccessor || dynamicTypeIndex === 0) ? 1 : 0} // is first dynamic element`, - `int ${(!isLiteralAccessor || dynamicTypeIndex === types.dynamic.length - 1) ? 1 : 0} // is last dynamic element`, - `int ${totalHeadLength} // total head length`, - `int ${startOfHeads} // startOfHeads`, - `int ${startOfHeads + totalHeadLength} // head end`, - 'callsub updateDynamicElement', - ); + chain.forEach((e, i) => { + const previouslyAccessedType = i === 0 ? parentType : this.getABIType(this.lastType); - this.updateValue(chain[0].expression); - } + const isStatic = previouslyAccessedType.match(/\[\d+\]$/); + const isTuple = previouslyAccessedType.startsWith('[') || previouslyAccessedType.startsWith('{'); + const isDynamicArray = previouslyAccessedType.endsWith('[]'); - return; - } - } + if (isStatic || isDynamicArray) { + elementType = previouslyAccessedType.replace(/\[\d*\]$/, ''); - chain.forEach((e) => { - let baseExpressionType = this.getStackTypeFromNode(e.expression); - baseExpressionType = this.getABIType(baseExpressionType); + elementLength = this.getTypeLength(elementType); + this.processNode(e.argumentExpression!); - if (baseExpressionType.match(/^{/)) { - const types = Object.values(this.getObjectTypes(baseExpressionType)); - baseExpressionType = `[${types.join(',')}]`; - } + this.pushVoid(`int ${elementLength} // element length`); + this.pushLines('* // element offset'); + if (isDynamicArray) this.pushLines('int 2', '+ // add two for length'); + } else if (isStaticArrayOfDynamicType) { + elementType = this.lastType.replace(/\[\d+\]$/, ''); - if (baseExpressionType.match(/\[\d+\]$/)) { - type = baseExpressionType.replace(/\[\d+\]$/, ''); + this.processNode(e.argumentExpression); + this.pushLines( + 'int 2', + '*', + ); + } else if (isTuple) { + const expr = stringToExpression(previouslyAccessedType); + if (!ts.isArrayLiteralExpression(expr)) throw new Error(); - if (ts.isNumericLiteral(e.argumentExpression)) { - offset += this.getTypeLength(type) * parseInt(e.argumentExpression.getText(), 10); - } else { - this.processNode(e.argumentExpression); + if (!ts.isNumericLiteral(e.argumentExpression!)) throw new Error('Tuple must be accessed by numeric literal'); - if (intsOnStack) { - this.pushVoid('+'); - intsOnStack = false; - } + dynamicHeads = this.getDynamicHeads(expr); - this.pushLines(`int ${this.getTypeLength(type)}`, '*'); - intsOnStack = true; - } - } else if (baseExpressionType.match(/\[\]$/)) { - type = baseExpressionType.replace(/\[\]$/, ''); + accessor = parseInt(e.argumentExpression.getText(), 10); - this.processNode(e.argumentExpression); + const tupleTypes = expr.elements.map((t) => t.getText()); + elementType = tupleTypes[accessor]; - this.pushLines(`int ${this.getTypeLength(type)}`, '*', 'int 2', '+'); + const priorTypeLength = expr.elements.slice(0, accessor) + .map((t) => (this.isDynamicType(t.getText()) ? 2 : this.getTypeLength(t.getText()))) + .reduce((sum, n) => sum + n, 0); - intsOnStack = true; - } else if (baseExpressionType.startsWith('[')) { - const typeExpression = stringToExpression(baseExpressionType); - if (!ts.isArrayLiteralExpression(typeExpression)) throw new Error(); + this.pushLines(`int ${priorTypeLength}`); + } else throw new Error(this.lastType); - const innerTypes = typeExpression.elements.map((t) => t.getText()); - const accessor = parseInt(e.argumentExpression.getText(), 10); + this.lastType = elementType; - innerTypes.forEach((t, i) => { - if (i < accessor) { - offset += this.getTypeLength(this.getABIType(t)); - } else if (i === accessor) type = this.getABIType(t); - }); - } else throw new Error(`${e.getText()} ${baseExpressionType}`); + if (this.isDynamicType(elementType)) this.extractDynamicTupleElementOffset(); + if (i) this.pushVoid('+'); }); - if (offset || !intsOnStack) this.pushLines(`int ${offset} // offset`); - if (intsOnStack && offset) this.pushVoid('+'); + if (newValue) { + if (this.isDynamicType(elementType)) { + this.updateDynamicTupleElement(elementType, newValue, dynamicHeads, accessor); + } else { + this.processNode(newValue); + if (isNumeric(this.lastType)) this.pushVoid('itob'); + this.pushVoid('replace3'); + } - if (newValue === undefined) { - this.pushVoid(`int ${this.getTypeLength(type)}`); - this.push('extract3', type); - if (isNumeric(type)) this.push('btoi', type); + this.updateValue(chain[0].expression); } else { - this.processNode(newValue); - if (isNumeric(this.lastType)) this.pushVoid('itob'); - this.pushVoid('replace3'); + if (this.isDynamicType(elementType)) { + this.extractDynamicTupleElement(elementType); + } else { + this.pushLines(`int ${this.getTypeLength(elementType)}`, 'extract3'); + } - this.updateValue(chain[0].expression); + if (isNumeric(elementType)) this.pushVoid('btoi'); + if (['string', 'bytes'].includes(elementType)) this.pushVoid('extract 2 0'); + this.lastType = elementType.replace('string', 'bytes'); } } @@ -1772,7 +1596,7 @@ export default class Compiler { return; } - this.processStaticArray(node); + this.processArrayAccess(node); } private processMethodDefinition(node: ts.MethodDeclaration) { @@ -1941,7 +1765,7 @@ export default class Compiler { this.processNode(node.right); this.pushVoid(`frame_bury ${target.index} // ${name}: ${target.type}`); } else if (ts.isElementAccessExpression(node.left)) { - this.processStaticArray(node.left, node.right); + this.processArrayAccess(node.left, node.right); } else if (ts.isPropertyAccessExpression(node.left)) { const expressionType = this.getStackTypeFromNode(node.left.expression); @@ -1951,7 +1775,7 @@ export default class Compiler { const expr = stringToExpression(`${node.left.expression.getText()}[${index}]`); if (!ts.isElementAccessExpression(expr)) throw new Error(); - this.processStaticArray(expr, node.right); + this.processArrayAccess(expr, node.right); return; } } @@ -2928,7 +2752,7 @@ export default class Compiler { const json = await response.json(); if (response.status !== 200) { - // console.log(this.approvalProgram().split('\n').map((l, i) => `${i + 1}: ${l}`).join('\n')); + console.log(this.approvalProgram().split('\n').map((l, i) => `${i + 1}: ${l}`).join('\n')); throw new Error(`${response.statusText}: ${json.message}`); } diff --git a/tests/abi.test.ts b/tests/abi.test.ts index e726b7421..03fd3feb6 100644 --- a/tests/abi.test.ts +++ b/tests/abi.test.ts @@ -8,12 +8,13 @@ import { artifactsTest } from './common'; let appClient: AbiTest; -// eslint-disable-next-line no-unused-vars -async function dryrun(methodName: string) { +// eslint-disable-next-line no-unused-vars, @typescript-eslint/no-explicit-any +async function dryrun(methodName: string, methodArgs: any = []) { const atc = new algosdk.AtomicTransactionComposer(); atc.addMethodCall({ appID: appClient.appId, method: algosdk.getMethodByName(appClient.methods, methodName), + methodArgs, sender: appClient.sender, signer: appClient.signer, suggestedParams: await appClient.getSuggestedParams(), @@ -162,6 +163,7 @@ describe('ABI', function () { expect(ret.returnValue).to.equal(BigInt(44)); }); + // eslint-disable-next-line mocha/no-skipped-tests it('tupleInTuple', async function () { const ret = await appClient.tupleInTuple(); expect(ret.returnValue).to.equal(BigInt(66)); @@ -172,6 +174,7 @@ describe('ABI', function () { expect(ret.returnValue).to.equal(BigInt(66)); }); + // eslint-disable-next-line mocha/no-skipped-tests it('disgusting', async function () { const ret = await appClient.disgusting(); expect(ret.returnValue).to.equal(BigInt(8888)); @@ -388,4 +391,40 @@ describe('ABI', function () { const ret = await appClient.dynamicAccessOfDynamicElementInStaticArray({ a: ['Hello', 'World', '!'] }); expect(ret.returnValue).to.deep.equal('World'); }); + + it('dynamicArrayInMiddleOfTuple', async function () { + const ret = await appClient.dynamicArrayInMiddleOfTuple(); + expect(ret.returnValue).to.deep.equal( + [ + BigInt(1), + [BigInt(2)], + BigInt(3), + ], + ); + }); + + it('accessDynamicArrayInMiddleOfTuple', async function () { + const ret = await appClient.accessDynamicArrayInMiddleOfTuple(); + expect(ret.returnValue).to.deep.equal( + [BigInt(2)], + ); + }); + + it('accessDynamicArrayElementInTuple', async function () { + const ret = await appClient.accessDynamicArrayElementInTuple(); + expect(ret.returnValue).to.deep.equal( + BigInt(33), + ); + }); + + it('updateDynamicArrayInMiddleOfTuple', async function () { + const ret = await appClient.updateDynamicArrayInMiddleOfTuple(); + expect(ret.returnValue).to.deep.equal( + [ + BigInt(1), + [BigInt(4), BigInt(5)], + BigInt(3), + ], + ); + }); }); diff --git a/tests/contracts/AbiTest.abi.json b/tests/contracts/AbiTest.abi.json index c41f2936d..a9583b10a 100644 --- a/tests/contracts/AbiTest.abi.json +++ b/tests/contracts/AbiTest.abi.json @@ -525,47 +525,38 @@ } }, { - "name": "txnTypes", - "args": [ - { - "name": "t", - "type": "txn", - "desc": "" - }, - { - "name": "a", - "type": "appl", - "desc": "" - }, - { - "name": "ac", - "type": "acfg", - "desc": "" - }, - { - "name": "af", - "type": "afrz", - "desc": "" - }, - { - "name": "at", - "type": "axfer", - "desc": "" - }, - { - "name": "kr", - "type": "keyreg", - "desc": "" - }, - { - "name": "p", - "type": "pay", - "desc": "" - } - ], + "name": "dynamicArrayInMiddleOfTuple", + "args": [], "desc": "", "returns": { - "type": "void", + "type": "(uint16,uint8[],uint16)", + "desc": "" + } + }, + { + "name": "accessDynamicArrayInMiddleOfTuple", + "args": [], + "desc": "", + "returns": { + "type": "uint8[]", + "desc": "" + } + }, + { + "name": "accessDynamicArrayElementInTuple", + "args": [], + "desc": "", + "returns": { + "type": "uint32", + "desc": "" + } + }, + { + "name": "updateDynamicArrayInMiddleOfTuple", + "args": [], + "desc": "", + "returns": { + "type": "(uint16,uint8[],uint16)", "desc": "" } } diff --git a/tests/contracts/AbiTest.approval.teal b/tests/contracts/AbiTest.approval.teal index 4983b375f..e2cdc987d 100644 --- a/tests/contracts/AbiTest.approval.teal +++ b/tests/contracts/AbiTest.approval.teal @@ -1,114 +1,75 @@ #pragma version 8 b main -preArrayAccess: - proto 3 0 - frame_dig -3 // full tuple - store 0 // full tuple - load 0 // full tuple +update_dynamic_tuple_element: + proto 3 1 + load 3 // full tuple + load 3 // full tuple frame_dig -1 // head offset - extract_uint16 // extract array offset - store 1 // array offset - load 0 // full tuple - load 1 // array offset - extract_uint16 // extract array length - frame_dig -2 // type length - * // array size - int 2 - + // array size + len - store 2 // full array length - retsub - -updateDynamicElement: - proto 8 1 - frame_dig -8 // newArray - store 6 // new array - load 0 // full tuple + extract_uint16 // extract dynamic array offset of element int 0 - frame_dig -2 // startOfHeads - extract3 - store 3 // static part of tuple - load 0 // full tuple - frame_dig -2 // startOfHeads - frame_dig -3 // totalHeadLength - extract3 - store 4 // dynamic heads - byte 0x - dup - store 5 // values after array - store 7 // values before array - frame_dig -4 // lastDynamicElement - bnz skip_values_after_array - load 0 // full tuple - load 1 // array offset - load 2 // full array length + swap + extract3 // extract portion of tuple before element + frame_dig -2 // new tuple element + concat + load 3 // full tuple + load 3 // full tuple + frame_dig -1 // head offset + extract_uint16 // extract dynamic array offset of element + frame_dig -3 // old element length + - load 0 // full tuple + load 3 // full tuple len substring3 - store 5 // values after array - -skip_values_after_array: - frame_dig -5 // firstDynamicElement - bnz skip_values_before_array - load 0 // full tuple - frame_dig -1 // headEnd - load 1 // array offset - substring3 - store 7 // values before array + concat + store 3 // full tuple + frame_dig -2 // new tuple element + len // length of new element + frame_dig -3 // old element length + < + bnz swapped_difference + frame_dig -2 // new tuple element + len // length of new element + frame_dig -3 // old element length + int 1 + store 7 // subtract head difference + b get_difference -skip_values_before_array: - load 4 // dynamic heads - frame_dig -6 // headUpdateBitmask - load 6 // new array - len - load 2 // full array length - load 6 // new array - len - load 2 // full array length - >= - bnz skip_len_swap - swap +swapped_difference: + frame_dig -3 // old element length + frame_dig -2 // new tuple element + len // length of new element + int 0 + store 7 // subtract head difference -skip_len_swap: - - - itob - extract 6 2 - dup - concat - dup - concat - dup - concat - dup - concat - dup - concat - b& - load 6 // new array - len - load 2 // full array length - >= - bnz add_head - b- - b sub_or_add_head_end +get_difference: + - // get length difference + retsub + +update_dynamic_head: + proto 2 0 + frame_dig -2 // length difference + load 3 // full tuple + frame_dig -1 // dynamic array offset + extract_uint16 // extract dynamic array offset + load 7 // subtract head difference + bz subtract_head_difference + + // add difference to offset + b end_calc_new_head -add_head: - b+ +subtract_head_difference: + swap + - // subtract difference from offet -sub_or_add_head_end: - frame_dig -7 // fullHeadBitmask - b& - store 4 // dynamic heads - load 3 // static part of tuple - load 4 // dynamic heads - load 7 // values before array - load 6 // new array - load 5 // values after array - concat - concat - concat - concat +end_calc_new_head: + itob // convert to bytes + extract 6 2 // convert to uint16 + load 3 // full tuple + swap + frame_dig -1 // offset + swap + replace3 // update offset + store 3 // full tuple retsub bare_route_create: @@ -162,15 +123,24 @@ abi_route_staticArray: staticArray: proto 1 0 - // tests/contracts/abi.algo.ts:35 + // tests/contracts/abi.algo.ts:29 // a: StaticArray = [11, 22, 33] - byte 0x000000000000000b00000000000000160000000000000021 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat frame_bury -1 // a: uint64[3] - // tests/contracts/abi.algo.ts:37 + // tests/contracts/abi.algo.ts:31 // return a[1]; frame_dig -1 // a: uint64[3] - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -198,12 +168,19 @@ abi_route_returnStaticArray: returnStaticArray: proto 1 0 - // tests/contracts/abi.algo.ts:41 + // tests/contracts/abi.algo.ts:35 // a: StaticArray = [11, 22, 33] - byte 0x000000000000000b00000000000000160000000000000021 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat frame_bury -1 // a: uint64[3] - // tests/contracts/abi.algo.ts:43 + // tests/contracts/abi.algo.ts:37 // return a; frame_dig -1 // a: uint64[3] byte 0x151f7c75 @@ -229,10 +206,12 @@ abi_route_staticArrayArg: staticArrayArg: proto 1 0 - // tests/contracts/abi.algo.ts:47 + // tests/contracts/abi.algo.ts:41 // return a[1]; frame_dig -1 // a: uint64[3] - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -261,22 +240,22 @@ abi_route_nonLiteralStaticArrayElements: nonLiteralStaticArrayElements: proto 4 0 - // tests/contracts/abi.algo.ts:51 + // tests/contracts/abi.algo.ts:45 // n1 = 11 int 11 frame_bury -1 // n1: uint64 - // tests/contracts/abi.algo.ts:52 + // tests/contracts/abi.algo.ts:46 // n2 = 22 int 22 frame_bury -2 // n2: uint64 - // tests/contracts/abi.algo.ts:53 + // tests/contracts/abi.algo.ts:47 // n3 = 33 int 33 frame_bury -3 // n3: uint64 - // tests/contracts/abi.algo.ts:54 + // tests/contracts/abi.algo.ts:48 // a: StaticArray = [n1, n2, n3] frame_dig -1 // n1: uint64 itob @@ -288,10 +267,12 @@ nonLiteralStaticArrayElements: concat frame_bury -4 // a: uint64[3] - // tests/contracts/abi.algo.ts:56 + // tests/contracts/abi.algo.ts:50 // return a[1]; frame_dig -4 // a: uint64[3] - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -320,24 +301,31 @@ abi_route_mixedStaticArrayElements: mixedStaticArrayElements: proto 4 0 - // tests/contracts/abi.algo.ts:60 + // tests/contracts/abi.algo.ts:54 // n1 = 3 int 3 frame_bury -1 // n1: uint64 - // tests/contracts/abi.algo.ts:61 + // tests/contracts/abi.algo.ts:55 // n2 = 4 int 4 frame_bury -2 // n2: uint64 - // tests/contracts/abi.algo.ts:62 + // tests/contracts/abi.algo.ts:56 // n3 = 5 int 5 frame_bury -3 // n3: uint64 - // tests/contracts/abi.algo.ts:63 + // tests/contracts/abi.algo.ts:57 // a: StaticArray = [0, 1, 2, n1, n2, n3, 6, 7, 8] - byte 0x000000000000000000000000000000010000000000000002 + int 0 + itob + int 1 + itob + concat + int 2 + itob + concat frame_dig -1 // n1: uint64 itob concat @@ -347,25 +335,38 @@ mixedStaticArrayElements: frame_dig -3 // n3: uint64 itob concat - byte 0x000000000000000600000000000000070000000000000008 + int 6 + itob + concat + int 7 + itob + concat + int 8 + itob concat frame_bury -4 // a: uint64[9] - // tests/contracts/abi.algo.ts:65 + // tests/contracts/abi.algo.ts:59 // return a[1] + a[4] + a[7]; frame_dig -4 // a: uint64[9] - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi frame_dig -4 // a: uint64[9] - int 32 // offset + int 4 + int 8 // element length + * // element offset int 8 extract3 btoi + frame_dig -4 // a: uint64[9] - int 56 // offset + int 7 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -395,22 +396,29 @@ abi_route_nonLiteralStaticArrayAccess: nonLiteralStaticArrayAccess: proto 2 0 - // tests/contracts/abi.algo.ts:69 + // tests/contracts/abi.algo.ts:63 // a: StaticArray = [11, 22, 33] - byte 0x000000000000000b00000000000000160000000000000021 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat frame_bury -1 // a: uint64[3] - // tests/contracts/abi.algo.ts:70 + // tests/contracts/abi.algo.ts:64 // n = 2 int 2 frame_bury -2 // n: uint64 - // tests/contracts/abi.algo.ts:72 + // tests/contracts/abi.algo.ts:66 // return a[n]; frame_dig -1 // a: uint64[3] frame_dig -2 // n: uint64 - int 8 - * + int 8 // element length + * // element offset int 8 extract3 btoi @@ -438,24 +446,35 @@ abi_route_setStaticArrayElement: setStaticArrayElement: proto 1 0 - // tests/contracts/abi.algo.ts:76 + // tests/contracts/abi.algo.ts:70 // a: StaticArray = [11, 22, 33] - byte 0x000000000000000b00000000000000160000000000000021 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat frame_bury -1 // a: uint64[3] - // tests/contracts/abi.algo.ts:78 + // tests/contracts/abi.algo.ts:72 // a[1] = 222 frame_dig -1 // a: uint64[3] - int 8 // offset + int 1 + int 8 // element length + * // element offset int 222 itob replace3 frame_bury -1 // a: uint64[3] - // tests/contracts/abi.algo.ts:80 + // tests/contracts/abi.algo.ts:74 // return a[1]; frame_dig -1 // a: uint64[3] - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -484,35 +503,44 @@ abi_route_staticArrayInStorageRef: staticArrayInStorageRef: proto 2 0 - // tests/contracts/abi.algo.ts:84 + // tests/contracts/abi.algo.ts:78 // a: StaticArray = [11, 22, 33] - byte 0x000000000000000b00000000000000160000000000000021 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat frame_bury -1 // a: uint64[3] - // tests/contracts/abi.algo.ts:86 + // tests/contracts/abi.algo.ts:80 // this.gRef.put(a) byte "gRef" frame_dig -1 // a: uint64[3] app_global_put - // tests/contracts/abi.algo.ts:87 + // tests/contracts/abi.algo.ts:81 // this.lRef.put(this.txn.sender, a) txn Sender byte "lRef" frame_dig -1 // a: uint64[3] app_local_put - // tests/contracts/abi.algo.ts:88 + // tests/contracts/abi.algo.ts:82 // this.bRef.put(a) byte "bRef" frame_dig -1 // a: uint64[3] box_put - // tests/contracts/abi.algo.ts:90 + // tests/contracts/abi.algo.ts:84 // ret: StaticArray = [ byte "gRef" app_global_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -520,7 +548,9 @@ staticArrayInStorageRef: txn Sender byte "lRef" app_local_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -529,7 +559,9 @@ staticArrayInStorageRef: byte "bRef" box_get assert - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -537,7 +569,7 @@ staticArrayInStorageRef: concat frame_bury -2 // ret: uint64[3] - // tests/contracts/abi.algo.ts:96 + // tests/contracts/abi.algo.ts:90 // return ret; frame_dig -2 // ret: uint64[3] byte 0x151f7c75 @@ -564,35 +596,44 @@ abi_route_updateStaticArrayInStorageRef: updateStaticArrayInStorageRef: proto 2 0 - // tests/contracts/abi.algo.ts:100 + // tests/contracts/abi.algo.ts:94 // a: StaticArray = [11, 22, 33] - byte 0x000000000000000b00000000000000160000000000000021 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat frame_bury -1 // a: uint64[3] - // tests/contracts/abi.algo.ts:102 + // tests/contracts/abi.algo.ts:96 // this.gRef.put(a) byte "gRef" frame_dig -1 // a: uint64[3] app_global_put - // tests/contracts/abi.algo.ts:103 + // tests/contracts/abi.algo.ts:97 // this.lRef.put(this.txn.sender, a) txn Sender byte "lRef" frame_dig -1 // a: uint64[3] app_local_put - // tests/contracts/abi.algo.ts:104 + // tests/contracts/abi.algo.ts:98 // this.bRef.put(a) byte "bRef" frame_dig -1 // a: uint64[3] box_put - // tests/contracts/abi.algo.ts:106 + // tests/contracts/abi.algo.ts:100 // this.gRef.get()[1] = 111 byte "gRef" app_global_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 111 itob replace3 @@ -600,12 +641,14 @@ updateStaticArrayInStorageRef: swap app_global_put - // tests/contracts/abi.algo.ts:107 + // tests/contracts/abi.algo.ts:101 // this.lRef.get(this.txn.sender)[1] = 222 txn Sender byte "lRef" app_local_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 222 itob replace3 @@ -614,12 +657,14 @@ updateStaticArrayInStorageRef: uncover 2 app_local_put - // tests/contracts/abi.algo.ts:108 + // tests/contracts/abi.algo.ts:102 // this.bRef.get()[1] = 333 byte "bRef" box_get assert - int 8 // offset + int 1 + int 8 // element length + * // element offset int 333 itob replace3 @@ -627,11 +672,13 @@ updateStaticArrayInStorageRef: swap box_put - // tests/contracts/abi.algo.ts:110 + // tests/contracts/abi.algo.ts:104 // ret: StaticArray = [ byte "gRef" app_global_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -639,7 +686,9 @@ updateStaticArrayInStorageRef: txn Sender byte "lRef" app_local_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -648,7 +697,9 @@ updateStaticArrayInStorageRef: byte "bRef" box_get assert - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -656,7 +707,7 @@ updateStaticArrayInStorageRef: concat frame_bury -2 // ret: uint64[3] - // tests/contracts/abi.algo.ts:116 + // tests/contracts/abi.algo.ts:110 // return ret; frame_dig -2 // ret: uint64[3] byte 0x151f7c75 @@ -683,35 +734,44 @@ abi_route_staticArrayInStorageMap: staticArrayInStorageMap: proto 2 0 - // tests/contracts/abi.algo.ts:120 + // tests/contracts/abi.algo.ts:114 // a: StaticArray = [11, 22, 33] - byte 0x000000000000000b00000000000000160000000000000021 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat frame_bury -1 // a: uint64[3] - // tests/contracts/abi.algo.ts:122 + // tests/contracts/abi.algo.ts:116 // this.gMap.put('gMap', a) byte "gMap" frame_dig -1 // a: uint64[3] app_global_put - // tests/contracts/abi.algo.ts:123 + // tests/contracts/abi.algo.ts:117 // this.lMap.put(this.txn.sender, 'lMap', a) txn Sender byte "lMap" frame_dig -1 // a: uint64[3] app_local_put - // tests/contracts/abi.algo.ts:124 + // tests/contracts/abi.algo.ts:118 // this.bMap.put('bMap', a) byte "bMap" frame_dig -1 // a: uint64[3] box_put - // tests/contracts/abi.algo.ts:126 + // tests/contracts/abi.algo.ts:120 // ret: StaticArray = [ byte "gMap" app_global_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -719,7 +779,9 @@ staticArrayInStorageMap: txn Sender byte "lMap" app_local_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -728,7 +790,9 @@ staticArrayInStorageMap: byte "bMap" box_get assert - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -736,7 +800,7 @@ staticArrayInStorageMap: concat frame_bury -2 // ret: uint64[3] - // tests/contracts/abi.algo.ts:132 + // tests/contracts/abi.algo.ts:126 // return ret; frame_dig -2 // ret: uint64[3] byte 0x151f7c75 @@ -763,35 +827,44 @@ abi_route_updateStaticArrayInStorageMap: updateStaticArrayInStorageMap: proto 2 0 - // tests/contracts/abi.algo.ts:136 + // tests/contracts/abi.algo.ts:130 // a: StaticArray = [11, 22, 33] - byte 0x000000000000000b00000000000000160000000000000021 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat frame_bury -1 // a: uint64[3] - // tests/contracts/abi.algo.ts:138 + // tests/contracts/abi.algo.ts:132 // this.gMap.put('gMap', a) byte "gMap" frame_dig -1 // a: uint64[3] app_global_put - // tests/contracts/abi.algo.ts:139 + // tests/contracts/abi.algo.ts:133 // this.lMap.put(this.txn.sender, 'lMap', a) txn Sender byte "lMap" frame_dig -1 // a: uint64[3] app_local_put - // tests/contracts/abi.algo.ts:140 + // tests/contracts/abi.algo.ts:134 // this.bMap.put('bMap', a) byte "bMap" frame_dig -1 // a: uint64[3] box_put - // tests/contracts/abi.algo.ts:142 + // tests/contracts/abi.algo.ts:136 // this.gMap.get('gMap')[1] = 1111 byte "gMap" app_global_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 1111 itob replace3 @@ -799,12 +872,14 @@ updateStaticArrayInStorageMap: swap app_global_put - // tests/contracts/abi.algo.ts:143 + // tests/contracts/abi.algo.ts:137 // this.lMap.get(this.txn.sender, 'lMap')[1] = 2222 txn Sender byte "lMap" app_local_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 2222 itob replace3 @@ -813,12 +888,14 @@ updateStaticArrayInStorageMap: uncover 2 app_local_put - // tests/contracts/abi.algo.ts:144 + // tests/contracts/abi.algo.ts:138 // this.bMap.get('bMap')[1] = 3333 byte "bMap" box_get assert - int 8 // offset + int 1 + int 8 // element length + * // element offset int 3333 itob replace3 @@ -826,11 +903,13 @@ updateStaticArrayInStorageMap: swap box_put - // tests/contracts/abi.algo.ts:146 + // tests/contracts/abi.algo.ts:140 // ret: StaticArray = [ byte "gMap" app_global_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -838,7 +917,9 @@ updateStaticArrayInStorageMap: txn Sender byte "lMap" app_local_get - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -847,7 +928,9 @@ updateStaticArrayInStorageMap: byte "bMap" box_get assert - int 8 // offset + int 1 + int 8 // element length + * // element offset int 8 extract3 btoi @@ -855,7 +938,7 @@ updateStaticArrayInStorageMap: concat frame_bury -2 // ret: uint64[3] - // tests/contracts/abi.algo.ts:152 + // tests/contracts/abi.algo.ts:146 // return ret; frame_dig -2 // ret: uint64[3] byte 0x151f7c75 @@ -881,15 +964,46 @@ abi_route_nestedStaticArray: nestedStaticArray: proto 1 0 - // tests/contracts/abi.algo.ts:156 + // tests/contracts/abi.algo.ts:150 // a: StaticArray, 3> = [[11, 22, 33], [44, 55, 66], [77, 88, 99]] - byte 0x000000000000000b00000000000000160000000000000021000000000000002c00000000000000370000000000000042000000000000004d00000000000000580000000000000063 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat + int 44 + itob + int 55 + itob + concat + int 66 + itob + concat + concat + int 77 + itob + int 88 + itob + concat + int 99 + itob + concat + concat frame_bury -1 // a: uint64[3][3] - // tests/contracts/abi.algo.ts:158 + // tests/contracts/abi.algo.ts:152 // return a[1][1]; frame_dig -1 // a: uint64[3][3] - int 32 // offset + int 1 + int 24 // element length + * // element offset + int 1 + int 8 // element length + * // element offset + + int 8 extract3 btoi @@ -917,24 +1031,61 @@ abi_route_updateNestedStaticArrayElement: updateNestedStaticArrayElement: proto 1 0 - // tests/contracts/abi.algo.ts:162 + // tests/contracts/abi.algo.ts:156 // a: StaticArray, 3> = [[11, 22, 33], [44, 55, 66], [77, 88, 99]] - byte 0x000000000000000b00000000000000160000000000000021000000000000002c00000000000000370000000000000042000000000000004d00000000000000580000000000000063 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat + int 44 + itob + int 55 + itob + concat + int 66 + itob + concat + concat + int 77 + itob + int 88 + itob + concat + int 99 + itob + concat + concat frame_bury -1 // a: uint64[3][3] - // tests/contracts/abi.algo.ts:164 + // tests/contracts/abi.algo.ts:158 // a[1][1] = 555 frame_dig -1 // a: uint64[3][3] - int 32 // offset + int 1 + int 24 // element length + * // element offset + int 1 + int 8 // element length + * // element offset + + int 555 itob replace3 frame_bury -1 // a: uint64[3][3] - // tests/contracts/abi.algo.ts:166 + // tests/contracts/abi.algo.ts:160 // return a[1][1]; frame_dig -1 // a: uint64[3][3] - int 32 // offset + int 1 + int 24 // element length + * // element offset + int 1 + int 8 // element length + * // element offset + + int 8 extract3 btoi @@ -962,23 +1113,63 @@ abi_route_updateNestedStaticArray: updateNestedStaticArray: proto 1 0 - // tests/contracts/abi.algo.ts:170 + // tests/contracts/abi.algo.ts:164 // a: StaticArray, 3> = [[11, 22, 33], [44, 55, 66], [77, 88, 99]] - byte 0x000000000000000b00000000000000160000000000000021000000000000002c00000000000000370000000000000042000000000000004d00000000000000580000000000000063 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat + int 44 + itob + int 55 + itob + concat + int 66 + itob + concat + concat + int 77 + itob + int 88 + itob + concat + int 99 + itob + concat + concat frame_bury -1 // a: uint64[3][3] - // tests/contracts/abi.algo.ts:172 + // tests/contracts/abi.algo.ts:166 // a[1] = [444, 555, 666] frame_dig -1 // a: uint64[3][3] - int 24 // offset - byte 0x00000000000001bc000000000000022b000000000000029a + int 1 + int 24 // element length + * // element offset + int 444 + itob + int 555 + itob + concat + int 666 + itob + concat replace3 frame_bury -1 // a: uint64[3][3] - // tests/contracts/abi.algo.ts:174 + // tests/contracts/abi.algo.ts:168 // return a[1][1]; frame_dig -1 // a: uint64[3][3] - int 32 // offset + int 1 + int 24 // element length + * // element offset + int 1 + int 8 // element length + * // element offset + + int 8 extract3 btoi @@ -1006,23 +1197,75 @@ abi_route_threeDimensionalUint16Array: threeDimensionalUint16Array: proto 1 0 - // tests/contracts/abi.algo.ts:178 + // tests/contracts/abi.algo.ts:172 // a: StaticArray, 2>, 2> = [ - byte 0x000b00160021002c00370042004d0058 + int 11 + itob + extract 6 0 + int 22 + itob + extract 6 0 + concat + int 33 + itob + extract 6 0 + int 44 + itob + extract 6 0 + concat + concat + int 55 + itob + extract 6 0 + int 66 + itob + extract 6 0 + concat + int 77 + itob + extract 6 0 + int 88 + itob + extract 6 0 + concat + concat + concat frame_bury -1 // a: uint16[2][2][2] - // tests/contracts/abi.algo.ts:182 + // tests/contracts/abi.algo.ts:176 // a[1][1] = [777, 888] frame_dig -1 // a: uint16[2][2][2] - int 12 // offset - byte 0x03090378 + int 1 + int 8 // element length + * // element offset + int 1 + int 4 // element length + * // element offset + + + int 777 + itob + extract 6 0 + int 888 + itob + extract 6 0 + concat replace3 frame_bury -1 // a: uint16[2][2][2] - // tests/contracts/abi.algo.ts:184 + // tests/contracts/abi.algo.ts:178 // return a[1][1][1]; frame_dig -1 // a: uint16[2][2][2] - int 14 // offset + int 1 + int 8 // element length + * // element offset + int 1 + int 4 // element length + * // element offset + + + int 1 + int 2 // element length + * // element offset + + int 2 extract3 byte 0xFFFF @@ -1050,15 +1293,47 @@ abi_route_simpleTuple: simpleTuple: proto 1 0 - // tests/contracts/abi.algo.ts:188 + // tests/contracts/abi.algo.ts:182 // a: [uint64, uint16, uint64, uint16] = [11, 22, 33, 44] - byte 0x000000000000000b00160000000000000021002c + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0014 + store 2 // head offset + load 0 // tuple head + int 11 + itob + concat + store 0 // tuple head + load 0 // tuple head + int 22 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + int 33 + itob + concat + store 0 // tuple head + load 0 // tuple head + int 44 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat frame_bury -1 // a: [uint64,uint16,uint64,uint16] - // tests/contracts/abi.algo.ts:190 + // tests/contracts/abi.algo.ts:184 // return a[3]; frame_dig -1 // a: [uint64,uint16,uint64,uint16] - int 18 // offset + dup + store 3 // full tuple + int 18 int 2 extract3 byte 0xFFFF @@ -1086,15 +1361,54 @@ abi_route_arrayInTuple: arrayInTuple: proto 1 0 - // tests/contracts/abi.algo.ts:194 + // tests/contracts/abi.algo.ts:188 // a: [uint64, uint16, StaticArray, uint16] = [ - byte 0x000000000000000b00160000000000000021000000000000002c0037 + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x001c + store 2 // head offset + load 0 // tuple head + int 11 + itob + concat + store 0 // tuple head + load 0 // tuple head + int 22 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + int 33 + itob + int 44 + itob + concat + concat + store 0 // tuple head + load 0 // tuple head + int 55 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat frame_bury -1 // a: [uint64,uint16,uint64[2],uint16] - // tests/contracts/abi.algo.ts:198 + // tests/contracts/abi.algo.ts:192 // return a[2][1]; frame_dig -1 // a: [uint64,uint16,uint64[2],uint16] - int 18 // offset + dup + store 3 // full tuple + int 10 + int 1 + int 8 // element length + * // element offset + + int 8 extract3 btoi @@ -1122,15 +1436,61 @@ abi_route_tupleInArray: tupleInArray: proto 1 0 - // tests/contracts/abi.algo.ts:202 + // tests/contracts/abi.algo.ts:196 // a: StaticArray<[uint64, uint16], 2> = [ - byte 0x000000000000000b00160000000000000021002c + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x000a + store 2 // head offset + load 0 // tuple head + int 11 + itob + concat + store 0 // tuple head + load 0 // tuple head + int 22 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x000a + store 2 // head offset + load 0 // tuple head + int 33 + itob + concat + store 0 // tuple head + load 0 // tuple head + int 44 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + concat frame_bury -1 // a: [uint64,uint16][2] - // tests/contracts/abi.algo.ts:206 + // tests/contracts/abi.algo.ts:200 // return a[1][1]; frame_dig -1 // a: [uint64,uint16][2] - int 18 // offset + dup + store 3 // full tuple + int 1 + int 10 // element length + * // element offset + int 8 + + int 2 extract3 byte 0xFFFF @@ -1158,15 +1518,85 @@ abi_route_tupleInTuple: tupleInTuple: proto 1 0 - // tests/contracts/abi.algo.ts:210 + // tests/contracts/abi.algo.ts:204 // a: [uint16, uint16, [uint64, uint16], [uint16, uint64]] = [ - byte 0x000b00160000000000000021002c00370000000000000042 + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0018 + store 2 // head offset + load 0 // tuple head + int 11 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + int 22 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x000a + store 2 // head offset + load 0 // tuple head + int 33 + itob + concat + store 0 // tuple head + load 0 // tuple head + int 44 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + concat + store 0 // tuple head + load 0 // tuple head + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x000a + store 2 // head offset + load 0 // tuple head + int 55 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + int 66 + itob + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat frame_bury -1 // a: [uint16,uint16,[uint64,uint16],[uint16,uint64]] - // tests/contracts/abi.algo.ts:214 + // tests/contracts/abi.algo.ts:208 // return a[3][1]; frame_dig -1 // a: [uint16,uint16,[uint64,uint16],[uint16,uint64]] - int 16 // offset + dup + store 3 // full tuple + int 14 + int 2 + + int 8 extract3 btoi @@ -1194,15 +1624,57 @@ abi_route_shortTypeNotation: shortTypeNotation: proto 1 0 - // tests/contracts/abi.algo.ts:218 + // tests/contracts/abi.algo.ts:212 // a: [uint16<2>, uint64<2>, uint16<2>] = [ - byte 0x000b00160000000000000021000000000000002c00370042 + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0018 + store 2 // head offset + load 0 // tuple head + int 11 + itob + extract 6 0 + int 22 + itob + extract 6 0 + concat + concat + store 0 // tuple head + load 0 // tuple head + int 33 + itob + int 44 + itob + concat + concat + store 0 // tuple head + load 0 // tuple head + int 55 + itob + extract 6 0 + int 66 + itob + extract 6 0 + concat + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat frame_bury -1 // a: [uint16[2],uint64[2],uint16[2]] - // tests/contracts/abi.algo.ts:222 + // tests/contracts/abi.algo.ts:216 // return a[2][1]; frame_dig -1 // a: [uint16[2],uint64[2],uint16[2]] - int 22 // offset + dup + store 3 // full tuple + int 20 + int 1 + int 2 // element length + * // element offset + + int 2 extract3 byte 0xFFFF @@ -1230,56 +1702,230 @@ abi_route_disgusting: disgusting: proto 1 0 - // tests/contracts/abi.algo.ts:226 + // tests/contracts/abi.algo.ts:220 // a: StaticArray<[uint16<2>, uint64, [uint16, uint64], StaticArray, 2>], 2> = [ - byte 0x000b00160000000000000021002c00000000000000370000000000000042000000000000004d00000000000000580000000000000063006f00de000000000000014d01bc000000000000022b000000000000029a0000000000000309000000000000037800000000000003e7 - frame_bury -1 // a: [uint16[2],uint64,[uint16,uint64],uint64[2][2]][2] - - // tests/contracts/abi.algo.ts:231 - // a[1][3][1] = [8888, 9999] - frame_dig -1 // a: [uint16[2],uint64,[uint16,uint64],uint64[2][2]][2] - int 92 // offset - byte 0x00000000000022b8000000000000270f - replace3 - frame_bury -1 // a: [uint16[2],uint64,[uint16,uint64],uint64[2][2]][2] - - // tests/contracts/abi.algo.ts:232 - // return a[1][3][1][0]; - frame_dig -1 // a: [uint16[2],uint64,[uint16,uint64],uint64[2][2]][2] - int 92 // offset - int 8 - extract3 - btoi + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0036 + store 2 // head offset + load 0 // tuple head + int 11 itob - byte 0x151f7c75 - swap + extract 6 0 + int 22 + itob + extract 6 0 concat - log - retsub - -abi_route_returnTuple: - txn OnCompletion - int NoOp - == - txn ApplicationID - int 0 - != - && - assert + concat + store 0 // tuple head + load 0 // tuple head + int 33 + itob + concat + store 0 // tuple head + load 0 // tuple head byte 0x - callsub returnTuple - int 1 - return - -returnTuple: - proto 1 0 - - // tests/contracts/abi.algo.ts:236 - // a: [uint64, uint16, uint64] = [11, 22, 33] - byte 0x000000000000000b00160000000000000021 - frame_bury -1 // a: [uint64,uint16,uint64] + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x000a + store 2 // head offset + load 0 // tuple head + int 44 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + int 55 + itob + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + concat + store 0 // tuple head + load 0 // tuple head + int 66 + itob + int 77 + itob + concat + int 88 + itob + int 99 + itob + concat + concat + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0036 + store 2 // head offset + load 0 // tuple head + int 111 + itob + extract 6 0 + int 222 + itob + extract 6 0 + concat + concat + store 0 // tuple head + load 0 // tuple head + int 333 + itob + concat + store 0 // tuple head + load 0 // tuple head + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x000a + store 2 // head offset + load 0 // tuple head + int 444 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + int 555 + itob + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + concat + store 0 // tuple head + load 0 // tuple head + int 666 + itob + int 777 + itob + concat + int 888 + itob + int 999 + itob + concat + concat + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + concat + frame_bury -1 // a: [uint16[2],uint64,[uint16,uint64],uint64[2][2]][2] + + // tests/contracts/abi.algo.ts:225 + // a[1][3][1] = [8888, 9999] + frame_dig -1 // a: [uint16[2],uint64,[uint16,uint64],uint64[2][2]][2] + dup + store 3 // full tuple + int 1 + int 54 // element length + * // element offset + int 22 + + + int 1 + int 16 // element length + * // element offset + + + int 8888 + itob + int 9999 + itob + concat + replace3 + frame_bury -1 // a: [uint16[2],uint64,[uint16,uint64],uint64[2][2]][2] + + // tests/contracts/abi.algo.ts:226 + // return a[1][3][1][0]; + frame_dig -1 // a: [uint16[2],uint64,[uint16,uint64],uint64[2][2]][2] + dup + store 3 // full tuple + int 1 + int 54 // element length + * // element offset + int 22 + + + int 1 + int 16 // element length + * // element offset + + + int 0 + int 8 // element length + * // element offset + + + int 8 + extract3 + btoi + itob + byte 0x151f7c75 + swap + concat + log + retsub + +abi_route_returnTuple: + txn OnCompletion + int NoOp + == + txn ApplicationID + int 0 + != + && + assert + byte 0x + callsub returnTuple + int 1 + return + +returnTuple: + proto 1 0 + + // tests/contracts/abi.algo.ts:230 + // a: [uint64, uint16, uint64] = [11, 22, 33] + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0012 + store 2 // head offset + load 0 // tuple head + int 11 + itob + concat + store 0 // tuple head + load 0 // tuple head + int 22 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + int 33 + itob + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + frame_bury -1 // a: [uint64,uint16,uint64] - // tests/contracts/abi.algo.ts:237 + // tests/contracts/abi.algo.ts:231 // return a; frame_dig -1 // a: [uint64,uint16,uint64] byte 0x151f7c75 @@ -1305,10 +1951,12 @@ abi_route_tupleArg: tupleArg: proto 1 0 - // tests/contracts/abi.algo.ts:241 + // tests/contracts/abi.algo.ts:235 // return a[1]; frame_dig -1 // a: [uint64,uint16,uint64] - int 8 // offset + dup + store 3 // full tuple + int 8 int 2 extract3 byte 0xFFFF @@ -1336,19 +1984,29 @@ abi_route_dynamicArray: dynamicArray: proto 1 0 - // tests/contracts/abi.algo.ts:245 + // tests/contracts/abi.algo.ts:239 // a: uint64[] = [11, 22, 33] - byte 0x0003000000000000000b00000000000000160000000000000021 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat + byte 0x0003 + swap + concat frame_bury -1 // a: uint64[] - // tests/contracts/abi.algo.ts:247 + // tests/contracts/abi.algo.ts:241 // return a[1]; frame_dig -1 // a: uint64[] int 1 - int 8 - * + int 8 // element length + * // element offset int 2 - + + + // add two for length int 8 extract3 btoi @@ -1376,12 +2034,22 @@ abi_route_returnDynamicArray: returnDynamicArray: proto 1 0 - // tests/contracts/abi.algo.ts:251 + // tests/contracts/abi.algo.ts:245 // a: uint64[] = [11, 22, 33] - byte 0x0003000000000000000b00000000000000160000000000000021 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat + byte 0x0003 + swap + concat frame_bury -1 // a: uint64[] - // tests/contracts/abi.algo.ts:252 + // tests/contracts/abi.algo.ts:246 // return a; frame_dig -1 // a: uint64[] byte 0x151f7c75 @@ -1407,14 +2075,14 @@ abi_route_dynamicArrayArg: dynamicArrayArg: proto 1 0 - // tests/contracts/abi.algo.ts:256 + // tests/contracts/abi.algo.ts:250 // return a[1]; frame_dig -1 // a: uint64[] int 1 - int 8 - * + int 8 // element length + * // element offset int 2 - + + + // add two for length int 8 extract3 btoi @@ -1442,32 +2110,42 @@ abi_route_updateDynamicArrayElement: updateDynamicArrayElement: proto 1 0 - // tests/contracts/abi.algo.ts:260 + // tests/contracts/abi.algo.ts:254 // a: uint64[] = [11, 22, 33] - byte 0x0003000000000000000b00000000000000160000000000000021 + int 11 + itob + int 22 + itob + concat + int 33 + itob + concat + byte 0x0003 + swap + concat frame_bury -1 // a: uint64[] - // tests/contracts/abi.algo.ts:262 + // tests/contracts/abi.algo.ts:256 // a[1] = 222 frame_dig -1 // a: uint64[] int 1 - int 8 - * + int 8 // element length + * // element offset int 2 - + + + // add two for length int 222 itob replace3 frame_bury -1 // a: uint64[] - // tests/contracts/abi.algo.ts:264 + // tests/contracts/abi.algo.ts:258 // return a[1]; frame_dig -1 // a: uint64[] int 1 - int 8 - * + int 8 // element length + * // element offset int 2 - + + + // add two for length int 8 extract3 btoi @@ -1495,20 +2173,65 @@ abi_route_dynamicTupleArray: dynamicTupleArray: proto 1 0 - // tests/contracts/abi.algo.ts:268 + // tests/contracts/abi.algo.ts:262 // a: [uint16, uint64][] = [[11, 22], [33, 44]] - byte 0x0002000b00000000000000160021000000000000002c + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x000a + store 2 // head offset + load 0 // tuple head + int 11 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + int 22 + itob + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x000a + store 2 // head offset + load 0 // tuple head + int 33 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + int 44 + itob + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + concat + byte 0x0002 + swap + concat frame_bury -1 // a: [uint16,uint64][] - // tests/contracts/abi.algo.ts:270 + // tests/contracts/abi.algo.ts:264 // return a[1][1]; frame_dig -1 // a: [uint16,uint64][] + dup + store 3 // full tuple int 1 - int 10 - * + int 10 // element length + * // element offset + int 2 + + // add two for length int 2 - + - int 2 // offset + int 8 extract3 @@ -1537,16 +2260,29 @@ abi_route_returnTupleWithDyamicArray: returnTupleWithDyamicArray: proto 1 0 - // tests/contracts/abi.algo.ts:274 + // tests/contracts/abi.algo.ts:268 // a: [uint64, uint16, uint64[], uint16[]] = [1, 2, [3, 4], [5, 6]] - byte 0x00000000000000010002 - store 11 // static elements - byte 0x000e // head end - store 8 // dynamic head - int 14 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x000e + store 2 // head offset + load 0 // tuple head + int 1 + itob + concat + store 0 // tuple head + load 0 // tuple head + int 2 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head int 3 itob int 4 @@ -1557,20 +2293,20 @@ returnTupleWithDyamicArray: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 5 itob extract 6 0 @@ -1581,18 +2317,24 @@ returnTupleWithDyamicArray: byte 0x0002 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -1 // a: [uint64,uint16,uint64[],uint16[]] - // tests/contracts/abi.algo.ts:276 + // tests/contracts/abi.algo.ts:270 // return a; frame_dig -1 // a: [uint64,uint16,uint64[],uint16[]] byte 0x151f7c75 @@ -1618,16 +2360,30 @@ abi_route_returnDynamicArrayFromTuple: returnDynamicArrayFromTuple: proto 1 0 - // tests/contracts/abi.algo.ts:280 + // tests/contracts/abi.algo.ts:274 // a: [uint8, uint16, uint8[], uint16[], uint8[]] = [1, 2, [3, 4], [5, 6], [7, 8]] - byte 0x010002 - store 11 // static elements - byte 0x0009 // head end - store 8 // dynamic head - int 9 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0009 + store 2 // head offset + load 0 // tuple head + int 1 + itob + extract 7 0 + concat + store 0 // tuple head + load 0 // tuple head + int 2 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head int 3 itob extract 7 0 @@ -1640,20 +2396,20 @@ returnDynamicArrayFromTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 5 itob extract 6 0 @@ -1666,20 +2422,20 @@ returnDynamicArrayFromTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 7 itob extract 7 0 @@ -1690,26 +2446,44 @@ returnDynamicArrayFromTuple: byte 0x0002 swap concat - load 10 // dynamic elements - swap - concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat - concat - frame_bury -1 // a: [uint8,uint16,uint8[],uint16[],uint8[]] + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail + swap + concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail + concat + frame_bury -1 // a: [uint8,uint16,uint8[],uint16[],uint8[]] - // tests/contracts/abi.algo.ts:282 + // tests/contracts/abi.algo.ts:276 // return a[4]; frame_dig -1 // a: [uint8,uint16,uint8[],uint16[],uint8[]] - int 1 // type length - int 7 // head offset - callsub preArrayAccess - load 0 // full tuple - load 1 // array offset - load 2 // full array length + dup + store 3 // full tuple + int 7 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length extract3 byte 0x151f7c75 swap @@ -1734,16 +2508,24 @@ abi_route_updateDynamicArrayInTuple: updateDynamicArrayInTuple: proto 1 0 - // tests/contracts/abi.algo.ts:286 + // tests/contracts/abi.algo.ts:280 // a: [uint8, uint16[], uint8[], uint16[], uint8[]] = [9, [8], [7], [6], [5]] - byte 0x09 - store 11 // static elements - byte 0x0009 // head end - store 8 // dynamic head - int 9 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0009 + store 2 // head offset + load 0 // tuple head + int 9 + itob + extract 7 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head int 8 itob extract 6 0 @@ -1752,20 +2534,20 @@ updateDynamicArrayInTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 7 itob extract 7 0 @@ -1774,20 +2556,20 @@ updateDynamicArrayInTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 6 itob extract 6 0 @@ -1796,116 +2578,238 @@ updateDynamicArrayInTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 5 itob extract 7 0 byte 0x0001 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] - // tests/contracts/abi.algo.ts:288 + // tests/contracts/abi.algo.ts:282 // a[0] = 99 as uint8 frame_dig -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] - int 0 // offset + dup + store 3 // full tuple + int 0 int 99 itob extract 7 0 replace3 frame_bury -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] - // tests/contracts/abi.algo.ts:289 + // tests/contracts/abi.algo.ts:283 // a[1] = [10, 11] frame_dig -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] - int 2 // type length - int 1 // head offset - callsub preArrayAccess - byte 0x0002000a000b - byte 0xFFFFFFFFFFFFFFFF - byte 0x0000FFFFFFFFFFFF // head update bitmask - int 1 // is first dynamic element - int 0 // is last dynamic element - int 8 // total head length - int 1 // startOfHeads - int 9 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 1 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 2 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 10 + itob + extract 6 0 + int 11 + itob + extract 6 0 + concat + byte 0x0002 + swap + concat + int 1 + callsub update_dynamic_tuple_element + dup // dup length difference + int 3 + callsub update_dynamic_head + dup // dup length difference + int 5 + callsub update_dynamic_head + dup // dup length difference + int 7 + callsub update_dynamic_head + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] - // tests/contracts/abi.algo.ts:290 + // tests/contracts/abi.algo.ts:284 // a[2] = [12, 13] frame_dig -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] - int 1 // type length - int 3 // head offset - callsub preArrayAccess - byte 0x00020c0d - byte 0xFFFFFFFFFFFFFFFF - byte 0x00000000FFFFFFFF // head update bitmask - int 0 // is first dynamic element - int 0 // is last dynamic element - int 8 // total head length - int 1 // startOfHeads - int 9 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 3 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 12 + itob + extract 7 0 + int 13 + itob + extract 7 0 + concat + byte 0x0002 + swap + concat + int 3 + callsub update_dynamic_tuple_element + dup // dup length difference + int 5 + callsub update_dynamic_head + dup // dup length difference + int 7 + callsub update_dynamic_head + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] - // tests/contracts/abi.algo.ts:291 + // tests/contracts/abi.algo.ts:285 // a[3] = [14, 15] frame_dig -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] - int 2 // type length - int 5 // head offset - callsub preArrayAccess - byte 0x0002000e000f - byte 0xFFFFFFFFFFFFFFFF - byte 0x000000000000FFFF // head update bitmask - int 0 // is first dynamic element - int 0 // is last dynamic element - int 8 // total head length - int 1 // startOfHeads - int 9 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 5 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 2 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 14 + itob + extract 6 0 + int 15 + itob + extract 6 0 + concat + byte 0x0002 + swap + concat + int 5 + callsub update_dynamic_tuple_element + dup // dup length difference + int 7 + callsub update_dynamic_head + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] - // tests/contracts/abi.algo.ts:292 + // tests/contracts/abi.algo.ts:286 // a[4] = [16, 17] frame_dig -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] - int 1 // type length - int 7 // head offset - callsub preArrayAccess - byte 0x00021011 - byte 0xFFFFFFFFFFFFFFFF - byte 0x0000000000000000 // head update bitmask - int 0 // is first dynamic element - int 1 // is last dynamic element - int 8 // total head length - int 1 // startOfHeads - int 9 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 7 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 16 + itob + extract 7 0 + int 17 + itob + extract 7 0 + concat + byte 0x0002 + swap + concat + int 7 + callsub update_dynamic_tuple_element + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] - // tests/contracts/abi.algo.ts:294 + // tests/contracts/abi.algo.ts:288 // return a; frame_dig -1 // a: [uint8,uint16[],uint8[],uint16[],uint8[]] byte 0x151f7c75 @@ -1932,21 +2836,44 @@ abi_route_nonLiteralDynamicElementInTuple: nonLiteralDynamicElementInTuple: proto 2 0 - // tests/contracts/abi.algo.ts:298 + // tests/contracts/abi.algo.ts:292 // e: uint16[] = [5, 6] - byte 0x000200050006 + int 5 + itob + extract 6 0 + int 6 + itob + extract 6 0 + concat + byte 0x0002 + swap + concat frame_bury -1 // e: uint16[] - // tests/contracts/abi.algo.ts:299 + // tests/contracts/abi.algo.ts:293 // a: [uint8, uint16, uint8[], uint16[], uint8[]] = [1, 2, [3, 4], e, [7, 8]] - byte 0x010002 - store 11 // static elements - byte 0x0009 // head end - store 8 // dynamic head - int 9 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0009 + store 2 // head offset + load 0 // tuple head + int 1 + itob + extract 7 0 + concat + store 0 // tuple head + load 0 // tuple head + int 2 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head int 3 itob extract 7 0 @@ -1959,37 +2886,37 @@ nonLiteralDynamicElementInTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head frame_dig -1 // e: uint16[] dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 7 itob extract 7 0 @@ -2000,18 +2927,24 @@ nonLiteralDynamicElementInTuple: byte 0x0002 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -2 // a: [uint8,uint16,uint8[],uint16[],uint8[]] - // tests/contracts/abi.algo.ts:301 + // tests/contracts/abi.algo.ts:295 // return a; frame_dig -2 // a: [uint8,uint16,uint8[],uint16[],uint8[]] byte 0x151f7c75 @@ -2037,12 +2970,21 @@ abi_route_arrayPush: arrayPush: proto 1 0 - // tests/contracts/abi.algo.ts:305 + // tests/contracts/abi.algo.ts:299 // a: uint16[] = [1, 2] - byte 0x000200010002 + int 1 + itob + extract 6 0 + int 2 + itob + extract 6 0 + concat + byte 0x0002 + swap + concat frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:307 + // tests/contracts/abi.algo.ts:301 // a.push(3 as uint16) frame_dig -1 // a: uint16[] dup @@ -2061,7 +3003,7 @@ arrayPush: concat frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:309 + // tests/contracts/abi.algo.ts:303 // return a; frame_dig -1 // a: uint16[] byte 0x151f7c75 @@ -2087,12 +3029,25 @@ abi_route_arrayPop: arrayPop: proto 1 0 - // tests/contracts/abi.algo.ts:313 + // tests/contracts/abi.algo.ts:307 // a: uint16[] = [1, 2, 3] - byte 0x0003000100020003 + int 1 + itob + extract 6 0 + int 2 + itob + extract 6 0 + concat + int 3 + itob + extract 6 0 + concat + byte 0x0003 + swap + concat frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:315 + // tests/contracts/abi.algo.ts:309 // a.pop() frame_dig -1 // a: uint16[] dup @@ -2114,7 +3069,7 @@ arrayPop: extract3 frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:317 + // tests/contracts/abi.algo.ts:311 // return a; frame_dig -1 // a: uint16[] byte 0x151f7c75 @@ -2141,12 +3096,25 @@ abi_route_arrayPopValue: arrayPopValue: proto 2 0 - // tests/contracts/abi.algo.ts:321 + // tests/contracts/abi.algo.ts:315 // a: uint16[] = [1, 2, 3] - byte 0x0003000100020003 + int 1 + itob + extract 6 0 + int 2 + itob + extract 6 0 + concat + int 3 + itob + extract 6 0 + concat + byte 0x0003 + swap + concat frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:323 + // tests/contracts/abi.algo.ts:317 // v = a.pop()! frame_dig -1 // a: uint16[] dup @@ -2176,7 +3144,7 @@ arrayPopValue: frame_bury -1 // a: uint16[] frame_bury -2 // v: uint16 - // tests/contracts/abi.algo.ts:325 + // tests/contracts/abi.algo.ts:319 // return v; frame_dig -2 // v: uint16 byte 0xFFFF @@ -2204,12 +3172,22 @@ abi_route_arraySplice: arraySplice: proto 1 0 - // tests/contracts/abi.algo.ts:329 + // tests/contracts/abi.algo.ts:323 // a: uint64[] = [1, 2, 3] - byte 0x0003000000000000000100000000000000020000000000000003 + int 1 + itob + int 2 + itob + concat + int 3 + itob + concat + byte 0x0003 + swap + concat frame_bury -1 // a: uint64[] - // tests/contracts/abi.algo.ts:331 + // tests/contracts/abi.algo.ts:325 // a.splice(1, 1) frame_dig -1 // a: uint64[] int 0 @@ -2248,7 +3226,7 @@ arraySplice: concat frame_bury -1 // a: uint64[] - // tests/contracts/abi.algo.ts:333 + // tests/contracts/abi.algo.ts:327 // return a; frame_dig -1 // a: uint64[] byte 0x151f7c75 @@ -2275,22 +3253,63 @@ abi_route_arraySpliceValue: arraySpliceValue: proto 4 0 - // tests/contracts/abi.algo.ts:337 + // tests/contracts/abi.algo.ts:331 // a: uint16[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - byte 0x000a000100020003000400050006000700080009000a - frame_bury -1 // a: uint16[] - - // tests/contracts/abi.algo.ts:339 - // i = 1 int 1 - frame_bury -2 // i: uint64 - - // tests/contracts/abi.algo.ts:340 - // l = 7 - int 7 - frame_bury -3 // l: uint64 - - // tests/contracts/abi.algo.ts:341 + itob + extract 6 0 + int 2 + itob + extract 6 0 + concat + int 3 + itob + extract 6 0 + concat + int 4 + itob + extract 6 0 + concat + int 5 + itob + extract 6 0 + concat + int 6 + itob + extract 6 0 + concat + int 7 + itob + extract 6 0 + concat + int 8 + itob + extract 6 0 + concat + int 9 + itob + extract 6 0 + concat + int 10 + itob + extract 6 0 + concat + byte 0x000a + swap + concat + frame_bury -1 // a: uint16[] + + // tests/contracts/abi.algo.ts:333 + // i = 1 + int 1 + frame_bury -2 // i: uint64 + + // tests/contracts/abi.algo.ts:334 + // l = 7 + int 7 + frame_bury -3 // l: uint64 + + // tests/contracts/abi.algo.ts:335 // v = a.splice(i, l) frame_dig -1 // a: uint16[] int 0 @@ -2341,7 +3360,7 @@ arraySpliceValue: frame_bury -1 // a: uint16[] frame_bury -4 // v: uint16[] - // tests/contracts/abi.algo.ts:343 + // tests/contracts/abi.algo.ts:337 // return v; frame_dig -4 // v: uint16[] byte 0x151f7c75 @@ -2368,44 +3387,58 @@ abi_route_dynamicArrayElements: dynamicArrayElements: proto 2 0 - // tests/contracts/abi.algo.ts:347 + // tests/contracts/abi.algo.ts:341 // a: uint16[] = [1, 2, 3] - byte 0x0003000100020003 + int 1 + itob + extract 6 0 + int 2 + itob + extract 6 0 + concat + int 3 + itob + extract 6 0 + concat + byte 0x0003 + swap + concat frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:348 + // tests/contracts/abi.algo.ts:342 // newA: uint16[] = [a[0], a[1], a[2]] - byte 0x0003 frame_dig -1 // a: uint16[] int 0 + int 2 // element length + * // element offset int 2 - * - int 2 - + + + // add two for length int 2 extract3 - concat frame_dig -1 // a: uint16[] int 1 + int 2 // element length + * // element offset int 2 - * - int 2 - + + + // add two for length int 2 extract3 concat frame_dig -1 // a: uint16[] int 2 + int 2 // element length + * // element offset int 2 - * - int 2 - + + + // add two for length int 2 extract3 concat + byte 0x0003 + swap + concat frame_bury -2 // newA: uint16[] - // tests/contracts/abi.algo.ts:350 + // tests/contracts/abi.algo.ts:344 // return newA; frame_dig -2 // newA: uint16[] byte 0x151f7c75 @@ -2431,12 +3464,25 @@ abi_route_spliceLastElement: spliceLastElement: proto 1 0 - // tests/contracts/abi.algo.ts:354 + // tests/contracts/abi.algo.ts:348 // a: uint16[] = [1, 2, 3] - byte 0x0003000100020003 + int 1 + itob + extract 6 0 + int 2 + itob + extract 6 0 + concat + int 3 + itob + extract 6 0 + concat + byte 0x0003 + swap + concat frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:356 + // tests/contracts/abi.algo.ts:350 // a.splice(2, 1) frame_dig -1 // a: uint16[] int 0 @@ -2475,7 +3521,7 @@ spliceLastElement: concat frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:358 + // tests/contracts/abi.algo.ts:352 // return a; frame_dig -1 // a: uint16[] byte 0x151f7c75 @@ -2502,12 +3548,25 @@ abi_route_spliceLastElementValue: spliceLastElementValue: proto 2 0 - // tests/contracts/abi.algo.ts:362 + // tests/contracts/abi.algo.ts:356 // a: uint16[] = [1, 2, 3] - byte 0x0003000100020003 + int 1 + itob + extract 6 0 + int 2 + itob + extract 6 0 + concat + int 3 + itob + extract 6 0 + concat + byte 0x0003 + swap + concat frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:364 + // tests/contracts/abi.algo.ts:358 // v = a.splice(2, 1) frame_dig -1 // a: uint16[] int 0 @@ -2558,7 +3617,7 @@ spliceLastElementValue: frame_bury -1 // a: uint16[] frame_bury -2 // v: uint16[] - // tests/contracts/abi.algo.ts:366 + // tests/contracts/abi.algo.ts:360 // return v; frame_dig -2 // v: uint16[] byte 0x151f7c75 @@ -2584,12 +3643,25 @@ abi_route_spliceFirstElement: spliceFirstElement: proto 1 0 - // tests/contracts/abi.algo.ts:370 + // tests/contracts/abi.algo.ts:364 // a: uint16[] = [1, 2, 3] - byte 0x0003000100020003 + int 1 + itob + extract 6 0 + int 2 + itob + extract 6 0 + concat + int 3 + itob + extract 6 0 + concat + byte 0x0003 + swap + concat frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:372 + // tests/contracts/abi.algo.ts:366 // a.splice(0, 1) frame_dig -1 // a: uint16[] int 0 @@ -2628,7 +3700,7 @@ spliceFirstElement: concat frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:374 + // tests/contracts/abi.algo.ts:368 // return a; frame_dig -1 // a: uint16[] byte 0x151f7c75 @@ -2655,12 +3727,25 @@ abi_route_spliceFirstElementValue: spliceFirstElementValue: proto 2 0 - // tests/contracts/abi.algo.ts:378 + // tests/contracts/abi.algo.ts:372 // a: uint16[] = [1, 2, 3] - byte 0x0003000100020003 + int 1 + itob + extract 6 0 + int 2 + itob + extract 6 0 + concat + int 3 + itob + extract 6 0 + concat + byte 0x0003 + swap + concat frame_bury -1 // a: uint16[] - // tests/contracts/abi.algo.ts:380 + // tests/contracts/abi.algo.ts:374 // v = a.splice(0, 1) frame_dig -1 // a: uint16[] int 0 @@ -2711,7 +3796,7 @@ spliceFirstElementValue: frame_bury -1 // a: uint16[] frame_bury -2 // v: uint16[] - // tests/contracts/abi.algo.ts:382 + // tests/contracts/abi.algo.ts:376 // return v; frame_dig -2 // v: uint16[] byte 0x151f7c75 @@ -2736,7 +3821,7 @@ abi_route_stringReturn: stringReturn: proto 0 0 - // tests/contracts/abi.algo.ts:386 + // tests/contracts/abi.algo.ts:380 // return 'Hello World!'; byte "Hello World!" dup @@ -2769,7 +3854,7 @@ abi_route_stringArg: stringArg: proto 1 0 - // tests/contracts/abi.algo.ts:390 + // tests/contracts/abi.algo.ts:384 // assert(s === 'Hello World!') frame_dig -1 // s: bytes byte "Hello World!" @@ -2794,16 +3879,24 @@ abi_route_stringInTuple: stringInTuple: proto 1 0 - // tests/contracts/abi.algo.ts:394 + // tests/contracts/abi.algo.ts:388 // a: [uint16, uint8[], string, uint8[]] = [1, [2], 'Hello World!', [3]] - byte 0x0001 - store 11 // static elements - byte 0x0008 // head end - store 8 // dynamic head - int 8 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0008 + store 2 // head offset + load 0 // tuple head + int 1 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head int 2 itob extract 7 0 @@ -2812,55 +3905,67 @@ stringInTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head + byte "Hello World!" + dup + len + itob + extract 6 2 swap concat - store 10 // dynamic elements - byte 0x000c48656c6c6f20576f726c6421 // Hello World! dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 3 itob extract 7 0 byte 0x0001 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -1 // a: [uint16,uint8[],string,uint8[]] - // tests/contracts/abi.algo.ts:396 + // tests/contracts/abi.algo.ts:390 // return a; frame_dig -1 // a: [uint16,uint8[],string,uint8[]] byte 0x151f7c75 @@ -2886,16 +3991,24 @@ abi_route_accesStringInTuple: accesStringInTuple: proto 1 0 - // tests/contracts/abi.algo.ts:400 + // tests/contracts/abi.algo.ts:394 // a: [uint16, uint8[], string, uint8[]] = [1, [2], 'Hello World!', [3]] - byte 0x0001 - store 11 // static elements - byte 0x0008 // head end - store 8 // dynamic head - int 8 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0008 + store 2 // head offset + load 0 // tuple head + int 1 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head int 2 itob extract 7 0 @@ -2904,80 +4017,116 @@ accesStringInTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head + byte "Hello World!" + dup + len + itob + extract 6 2 swap concat - store 10 // dynamic elements - byte 0x000c48656c6c6f20576f726c6421 // Hello World! dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 3 itob extract 7 0 byte 0x0001 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -1 // a: [uint16,uint8[],string,uint8[]] - // tests/contracts/abi.algo.ts:402 + // tests/contracts/abi.algo.ts:396 // assert(a[2] === 'Hello World!') frame_dig -1 // a: [uint16,uint8[],string,uint8[]] - int 1 // type length - int 4 // head offset - callsub preArrayAccess - load 0 // full tuple - load 1 // array offset - load 2 // full array length - extract3 - extract 2 0 // extract bytes from string + dup + store 3 // full tuple + int 4 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + extract 2 0 byte "Hello World!" == assert - // tests/contracts/abi.algo.ts:404 + // tests/contracts/abi.algo.ts:398 // return a[2]; frame_dig -1 // a: [uint16,uint8[],string,uint8[]] - int 1 // type length - int 4 // head offset - callsub preArrayAccess - load 0 // full tuple - load 1 // array offset - load 2 // full array length + dup + store 3 // full tuple + int 4 + swap + dupn 2 + uncover 3 + int 2 extract3 - extract 2 0 // extract bytes from string + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + extract 2 0 dup len itob @@ -3007,16 +4156,24 @@ abi_route_updateStringInTuple: updateStringInTuple: proto 1 0 - // tests/contracts/abi.algo.ts:408 + // tests/contracts/abi.algo.ts:402 // a: [uint8, uint16[], string, uint16[], uint8[]] = [9, [8], 'Hi?', [6], [5]] - byte 0x09 - store 11 // static elements - byte 0x0009 // head end - store 8 // dynamic head - int 9 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0009 + store 2 // head offset + load 0 // tuple head + int 9 + itob + extract 7 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head int 8 itob extract 6 0 @@ -3025,38 +4182,44 @@ updateStringInTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements - byte 0x000348693f // Hi? + store 0 // tuple head + byte "Hi?" dup len - load 9 // dynamic head offset - + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head - swap - concat - store 8 // dynamic head - load 10 // dynamic elements swap concat - store 10 // dynamic elements - int 6 + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail + swap + concat + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head + int 6 itob extract 6 0 byte 0x0001 @@ -3064,116 +4227,235 @@ updateStringInTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 5 itob extract 7 0 byte 0x0001 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -1 // a: [uint8,uint16[],string,uint16[],uint8[]] - // tests/contracts/abi.algo.ts:410 + // tests/contracts/abi.algo.ts:404 // a[0] = 99 as uint8 frame_dig -1 // a: [uint8,uint16[],string,uint16[],uint8[]] - int 0 // offset + dup + store 3 // full tuple + int 0 int 99 itob extract 7 0 replace3 frame_bury -1 // a: [uint8,uint16[],string,uint16[],uint8[]] - // tests/contracts/abi.algo.ts:411 + // tests/contracts/abi.algo.ts:405 // a[1] = [10, 11] frame_dig -1 // a: [uint8,uint16[],string,uint16[],uint8[]] - int 2 // type length - int 1 // head offset - callsub preArrayAccess - byte 0x0002000a000b - byte 0xFFFFFFFFFFFFFFFF - byte 0x0000FFFFFFFFFFFF // head update bitmask - int 1 // is first dynamic element - int 0 // is last dynamic element - int 8 // total head length - int 1 // startOfHeads - int 9 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 1 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 2 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 10 + itob + extract 6 0 + int 11 + itob + extract 6 0 + concat + byte 0x0002 + swap + concat + int 1 + callsub update_dynamic_tuple_element + dup // dup length difference + int 3 + callsub update_dynamic_head + dup // dup length difference + int 5 + callsub update_dynamic_head + dup // dup length difference + int 7 + callsub update_dynamic_head + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint8,uint16[],string,uint16[],uint8[]] - // tests/contracts/abi.algo.ts:412 + // tests/contracts/abi.algo.ts:406 // a[2] = 'Hello World!' frame_dig -1 // a: [uint8,uint16[],string,uint16[],uint8[]] - int 1 // type length - int 3 // head offset - callsub preArrayAccess - byte 0x000c48656c6c6f20576f726c6421 // Hello World! - byte 0xFFFFFFFFFFFFFFFF - byte 0x00000000FFFFFFFF // head update bitmask - int 0 // is first dynamic element - int 0 // is last dynamic element - int 8 // total head length - int 1 // startOfHeads - int 9 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 3 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + byte "Hello World!" + dup + len + itob + extract 6 2 + swap + concat + int 3 + callsub update_dynamic_tuple_element + dup // dup length difference + int 5 + callsub update_dynamic_head + dup // dup length difference + int 7 + callsub update_dynamic_head + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint8,uint16[],string,uint16[],uint8[]] - // tests/contracts/abi.algo.ts:413 + // tests/contracts/abi.algo.ts:407 // a[3] = [14, 15] frame_dig -1 // a: [uint8,uint16[],string,uint16[],uint8[]] - int 2 // type length - int 5 // head offset - callsub preArrayAccess - byte 0x0002000e000f - byte 0xFFFFFFFFFFFFFFFF - byte 0x000000000000FFFF // head update bitmask - int 0 // is first dynamic element - int 0 // is last dynamic element - int 8 // total head length - int 1 // startOfHeads - int 9 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 5 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 2 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 14 + itob + extract 6 0 + int 15 + itob + extract 6 0 + concat + byte 0x0002 + swap + concat + int 5 + callsub update_dynamic_tuple_element + dup // dup length difference + int 7 + callsub update_dynamic_head + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint8,uint16[],string,uint16[],uint8[]] - // tests/contracts/abi.algo.ts:414 + // tests/contracts/abi.algo.ts:408 // a[4] = [16, 17] frame_dig -1 // a: [uint8,uint16[],string,uint16[],uint8[]] - int 1 // type length - int 7 // head offset - callsub preArrayAccess - byte 0x00021011 - byte 0xFFFFFFFFFFFFFFFF - byte 0x0000000000000000 // head update bitmask - int 0 // is first dynamic element - int 1 // is last dynamic element - int 8 // total head length - int 1 // startOfHeads - int 9 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 7 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 16 + itob + extract 7 0 + int 17 + itob + extract 7 0 + concat + byte 0x0002 + swap + concat + int 7 + callsub update_dynamic_tuple_element + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint8,uint16[],string,uint16[],uint8[]] - // tests/contracts/abi.algo.ts:416 + // tests/contracts/abi.algo.ts:410 // return a; frame_dig -1 // a: [uint8,uint16[],string,uint16[],uint8[]] byte 0x151f7c75 @@ -3199,16 +4481,18 @@ abi_route_updateTupleWithOnlyDynamicTypes: updateTupleWithOnlyDynamicTypes: proto 1 0 - // tests/contracts/abi.algo.ts:420 + // tests/contracts/abi.algo.ts:414 // a: [uint16[], uint16[], uint16[]] = [[1], [2], [3]] - byte 0x // no static elements - store 11 // static elements - byte 0x0006 // head end - store 8 // dynamic head - int 6 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0006 + store 2 // head offset + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head int 1 itob extract 6 0 @@ -3217,20 +4501,20 @@ updateTupleWithOnlyDynamicTypes: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 2 itob extract 6 0 @@ -3239,89 +4523,176 @@ updateTupleWithOnlyDynamicTypes: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 3 itob extract 6 0 byte 0x0001 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -1 // a: [uint16[],uint16[],uint16[]] - // tests/contracts/abi.algo.ts:422 + // tests/contracts/abi.algo.ts:416 // a[0] = [4, 5] frame_dig -1 // a: [uint16[],uint16[],uint16[]] - int 2 // type length - int 0 // head offset - callsub preArrayAccess - byte 0x000200040005 - byte 0xFFFFFFFFFFFF - byte 0x0000FFFFFFFF // head update bitmask - int 1 // is first dynamic element - int 0 // is last dynamic element - int 6 // total head length - int 0 // startOfHeads - int 6 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 0 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 2 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 4 + itob + extract 6 0 + int 5 + itob + extract 6 0 + concat + byte 0x0002 + swap + concat + int 0 + callsub update_dynamic_tuple_element + dup // dup length difference + int 2 + callsub update_dynamic_head + dup // dup length difference + int 4 + callsub update_dynamic_head + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint16[],uint16[],uint16[]] - // tests/contracts/abi.algo.ts:423 + // tests/contracts/abi.algo.ts:417 // a[1] = [6, 7] frame_dig -1 // a: [uint16[],uint16[],uint16[]] - int 2 // type length - int 2 // head offset - callsub preArrayAccess - byte 0x000200060007 - byte 0xFFFFFFFFFFFF - byte 0x00000000FFFF // head update bitmask - int 0 // is first dynamic element - int 0 // is last dynamic element - int 6 // total head length - int 0 // startOfHeads - int 6 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 2 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 2 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 6 + itob + extract 6 0 + int 7 + itob + extract 6 0 + concat + byte 0x0002 + swap + concat + int 2 + callsub update_dynamic_tuple_element + dup // dup length difference + int 4 + callsub update_dynamic_head + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint16[],uint16[],uint16[]] - // tests/contracts/abi.algo.ts:424 + // tests/contracts/abi.algo.ts:418 // a[2] = [8, 9] frame_dig -1 // a: [uint16[],uint16[],uint16[]] - int 2 // type length - int 4 // head offset - callsub preArrayAccess - byte 0x000200080009 - byte 0xFFFFFFFFFFFF - byte 0x000000000000 // head update bitmask - int 0 // is first dynamic element - int 1 // is last dynamic element - int 6 // total head length - int 0 // startOfHeads - int 6 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 4 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 2 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 8 + itob + extract 6 0 + int 9 + itob + extract 6 0 + concat + byte 0x0002 + swap + concat + int 4 + callsub update_dynamic_tuple_element + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint16[],uint16[],uint16[]] - // tests/contracts/abi.algo.ts:426 + // tests/contracts/abi.algo.ts:420 // return a; frame_dig -1 // a: [uint16[],uint16[],uint16[]] byte 0x151f7c75 @@ -3347,16 +4718,18 @@ abi_route_shortenDynamicElementInTuple: shortenDynamicElementInTuple: proto 1 0 - // tests/contracts/abi.algo.ts:430 + // tests/contracts/abi.algo.ts:424 // a: [uint16[], uint16[], uint16[]] = [[1, 2], [2, 3], [3, 4]] - byte 0x // no static elements - store 11 // static elements - byte 0x0006 // head end - store 8 // dynamic head - int 6 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0006 + store 2 // head offset + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head int 1 itob extract 6 0 @@ -3369,20 +4742,20 @@ shortenDynamicElementInTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 2 itob extract 6 0 @@ -3395,20 +4768,20 @@ shortenDynamicElementInTuple: concat dup len - load 9 // dynamic head offset + load 2 // head offset + btoi + - dup - store 9 // dynamic head offset itob extract 6 2 - load 8 // dynamic head + store 2 // head offset + load 1 // tuple tail swap concat - store 8 // dynamic head - load 10 // dynamic elements - swap + store 1 // tuple tail + load 0 // tuple head + load 2 // head offset concat - store 10 // dynamic elements + store 0 // tuple head int 3 itob extract 6 0 @@ -3419,72 +4792,147 @@ shortenDynamicElementInTuple: byte 0x0002 swap concat - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements - concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -1 // a: [uint16[],uint16[],uint16[]] - // tests/contracts/abi.algo.ts:432 + // tests/contracts/abi.algo.ts:426 // a[0] = [5] frame_dig -1 // a: [uint16[],uint16[],uint16[]] - int 2 // type length - int 0 // head offset - callsub preArrayAccess - byte 0x00010005 - byte 0xFFFFFFFFFFFF - byte 0x0000FFFFFFFF // head update bitmask - int 1 // is first dynamic element - int 0 // is last dynamic element - int 6 // total head length - int 0 // startOfHeads - int 6 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 0 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 2 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 5 + itob + extract 6 0 + byte 0x0001 + swap + concat + int 0 + callsub update_dynamic_tuple_element + dup // dup length difference + int 2 + callsub update_dynamic_head + dup // dup length difference + int 4 + callsub update_dynamic_head + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: [uint16[],uint16[],uint16[]] - // tests/contracts/abi.algo.ts:433 + // tests/contracts/abi.algo.ts:427 // a[1] = [6] frame_dig -1 // a: [uint16[],uint16[],uint16[]] - int 2 // type length - int 2 // head offset - callsub preArrayAccess - byte 0x00010006 - byte 0xFFFFFFFFFFFF - byte 0x00000000FFFF // head update bitmask - int 0 // is first dynamic element - int 0 // is last dynamic element - int 6 // total head length - int 0 // startOfHeads - int 6 // head end - callsub updateDynamicElement - frame_bury -1 // a: [uint16[],uint16[],uint16[]] - - // tests/contracts/abi.algo.ts:434 - // a[2] = [7] - frame_dig -1 // a: [uint16[],uint16[],uint16[]] - int 2 // type length - int 4 // head offset - callsub preArrayAccess - byte 0x00010007 - byte 0xFFFFFFFFFFFF - byte 0x000000000000 // head update bitmask - int 0 // is first dynamic element - int 1 // is last dynamic element - int 6 // total head length - int 0 // startOfHeads - int 6 // head end - callsub updateDynamicElement - frame_bury -1 // a: [uint16[],uint16[],uint16[]] - - // tests/contracts/abi.algo.ts:436 - // return a; - frame_dig -1 // a: [uint16[],uint16[],uint16[]] - byte 0x151f7c75 + dup + store 3 // full tuple + int 2 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 2 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 6 + itob + extract 6 0 + byte 0x0001 + swap + concat + int 2 + callsub update_dynamic_tuple_element + dup // dup length difference + int 4 + callsub update_dynamic_head + pop // pop length difference + load 3 // full tuple + frame_bury -1 // a: [uint16[],uint16[],uint16[]] + + // tests/contracts/abi.algo.ts:428 + // a[2] = [7] + frame_dig -1 // a: [uint16[],uint16[],uint16[]] + dup + store 3 // full tuple + int 4 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 2 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 7 + itob + extract 6 0 + byte 0x0001 + swap + concat + int 4 + callsub update_dynamic_tuple_element + pop // pop length difference + load 3 // full tuple + frame_bury -1 // a: [uint16[],uint16[],uint16[]] + + // tests/contracts/abi.algo.ts:430 + // return a; + frame_dig -1 // a: [uint16[],uint16[],uint16[]] + byte 0x151f7c75 swap concat log @@ -3507,39 +4955,71 @@ abi_route_namedTuple: namedTuple: proto 1 0 - // tests/contracts/abi.algo.ts:440 + // tests/contracts/abi.algo.ts:434 // a: { - byte 0x0001 - store 11 // static elements - byte 0x0004 // head end - store 8 // dynamic head - int 4 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements - byte 0x000c48656c6c6f20576f726c6421 // Hello World! - load 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0004 + store 2 // head offset + load 0 // tuple head + int 1 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head + byte "Hello World!" + dup + len + itob + extract 6 2 swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail + swap concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -1 // a: { foo: uint16, bar: string, } - // tests/contracts/abi.algo.ts:448 + // tests/contracts/abi.algo.ts:442 // return a.bar; frame_dig -1 // a: { foo: uint16, bar: string, } - int 1 // type length - int 2 // head offset - callsub preArrayAccess - load 0 // full tuple - load 1 // array offset - load 2 // full array length + dup + store 3 // full tuple + int 2 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length extract3 - extract 2 0 // extract bytes from string + extract 2 0 dup len itob @@ -3569,56 +5049,109 @@ abi_route_updateNamedTuple: updateNamedTuple: proto 1 0 - // tests/contracts/abi.algo.ts:452 + // tests/contracts/abi.algo.ts:446 // a: { - byte 0x0001 - store 11 // static elements - byte 0x0004 // head end - store 8 // dynamic head - int 4 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements - byte 0x000348693f // Hi? - load 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0004 + store 2 // head offset + load 0 // tuple head + int 1 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head + byte "Hi?" + dup + len + itob + extract 6 2 swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail + swap concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -1 // a: { foo: uint16, bar: string, } - // tests/contracts/abi.algo.ts:460 + // tests/contracts/abi.algo.ts:454 // a.bar = 'Hello World!' frame_dig -1 // a: { foo: uint16, bar: string, } - int 1 // type length - int 2 // head offset - callsub preArrayAccess - byte 0x000c48656c6c6f20576f726c6421 // Hello World! - byte 0xFFFF - byte 0x0000 // head update bitmask - int 1 // is first dynamic element - int 1 // is last dynamic element - int 2 // total head length - int 2 // startOfHeads - int 4 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 2 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + byte "Hello World!" + dup + len + itob + extract 6 2 + swap + concat + int 2 + callsub update_dynamic_tuple_element + pop // pop length difference + load 3 // full tuple frame_bury -1 // a: { foo: uint16, bar: string, } - // tests/contracts/abi.algo.ts:462 + // tests/contracts/abi.algo.ts:456 // return a.bar; frame_dig -1 // a: { foo: uint16, bar: string, } - int 1 // type length - int 2 // head offset - callsub preArrayAccess - load 0 // full tuple - load 1 // array offset - load 2 // full array length + dup + store 3 // full tuple + int 2 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length extract3 - extract 2 0 // extract bytes from string + extract 2 0 dup len itob @@ -3648,56 +5181,109 @@ abi_route_customTypes: customTypes: proto 1 0 - // tests/contracts/abi.algo.ts:466 + // tests/contracts/abi.algo.ts:460 // aa: CustomType = { - byte 0x0001 - store 11 // static elements - byte 0x0004 // head end - store 8 // dynamic head - int 4 - store 9 // dynamic head offset byte 0x - store 10 // dynamic elements - byte 0x000348693f // Hi? - load 10 // dynamic elements + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0004 + store 2 // head offset + load 0 // tuple head + int 1 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head + byte "Hi?" + dup + len + itob + extract 6 2 swap concat - store 10 // dynamic elements - load 11 // static elements - load 8 // dynamic head - load 10 // dynamic elements + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail + swap concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail concat frame_bury -1 // aa: CustomType - // tests/contracts/abi.algo.ts:471 + // tests/contracts/abi.algo.ts:465 // aa.bar = 'Hello World!' frame_dig -1 // aa: CustomType - int 1 // type length - int 2 // head offset - callsub preArrayAccess - byte 0x000c48656c6c6f20576f726c6421 // Hello World! - byte 0xFFFF - byte 0x0000 // head update bitmask - int 1 // is first dynamic element - int 1 // is last dynamic element - int 2 // total head length - int 2 // startOfHeads - int 4 // head end - callsub updateDynamicElement + dup + store 3 // full tuple + int 2 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + byte "Hello World!" + dup + len + itob + extract 6 2 + swap + concat + int 2 + callsub update_dynamic_tuple_element + pop // pop length difference + load 3 // full tuple frame_bury -1 // aa: CustomType - // tests/contracts/abi.algo.ts:473 + // tests/contracts/abi.algo.ts:467 // return aa.bar; frame_dig -1 // aa: CustomType - int 1 // type length - int 2 // head offset - callsub preArrayAccess - load 0 // full tuple - load 1 // array offset - load 2 // full array length + dup + store 3 // full tuple + int 2 + swap + dupn 2 + uncover 3 + int 2 extract3 - extract 2 0 // extract bytes from string + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + extract 2 0 dup len itob @@ -3727,17 +5313,31 @@ abi_route_staticStringArrayArg: staticStringArrayArg: proto 1 0 - // tests/contracts/abi.algo.ts:477 + // tests/contracts/abi.algo.ts:471 // return a[1]; frame_dig -1 // a: bytes[3] - int 1 // type length - int 2 // head offset - callsub preArrayAccess - load 0 // full tuple - load 1 // array offset - load 2 // full array length + dup + store 3 // full tuple + int 1 + int 2 + * + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length extract3 - extract 2 0 // extract bytes from string + extract 2 0 dup len itob @@ -3768,24 +5368,36 @@ abi_route_dynamicAccessOfDynamicElementInStaticArray: dynamicAccessOfDynamicElementInStaticArray: proto 2 0 - // tests/contracts/abi.algo.ts:481 + // tests/contracts/abi.algo.ts:475 // i = 1 int 1 frame_bury -2 // i: uint64 - // tests/contracts/abi.algo.ts:482 + // tests/contracts/abi.algo.ts:476 // return a[i]; frame_dig -1 // a: bytes[3] - int 1 // type length + dup + store 3 // full tuple frame_dig -2 // i: uint64 int 2 - * // head offset - callsub preArrayAccess - load 0 // full tuple - load 1 // array offset - load 2 // full array length + * + swap + dupn 2 + uncover 3 + int 2 extract3 - extract 2 0 // extract bytes from string + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + extract 2 0 dup len itob @@ -3798,7 +5410,7 @@ dynamicAccessOfDynamicElementInStaticArray: log retsub -abi_route_txnTypes: +abi_route_dynamicArrayInMiddleOfTuple: txn OnCompletion int NoOp == @@ -3807,69 +5419,368 @@ abi_route_txnTypes: != && assert - txn GroupIndex + byte 0x + callsub dynamicArrayInMiddleOfTuple int 1 - - - txn GroupIndex + return + +dynamicArrayInMiddleOfTuple: + proto 1 0 + + // tests/contracts/abi.algo.ts:480 + // a: [uint16, uint8[], uint16] = [1, [2], 3] + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0006 + store 2 // head offset + load 0 // tuple head + int 1 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head int 2 - - - txn GroupIndex + itob + extract 7 0 + byte 0x0001 + swap + concat + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail + swap + concat + store 1 // tuple tail + load 0 // tuple head int 3 - - - txn GroupIndex - int 4 - - - txn GroupIndex - int 5 - - - txn GroupIndex - int 6 - - - txn GroupIndex - int 7 - - - callsub txnTypes - int 1 - return + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + frame_bury -1 // a: [uint16,uint8[],uint16] -txnTypes: - proto 7 0 + // tests/contracts/abi.algo.ts:482 + // return a; + frame_dig -1 // a: [uint16,uint8[],uint16] + byte 0x151f7c75 + swap + concat + log + retsub - // tests/contracts/abi.algo.ts:506 - // assert(t.sender === a.sender) - frame_dig -1 // t: txn - gtxns Sender - frame_dig -2 // a: appl - gtxns Sender +abi_route_accessDynamicArrayInMiddleOfTuple: + txn OnCompletion + int NoOp == + txn ApplicationID + int 0 + != + && assert + byte 0x + callsub accessDynamicArrayInMiddleOfTuple + int 1 + return - // tests/contracts/abi.algo.ts:507 - // assert(ac.sender === af.sender) - frame_dig -3 // ac: acfg - gtxns Sender - frame_dig -4 // af: afrz - gtxns Sender - == - assert +accessDynamicArrayInMiddleOfTuple: + proto 1 0 + + // tests/contracts/abi.algo.ts:486 + // a: [uint16, uint8[], uint16] = [1, [2], 3] + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0006 + store 2 // head offset + load 0 // tuple head + int 1 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head + int 2 + itob + extract 7 0 + byte 0x0001 + swap + concat + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail + swap + concat + store 1 // tuple tail + load 0 // tuple head + int 3 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + frame_bury -1 // a: [uint16,uint8[],uint16] - // tests/contracts/abi.algo.ts:508 - // assert(at.sender === kr.sender) - frame_dig -5 // at: axfer - gtxns Sender - frame_dig -6 // kr: keyreg - gtxns Sender + // tests/contracts/abi.algo.ts:488 + // return a[1]; + frame_dig -1 // a: [uint16,uint8[],uint16] + dup + store 3 // full tuple + int 2 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + byte 0x151f7c75 + swap + concat + log + retsub + +abi_route_accessDynamicArrayElementInTuple: + txn OnCompletion + int NoOp == + txn ApplicationID + int 0 + != + && assert + byte 0x + callsub accessDynamicArrayElementInTuple + int 1 + return + +accessDynamicArrayElementInTuple: + proto 1 0 - // tests/contracts/abi.algo.ts:509 - // assert(p.sender === t.sender) - frame_dig -7 // p: pay - gtxns Sender - frame_dig -1 // t: txn - gtxns Sender + // tests/contracts/abi.algo.ts:492 + // a: [uint16, uint8[]] = [11, [22, 33, 44]] + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0004 + store 2 // head offset + load 0 // tuple head + int 11 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head + int 22 + itob + extract 7 0 + int 33 + itob + extract 7 0 + concat + int 44 + itob + extract 7 0 + concat + byte 0x0003 + swap + concat + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail + swap + concat + store 1 // tuple tail + load 0 // tuple head + load 1 // tuple tail + concat + frame_bury -1 // a: [uint16,uint8[]] + + // tests/contracts/abi.algo.ts:494 + // return a[1][1]; + frame_dig -1 // a: [uint16,uint8[]] + dup + store 3 // full tuple + int 2 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + int 1 + int 1 // element length + * // element offset + int 2 + + // add two for length + + + int 1 + extract3 + byte 0xFFFFFFFF + b& + byte 0x151f7c75 + swap + concat + log + retsub + +abi_route_updateDynamicArrayInMiddleOfTuple: + txn OnCompletion + int NoOp == + txn ApplicationID + int 0 + != + && assert + byte 0x + callsub updateDynamicArrayInMiddleOfTuple + int 1 + return + +updateDynamicArrayInMiddleOfTuple: + proto 1 0 + + // tests/contracts/abi.algo.ts:498 + // a: [uint16, uint8[], uint16] = [1, [2], 3] + byte 0x + dup + store 0 // tuple head + store 1 // tuple tail + byte 0x0006 + store 2 // head offset + load 0 // tuple head + int 1 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 2 // head offset + concat + store 0 // tuple head + int 2 + itob + extract 7 0 + byte 0x0001 + swap + concat + dup + len + load 2 // head offset + btoi + + + itob + extract 6 2 + store 2 // head offset + load 1 // tuple tail + swap + concat + store 1 // tuple tail + load 0 // tuple head + int 3 + itob + extract 6 0 + concat + store 0 // tuple head + load 0 // tuple head + load 1 // tuple tail + concat + frame_bury -1 // a: [uint16,uint8[],uint16] + + // tests/contracts/abi.algo.ts:500 + // a[1] = [4, 5] + frame_dig -1 // a: [uint16,uint8[],uint16] + dup + store 3 // full tuple + int 2 + swap + dupn 2 + uncover 3 + int 2 + extract3 + btoi // start of dynamic array + dup + cover 2 // duplicate start for later + int 2 + extract3 // extract length of array + btoi + int 1 + * // get array length + int 2 + + // add two for length + extract3 + store 4 // old tuple element + load 4 // old tuple element + len // length of old element + int 4 + itob + extract 7 0 + int 5 + itob + extract 7 0 + concat + byte 0x0002 + swap + concat + int 2 + callsub update_dynamic_tuple_element + pop // pop length difference + load 3 // full tuple + frame_bury -1 // a: [uint16,uint8[],uint16] + + // tests/contracts/abi.algo.ts:502 + // return a; + frame_dig -1 // a: [uint16,uint8[],uint16] + byte 0x151f7c75 + swap + concat + log retsub main: @@ -3940,6 +5851,9 @@ route_abi: method "customTypes()string" method "staticStringArrayArg(string[3])string" method "dynamicAccessOfDynamicElementInStaticArray(string[3])string" - method "txnTypes(txn,appl,acfg,afrz,axfer,keyreg,pay)void" + method "dynamicArrayInMiddleOfTuple()(uint16,uint8[],uint16)" + method "accessDynamicArrayInMiddleOfTuple()uint8[]" + method "accessDynamicArrayElementInTuple()uint32" + method "updateDynamicArrayInMiddleOfTuple()(uint16,uint8[],uint16)" txna ApplicationArgs 0 - match abi_route_staticArray abi_route_returnStaticArray abi_route_staticArrayArg abi_route_nonLiteralStaticArrayElements abi_route_mixedStaticArrayElements abi_route_nonLiteralStaticArrayAccess abi_route_setStaticArrayElement abi_route_staticArrayInStorageRef abi_route_updateStaticArrayInStorageRef abi_route_staticArrayInStorageMap abi_route_updateStaticArrayInStorageMap abi_route_nestedStaticArray abi_route_updateNestedStaticArrayElement abi_route_updateNestedStaticArray abi_route_threeDimensionalUint16Array abi_route_simpleTuple abi_route_arrayInTuple abi_route_tupleInArray abi_route_tupleInTuple abi_route_shortTypeNotation abi_route_disgusting abi_route_returnTuple abi_route_tupleArg abi_route_dynamicArray abi_route_returnDynamicArray abi_route_dynamicArrayArg abi_route_updateDynamicArrayElement abi_route_dynamicTupleArray abi_route_returnTupleWithDyamicArray abi_route_returnDynamicArrayFromTuple abi_route_updateDynamicArrayInTuple abi_route_nonLiteralDynamicElementInTuple abi_route_arrayPush abi_route_arrayPop abi_route_arrayPopValue abi_route_arraySplice abi_route_arraySpliceValue abi_route_dynamicArrayElements abi_route_spliceLastElement abi_route_spliceLastElementValue abi_route_spliceFirstElement abi_route_spliceFirstElementValue abi_route_stringReturn abi_route_stringArg abi_route_stringInTuple abi_route_accesStringInTuple abi_route_updateStringInTuple abi_route_updateTupleWithOnlyDynamicTypes abi_route_shortenDynamicElementInTuple abi_route_namedTuple abi_route_updateNamedTuple abi_route_customTypes abi_route_staticStringArrayArg abi_route_dynamicAccessOfDynamicElementInStaticArray abi_route_txnTypes \ No newline at end of file + match abi_route_staticArray abi_route_returnStaticArray abi_route_staticArrayArg abi_route_nonLiteralStaticArrayElements abi_route_mixedStaticArrayElements abi_route_nonLiteralStaticArrayAccess abi_route_setStaticArrayElement abi_route_staticArrayInStorageRef abi_route_updateStaticArrayInStorageRef abi_route_staticArrayInStorageMap abi_route_updateStaticArrayInStorageMap abi_route_nestedStaticArray abi_route_updateNestedStaticArrayElement abi_route_updateNestedStaticArray abi_route_threeDimensionalUint16Array abi_route_simpleTuple abi_route_arrayInTuple abi_route_tupleInArray abi_route_tupleInTuple abi_route_shortTypeNotation abi_route_disgusting abi_route_returnTuple abi_route_tupleArg abi_route_dynamicArray abi_route_returnDynamicArray abi_route_dynamicArrayArg abi_route_updateDynamicArrayElement abi_route_dynamicTupleArray abi_route_returnTupleWithDyamicArray abi_route_returnDynamicArrayFromTuple abi_route_updateDynamicArrayInTuple abi_route_nonLiteralDynamicElementInTuple abi_route_arrayPush abi_route_arrayPop abi_route_arrayPopValue abi_route_arraySplice abi_route_arraySpliceValue abi_route_dynamicArrayElements abi_route_spliceLastElement abi_route_spliceLastElementValue abi_route_spliceFirstElement abi_route_spliceFirstElementValue abi_route_stringReturn abi_route_stringArg abi_route_stringInTuple abi_route_accesStringInTuple abi_route_updateStringInTuple abi_route_updateTupleWithOnlyDynamicTypes abi_route_shortenDynamicElementInTuple abi_route_namedTuple abi_route_updateNamedTuple abi_route_customTypes abi_route_staticStringArrayArg abi_route_dynamicAccessOfDynamicElementInStaticArray abi_route_dynamicArrayInMiddleOfTuple abi_route_accessDynamicArrayInMiddleOfTuple abi_route_accessDynamicArrayElementInTuple abi_route_updateDynamicArrayInMiddleOfTuple \ No newline at end of file diff --git a/tests/contracts/AbiTest.json b/tests/contracts/AbiTest.json index 6bd421adf..54198b283 100644 --- a/tests/contracts/AbiTest.json +++ b/tests/contracts/AbiTest.json @@ -1 +1 @@ -{"hints":{},"schema":{"local":{"declared":{"lRef":{"type":"bytes","key":"lRef"},"lMap":{"type":"bytes","key":"lMap"}},"reserved":{}},"global":{"declared":{"gRef":{"type":"bytes","key":"gRef"},"gMap":{"type":"bytes","key":"gMap"}},"reserved":{}}},"state":{"global":{"num_byte_slices":2,"num_uints":0},"local":{"num_byte_slices":2,"num_uints":0}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKcHJlQXJyYXlBY2Nlc3M6Cglwcm90byAzIDAKCWZyYW1lX2RpZyAtMyAvLyBmdWxsIHR1cGxlCglzdG9yZSAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZCBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgYXJyYXkgb2Zmc2V0CglzdG9yZSAxIC8vIGFycmF5IG9mZnNldAoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgYXJyYXkgbGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gdHlwZSBsZW5ndGgKCSogLy8gYXJyYXkgc2l6ZQoJaW50IDIKCSsgLy8gYXJyYXkgc2l6ZSArIGxlbgoJc3RvcmUgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJcmV0c3ViCgp1cGRhdGVEeW5hbWljRWxlbWVudDoKCXByb3RvIDggMQoJZnJhbWVfZGlnIC04IC8vIG5ld0FycmF5CglzdG9yZSA2IC8vIG5ldyBhcnJheQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWludCAwCglmcmFtZV9kaWcgLTIgLy8gc3RhcnRPZkhlYWRzCglleHRyYWN0MwoJc3RvcmUgMyAvLyBzdGF0aWMgcGFydCBvZiB0dXBsZQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2RpZyAtMiAvLyBzdGFydE9mSGVhZHMKCWZyYW1lX2RpZyAtMyAvLyB0b3RhbEhlYWRMZW5ndGgKCWV4dHJhY3QzIAoJc3RvcmUgNCAvLyBkeW5hbWljIGhlYWRzCglieXRlIDB4CglkdXAKCXN0b3JlIDUgLy8gdmFsdWVzIGFmdGVyIGFycmF5CglzdG9yZSA3IC8vIHZhbHVlcyBiZWZvcmUgYXJyYXkKCWZyYW1lX2RpZyAtNCAvLyBsYXN0RHluYW1pY0VsZW1lbnQKCWJueiBza2lwX3ZhbHVlc19hZnRlcl9hcnJheQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJKwoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxlbgoJc3Vic3RyaW5nMwoJc3RvcmUgNSAvLyB2YWx1ZXMgYWZ0ZXIgYXJyYXkKCnNraXBfdmFsdWVzX2FmdGVyX2FycmF5OgoJZnJhbWVfZGlnIC01IC8vIGZpcnN0RHluYW1pY0VsZW1lbnQKCWJueiBza2lwX3ZhbHVlc19iZWZvcmVfYXJyYXkKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZEVuZAoJbG9hZCAxIC8vIGFycmF5IG9mZnNldAoJc3Vic3RyaW5nMwoJc3RvcmUgNyAvLyB2YWx1ZXMgYmVmb3JlIGFycmF5Cgpza2lwX3ZhbHVlc19iZWZvcmVfYXJyYXk6Cglsb2FkIDQgLy8gZHluYW1pYyBoZWFkcwoJZnJhbWVfZGlnIC02IC8vIGhlYWRVcGRhdGVCaXRtYXNrCglsb2FkIDYgLy8gbmV3IGFycmF5CglsZW4KCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJbG9hZCA2IC8vIG5ldyBhcnJheQoJbGVuCglsb2FkIDIgLy8gZnVsbCBhcnJheSBsZW5ndGgKCT49Cglibnogc2tpcF9sZW5fc3dhcAoJc3dhcAoKc2tpcF9sZW5fc3dhcDoKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglkdXAKCWNvbmNhdAoJZHVwCgljb25jYXQKCWR1cAoJY29uY2F0CglkdXAKCWNvbmNhdAoJZHVwCgljb25jYXQKCWImCglsb2FkIDYgLy8gbmV3IGFycmF5CglsZW4KCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJPj0KCWJueiBhZGRfaGVhZAoJYi0KCWIgc3ViX29yX2FkZF9oZWFkX2VuZAoKYWRkX2hlYWQ6CgliKwoKc3ViX29yX2FkZF9oZWFkX2VuZDoKCWZyYW1lX2RpZyAtNyAvLyBmdWxsSGVhZEJpdG1hc2sKCWImCglzdG9yZSA0IC8vIGR5bmFtaWMgaGVhZHMKCWxvYWQgMyAvLyBzdGF0aWMgcGFydCBvZiB0dXBsZQoJbG9hZCA0IC8vIGR5bmFtaWMgaGVhZHMKCWxvYWQgNyAvLyB2YWx1ZXMgYmVmb3JlIGFycmF5Cglsb2FkIDYgLy8gbmV3IGFycmF5Cglsb2FkIDUgLy8gdmFsdWVzIGFmdGVyIGFycmF5Cgljb25jYXQKCWNvbmNhdAoJY29uY2F0Cgljb25jYXQKCXJldHN1YgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgY3JlYXRlCglpbnQgMQoJcmV0dXJuCgpjcmVhdGU6Cglwcm90byAwIDAKCXJldHN1YgoKYmFyZV9yb3V0ZV9PcHRJbjoKCXR4biBPbkNvbXBsZXRpb24KCWludCBPcHRJbgoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgb3B0SW4KCWludCAxCglyZXR1cm4KCm9wdEluOgoJcHJvdG8gMCAwCglyZXRzdWIKCmFiaV9yb3V0ZV9zdGF0aWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBzdGF0aWNBcnJheQoJaW50IDEKCXJldHVybgoKc3RhdGljQXJyYXk6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzUKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDBiMDAwMDAwMDAwMDAwMDAxNjAwMDAwMDAwMDAwMDAwMjEKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM3CgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWludCA4IC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9yZXR1cm5TdGF0aWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiByZXR1cm5TdGF0aWNBcnJheQoJaW50IDEKCXJldHVybgoKcmV0dXJuU3RhdGljQXJyYXk6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDEKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDBiMDAwMDAwMDAwMDAwMDAxNjAwMDAwMDAwMDAwMDAwMjEKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQzCgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3N0YXRpY0FycmF5QXJnOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCgljYWxsc3ViIHN0YXRpY0FycmF5QXJnCglpbnQgMQoJcmV0dXJuCgpzdGF0aWNBcnJheUFyZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NwoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfbm9uTGl0ZXJhbFN0YXRpY0FycmF5RWxlbWVudHM6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMwoJY2FsbHN1YiBub25MaXRlcmFsU3RhdGljQXJyYXlFbGVtZW50cwoJaW50IDEKCXJldHVybgoKbm9uTGl0ZXJhbFN0YXRpY0FycmF5RWxlbWVudHM6Cglwcm90byA0IDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NTEKCS8vIG4xID0gMTEKCWludCAxMQoJZnJhbWVfYnVyeSAtMSAvLyBuMTogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjUyCgkvLyBuMiA9IDIyCglpbnQgMjIKCWZyYW1lX2J1cnkgLTIgLy8gbjI6IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo1MwoJLy8gbjMgPSAzMwoJaW50IDMzCglmcmFtZV9idXJ5IC0zIC8vIG4zOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NTQKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbbjEsIG4yLCBuM10KCWZyYW1lX2RpZyAtMSAvLyBuMTogdWludDY0CglpdG9iCglmcmFtZV9kaWcgLTIgLy8gbjI6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTMgLy8gbjM6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC00IC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo1NgoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTQgLy8gYTogdWludDY0WzNdCglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfbWl4ZWRTdGF0aWNBcnJheUVsZW1lbnRzOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDMKCWNhbGxzdWIgbWl4ZWRTdGF0aWNBcnJheUVsZW1lbnRzCglpbnQgMQoJcmV0dXJuCgptaXhlZFN0YXRpY0FycmF5RWxlbWVudHM6Cglwcm90byA0IDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NjAKCS8vIG4xID0gMwoJaW50IDMKCWZyYW1lX2J1cnkgLTEgLy8gbjE6IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo2MQoJLy8gbjIgPSA0CglpbnQgNAoJZnJhbWVfYnVyeSAtMiAvLyBuMjogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjYyCgkvLyBuMyA9IDUKCWludCA1CglmcmFtZV9idXJ5IC0zIC8vIG4zOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NjMKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgOT4gPSBbMCwgMSwgMiwgbjEsIG4yLCBuMywgNiwgNywgOF0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIKCWZyYW1lX2RpZyAtMSAvLyBuMTogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMiAvLyBuMjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBuMzogdWludDY0CglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDA2MDAwMDAwMDAwMDAwMDAwNzAwMDAwMDAwMDAwMDAwMDgKCWNvbmNhdAoJZnJhbWVfYnVyeSAtNCAvLyBhOiB1aW50NjRbOV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NjUKCS8vIHJldHVybiBhWzFdICsgYVs0XSArIGFbN107CglmcmFtZV9kaWcgLTQgLy8gYTogdWludDY0WzldCglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJZnJhbWVfZGlnIC00IC8vIGE6IHVpbnQ2NFs5XQoJaW50IDMyIC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCgkrCglmcmFtZV9kaWcgLTQgLy8gYTogdWludDY0WzldCglpbnQgNTYgLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCSsKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX25vbkxpdGVyYWxTdGF0aWNBcnJheUFjY2VzczoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwCgljYWxsc3ViIG5vbkxpdGVyYWxTdGF0aWNBcnJheUFjY2VzcwoJaW50IDEKCXJldHVybgoKbm9uTGl0ZXJhbFN0YXRpY0FycmF5QWNjZXNzOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjY5CgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo3MAoJLy8gbiA9IDIKCWludCAyCglmcmFtZV9idXJ5IC0yIC8vIG46IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo3MgoJLy8gcmV0dXJuIGFbbl07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglmcmFtZV9kaWcgLTIgLy8gbjogdWludDY0CglpbnQgOAoJKgoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zZXRTdGF0aWNBcnJheUVsZW1lbnQ6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgc2V0U3RhdGljQXJyYXlFbGVtZW50CglpbnQgMQoJcmV0dXJuCgpzZXRTdGF0aWNBcnJheUVsZW1lbnQ6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NzYKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDBiMDAwMDAwMDAwMDAwMDAxNjAwMDAwMDAwMDAwMDAwMjEKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjc4CgkvLyBhWzFdID0gMjIyCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglpbnQgOCAvLyBvZmZzZXQKCWludCAyMjIKCWl0b2IKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo4MAoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3RhdGljQXJyYXlJblN0b3JhZ2VSZWY6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cAoJY2FsbHN1YiBzdGF0aWNBcnJheUluU3RvcmFnZVJlZgoJaW50IDEKCXJldHVybgoKc3RhdGljQXJyYXlJblN0b3JhZ2VSZWY6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6ODQKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDBiMDAwMDAwMDAwMDAwMDAxNjAwMDAwMDAwMDAwMDAwMjEKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjg2CgkvLyB0aGlzLmdSZWYucHV0KGEpCglieXRlICJnUmVmIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYXBwX2dsb2JhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6ODcKCS8vIHRoaXMubFJlZi5wdXQodGhpcy50eG4uc2VuZGVyLCBhKQoJdHhuIFNlbmRlcgoJYnl0ZSAibFJlZiIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9sb2NhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6ODgKCS8vIHRoaXMuYlJlZi5wdXQoYSkKCWJ5dGUgImJSZWYiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglib3hfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjkwCgkvLyByZXQ6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbCglieXRlICJnUmVmIgoJYXBwX2dsb2JhbF9nZXQKCWludCA4IC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCgl0eG4gU2VuZGVyCglieXRlICJsUmVmIgoJYXBwX2xvY2FsX2dldAoJaW50IDggLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJYnl0ZSAiYlJlZiIKCWJveF9nZXQKCWFzc2VydAoJaW50IDggLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMiAvLyByZXQ6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo5NgoJLy8gcmV0dXJuIHJldDsKCWZyYW1lX2RpZyAtMiAvLyByZXQ6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VSZWY6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cAoJY2FsbHN1YiB1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZVJlZgoJaW50IDEKCXJldHVybgoKdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VSZWY6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTAwCgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMDIKCS8vIHRoaXMuZ1JlZi5wdXQoYSkKCWJ5dGUgImdSZWYiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfZ2xvYmFsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMDMKCS8vIHRoaXMubFJlZi5wdXQodGhpcy50eG4uc2VuZGVyLCBhKQoJdHhuIFNlbmRlcgoJYnl0ZSAibFJlZiIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9sb2NhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTA0CgkvLyB0aGlzLmJSZWYucHV0KGEpCglieXRlICJiUmVmIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMDYKCS8vIHRoaXMuZ1JlZi5nZXQoKVsxXSA9IDExMQoJYnl0ZSAiZ1JlZiIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgOCAvLyBvZmZzZXQKCWludCAxMTEKCWl0b2IKCXJlcGxhY2UzCglieXRlICJnUmVmIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTA3CgkvLyB0aGlzLmxSZWYuZ2V0KHRoaXMudHhuLnNlbmRlcilbMV0gPSAyMjIKCXR4biBTZW5kZXIKCWJ5dGUgImxSZWYiCglhcHBfbG9jYWxfZ2V0CglpbnQgOCAvLyBvZmZzZXQKCWludCAyMjIKCWl0b2IKCXJlcGxhY2UzCgl0eG4gU2VuZGVyCglieXRlICJsUmVmIgoJdW5jb3ZlciAyCglhcHBfbG9jYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEwOAoJLy8gdGhpcy5iUmVmLmdldCgpWzFdID0gMzMzCglieXRlICJiUmVmIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgOCAvLyBvZmZzZXQKCWludCAzMzMKCWl0b2IKCXJlcGxhY2UzCglieXRlICJiUmVmIgoJc3dhcAoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMTAKCS8vIHJldDogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsKCWJ5dGUgImdSZWYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDggLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCXR4biBTZW5kZXIKCWJ5dGUgImxSZWYiCglhcHBfbG9jYWxfZ2V0CglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlICJiUmVmIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIHJldDogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjExNgoJLy8gcmV0dXJuIHJldDsKCWZyYW1lX2RpZyAtMiAvLyByZXQ6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cAoJY2FsbHN1YiBzdGF0aWNBcnJheUluU3RvcmFnZU1hcAoJaW50IDEKCXJldHVybgoKc3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTIwCgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMjIKCS8vIHRoaXMuZ01hcC5wdXQoJ2dNYXAnLCBhKQoJYnl0ZSAiZ01hcCIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9nbG9iYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEyMwoJLy8gdGhpcy5sTWFwLnB1dCh0aGlzLnR4bi5zZW5kZXIsICdsTWFwJywgYSkKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfbG9jYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEyNAoJLy8gdGhpcy5iTWFwLnB1dCgnYk1hcCcsIGEpCglieXRlICJiTWFwIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMjYKCS8vIHJldDogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsKCWJ5dGUgImdNYXAiCglhcHBfZ2xvYmFsX2dldAoJaW50IDggLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglhcHBfbG9jYWxfZ2V0CglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlICJiTWFwIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIHJldDogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEzMgoJLy8gcmV0dXJuIHJldDsKCWZyYW1lX2RpZyAtMiAvLyByZXQ6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cAoJY2FsbHN1YiB1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZU1hcAoJaW50IDEKCXJldHVybgoKdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTM2CgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMzgKCS8vIHRoaXMuZ01hcC5wdXQoJ2dNYXAnLCBhKQoJYnl0ZSAiZ01hcCIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9nbG9iYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEzOQoJLy8gdGhpcy5sTWFwLnB1dCh0aGlzLnR4bi5zZW5kZXIsICdsTWFwJywgYSkKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfbG9jYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE0MAoJLy8gdGhpcy5iTWFwLnB1dCgnYk1hcCcsIGEpCglieXRlICJiTWFwIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNDIKCS8vIHRoaXMuZ01hcC5nZXQoJ2dNYXAnKVsxXSA9IDExMTEKCWJ5dGUgImdNYXAiCglhcHBfZ2xvYmFsX2dldAoJaW50IDggLy8gb2Zmc2V0CglpbnQgMTExMQoJaXRvYgoJcmVwbGFjZTMKCWJ5dGUgImdNYXAiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNDMKCS8vIHRoaXMubE1hcC5nZXQodGhpcy50eG4uc2VuZGVyLCAnbE1hcCcpWzFdID0gMjIyMgoJdHhuIFNlbmRlcgoJYnl0ZSAibE1hcCIKCWFwcF9sb2NhbF9nZXQKCWludCA4IC8vIG9mZnNldAoJaW50IDIyMjIKCWl0b2IKCXJlcGxhY2UzCgl0eG4gU2VuZGVyCglieXRlICJsTWFwIgoJdW5jb3ZlciAyCglhcHBfbG9jYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE0NAoJLy8gdGhpcy5iTWFwLmdldCgnYk1hcCcpWzFdID0gMzMzMwoJYnl0ZSAiYk1hcCIKCWJveF9nZXQKCWFzc2VydAoJaW50IDggLy8gb2Zmc2V0CglpbnQgMzMzMwoJaXRvYgoJcmVwbGFjZTMKCWJ5dGUgImJNYXAiCglzd2FwCglib3hfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE0NgoJLy8gcmV0OiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWwoJYnl0ZSAiZ01hcCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJdHhuIFNlbmRlcgoJYnl0ZSAibE1hcCIKCWFwcF9sb2NhbF9nZXQKCWludCA4IC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCgljb25jYXQKCWJ5dGUgImJNYXAiCglib3hfZ2V0Cglhc3NlcnQKCWludCA4IC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2J1cnkgLTIgLy8gcmV0OiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTUyCgkvLyByZXR1cm4gcmV0OwoJZnJhbWVfZGlnIC0yIC8vIHJldDogdWludDY0WzNdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9uZXN0ZWRTdGF0aWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBuZXN0ZWRTdGF0aWNBcnJheQoJaW50IDEKCXJldHVybgoKbmVzdGVkU3RhdGljQXJyYXk6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTU2CgkvLyBhOiBTdGF0aWNBcnJheTxTdGF0aWNBcnJheTx1aW50NjQsIDM+LCAzPiA9IFtbMTEsIDIyLCAzM10sIFs0NCwgNTUsIDY2XSwgWzc3LCA4OCwgOTldXQoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDE2MDAwMDAwMDAwMDAwMDAyMTAwMDAwMDAwMDAwMDAwMmMwMDAwMDAwMDAwMDAwMDM3MDAwMDAwMDAwMDAwMDA0MjAwMDAwMDAwMDAwMDAwNGQwMDAwMDAwMDAwMDAwMDU4MDAwMDAwMDAwMDAwMDA2MwoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM11bM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTU4CgkvLyByZXR1cm4gYVsxXVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM11bM10KCWludCAzMiAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlTmVzdGVkU3RhdGljQXJyYXlFbGVtZW50OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHVwZGF0ZU5lc3RlZFN0YXRpY0FycmF5RWxlbWVudAoJaW50IDEKCXJldHVybgoKdXBkYXRlTmVzdGVkU3RhdGljQXJyYXlFbGVtZW50OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE2MgoJLy8gYTogU3RhdGljQXJyYXk8U3RhdGljQXJyYXk8dWludDY0LCAzPiwgMz4gPSBbWzExLCAyMiwgMzNdLCBbNDQsIDU1LCA2Nl0sIFs3NywgODgsIDk5XV0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDBiMDAwMDAwMDAwMDAwMDAxNjAwMDAwMDAwMDAwMDAwMjEwMDAwMDAwMDAwMDAwMDJjMDAwMDAwMDAwMDAwMDAzNzAwMDAwMDAwMDAwMDAwNDIwMDAwMDAwMDAwMDAwMDRkMDAwMDAwMDAwMDAwMDA1ODAwMDAwMDAwMDAwMDAwNjMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdWzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE2NAoJLy8gYVsxXVsxXSA9IDU1NQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXVszXQoJaW50IDMyIC8vIG9mZnNldAoJaW50IDU1NQoJaXRvYgoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdWzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE2NgoJLy8gcmV0dXJuIGFbMV1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdWzNdCglpbnQgMzIgLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZU5lc3RlZFN0YXRpY0FycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHVwZGF0ZU5lc3RlZFN0YXRpY0FycmF5CglpbnQgMQoJcmV0dXJuCgp1cGRhdGVOZXN0ZWRTdGF0aWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNzAKCS8vIGE6IFN0YXRpY0FycmF5PFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4sIDM+ID0gW1sxMSwgMjIsIDMzXSwgWzQ0LCA1NSwgNjZdLCBbNzcsIDg4LCA5OV1dCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxMDAwMDAwMDAwMDAwMDAyYzAwMDAwMDAwMDAwMDAwMzcwMDAwMDAwMDAwMDAwMDQyMDAwMDAwMDAwMDAwMDA0ZDAwMDAwMDAwMDAwMDAwNTgwMDAwMDAwMDAwMDAwMDYzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXVszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNzIKCS8vIGFbMV0gPSBbNDQ0LCA1NTUsIDY2Nl0KCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM11bM10KCWludCAyNCAvLyBvZmZzZXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMWJjMDAwMDAwMDAwMDAwMDIyYjAwMDAwMDAwMDAwMDAyOWEKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXVszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNzQKCS8vIHJldHVybiBhWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXVszXQoJaW50IDMyIC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV90aHJlZURpbWVuc2lvbmFsVWludDE2QXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdGhyZWVEaW1lbnNpb25hbFVpbnQxNkFycmF5CglpbnQgMQoJcmV0dXJuCgp0aHJlZURpbWVuc2lvbmFsVWludDE2QXJyYXk6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTc4CgkvLyBhOiBTdGF0aWNBcnJheTxTdGF0aWNBcnJheTxTdGF0aWNBcnJheTx1aW50MTYsIDI+LCAyPiwgMj4gPSBbCglieXRlIDB4MDAwYjAwMTYwMDIxMDAyYzAwMzcwMDQyMDA0ZDAwNTgKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2WzJdWzJdWzJdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE4MgoJLy8gYVsxXVsxXSA9IFs3NzcsIDg4OF0KCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbMl1bMl1bMl0KCWludCAxMiAvLyBvZmZzZXQKCWJ5dGUgMHgwMzA5MDM3OAoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2WzJdWzJdWzJdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE4NAoJLy8gcmV0dXJuIGFbMV1bMV1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2WzJdWzJdWzJdCglpbnQgMTQgLy8gb2Zmc2V0CglpbnQgMgoJZXh0cmFjdDMKCWJ5dGUgMHhGRkZGCgliJgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc2ltcGxlVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgc2ltcGxlVHVwbGUKCWludCAxCglyZXR1cm4KCnNpbXBsZVR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE4OAoJLy8gYTogW3VpbnQ2NCwgdWludDE2LCB1aW50NjQsIHVpbnQxNl0gPSBbMTEsIDIyLCAzMywgNDRdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMTYwMDAwMDAwMDAwMDAwMDIxMDAyYwoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDY0LHVpbnQxNix1aW50NjQsdWludDE2XQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxOTAKCS8vIHJldHVybiBhWzNdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50NjQsdWludDE2LHVpbnQ2NCx1aW50MTZdCglpbnQgMTggLy8gb2Zmc2V0CglpbnQgMgoJZXh0cmFjdDMKCWJ5dGUgMHhGRkZGCgliJgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfYXJyYXlJblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIGFycmF5SW5UdXBsZQoJaW50IDEKCXJldHVybgoKYXJyYXlJblR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE5NAoJLy8gYTogW3VpbnQ2NCwgdWludDE2LCBTdGF0aWNBcnJheTx1aW50NjQsIDI+LCB1aW50MTZdID0gWwoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMGIwMDE2MDAwMDAwMDAwMDAwMDAyMTAwMDAwMDAwMDAwMDAwMmMwMDM3CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50NjQsdWludDE2LHVpbnQ2NFsyXSx1aW50MTZdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE5OAoJLy8gcmV0dXJuIGFbMl1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0WzJdLHVpbnQxNl0KCWludCAxOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdHVwbGVJbkFycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHR1cGxlSW5BcnJheQoJaW50IDEKCXJldHVybgoKdHVwbGVJbkFycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIwMgoJLy8gYTogU3RhdGljQXJyYXk8W3VpbnQ2NCwgdWludDE2XSwgMj4gPSBbCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMTYwMDAwMDAwMDAwMDAwMDIxMDAyYwoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDY0LHVpbnQxNl1bMl0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjA2CgkvLyByZXR1cm4gYVsxXVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDY0LHVpbnQxNl1bMl0KCWludCAxOCAvLyBvZmZzZXQKCWludCAyCglleHRyYWN0MwoJYnl0ZSAweEZGRkYKCWImCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV90dXBsZUluVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdHVwbGVJblR1cGxlCglpbnQgMQoJcmV0dXJuCgp0dXBsZUluVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjEwCgkvLyBhOiBbdWludDE2LCB1aW50MTYsIFt1aW50NjQsIHVpbnQxNl0sIFt1aW50MTYsIHVpbnQ2NF1dID0gWwoJYnl0ZSAweDAwMGIwMDE2MDAwMDAwMDAwMDAwMDAyMTAwMmMwMDM3MDAwMDAwMDAwMDAwMDA0MgoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2LHVpbnQxNixbdWludDY0LHVpbnQxNl0sW3VpbnQxNix1aW50NjRdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMTQKCS8vIHJldHVybiBhWzNdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTYsdWludDE2LFt1aW50NjQsdWludDE2XSxbdWludDE2LHVpbnQ2NF1dCglpbnQgMTYgLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3Nob3J0VHlwZU5vdGF0aW9uOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHNob3J0VHlwZU5vdGF0aW9uCglpbnQgMQoJcmV0dXJuCgpzaG9ydFR5cGVOb3RhdGlvbjoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMTgKCS8vIGE6IFt1aW50MTY8Mj4sIHVpbnQ2NDwyPiwgdWludDE2PDI+XSA9IFsKCWJ5dGUgMHgwMDBiMDAxNjAwMDAwMDAwMDAwMDAwMjEwMDAwMDAwMDAwMDAwMDJjMDAzNzAwNDIKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNlsyXSx1aW50NjRbMl0sdWludDE2WzJdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMjIKCS8vIHJldHVybiBhWzJdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbMl0sdWludDY0WzJdLHVpbnQxNlsyXV0KCWludCAyMiAvLyBvZmZzZXQKCWludCAyCglleHRyYWN0MwoJYnl0ZSAweEZGRkYKCWImCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9kaXNndXN0aW5nOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIGRpc2d1c3RpbmcKCWludCAxCglyZXR1cm4KCmRpc2d1c3Rpbmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjI2CgkvLyBhOiBTdGF0aWNBcnJheTxbdWludDE2PDI+LCB1aW50NjQsIFt1aW50MTYsIHVpbnQ2NF0sIFN0YXRpY0FycmF5PHVpbnQ2NDwyPiwgMj5dLCAyPiA9IFsKCWJ5dGUgMHgwMDBiMDAxNjAwMDAwMDAwMDAwMDAwMjEwMDJjMDAwMDAwMDAwMDAwMDAzNzAwMDAwMDAwMDAwMDAwNDIwMDAwMDAwMDAwMDAwMDRkMDAwMDAwMDAwMDAwMDA1ODAwMDAwMDAwMDAwMDAwNjMwMDZmMDBkZTAwMDAwMDAwMDAwMDAxNGQwMWJjMDAwMDAwMDAwMDAwMDIyYjAwMDAwMDAwMDAwMDAyOWEwMDAwMDAwMDAwMDAwMzA5MDAwMDAwMDAwMDAwMDM3ODAwMDAwMDAwMDAwMDAzZTcKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNlsyXSx1aW50NjQsW3VpbnQxNix1aW50NjRdLHVpbnQ2NFsyXVsyXV1bMl0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjMxCgkvLyBhWzFdWzNdWzFdID0gWzg4ODgsIDk5OTldCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNlsyXSx1aW50NjQsW3VpbnQxNix1aW50NjRdLHVpbnQ2NFsyXVsyXV1bMl0KCWludCA5MiAvLyBvZmZzZXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAyMmI4MDAwMDAwMDAwMDAwMjcwZgoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNlsyXSx1aW50NjQsW3VpbnQxNix1aW50NjRdLHVpbnQ2NFsyXVsyXV1bMl0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjMyCgkvLyByZXR1cm4gYVsxXVszXVsxXVswXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2WzJdLHVpbnQ2NCxbdWludDE2LHVpbnQ2NF0sdWludDY0WzJdWzJdXVsyXQoJaW50IDkyIC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9yZXR1cm5UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiByZXR1cm5UdXBsZQoJaW50IDEKCXJldHVybgoKcmV0dXJuVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjM2CgkvLyBhOiBbdWludDY0LCB1aW50MTYsIHVpbnQ2NF0gPSBbMTEsIDIyLCAzM10KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDBiMDAxNjAwMDAwMDAwMDAwMDAwMjEKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0XQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMzcKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50NjQsdWludDE2LHVpbnQ2NF0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3R1cGxlQXJnOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCgljYWxsc3ViIHR1cGxlQXJnCglpbnQgMQoJcmV0dXJuCgp0dXBsZUFyZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNDEKCS8vIHJldHVybiBhWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50NjQsdWludDE2LHVpbnQ2NF0KCWludCA4IC8vIG9mZnNldAoJaW50IDIKCWV4dHJhY3QzCglieXRlIDB4RkZGRgoJYiYKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2R5bmFtaWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBkeW5hbWljQXJyYXkKCWludCAxCglyZXR1cm4KCmR5bmFtaWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNDUKCS8vIGE6IHVpbnQ2NFtdID0gWzExLCAyMiwgMzNdCglieXRlIDB4MDAwMzAwMDAwMDAwMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDE2MDAwMDAwMDAwMDAwMDAyMQoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNDcKCS8vIHJldHVybiBhWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglpbnQgMQoJaW50IDgKCSoKCWludCAyCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3JldHVybkR5bmFtaWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiByZXR1cm5EeW5hbWljQXJyYXkKCWludCAxCglyZXR1cm4KCnJldHVybkR5bmFtaWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNTEKCS8vIGE6IHVpbnQ2NFtdID0gWzExLCAyMiwgMzNdCglieXRlIDB4MDAwMzAwMDAwMDAwMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDE2MDAwMDAwMDAwMDAwMDAyMQoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNTIKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9keW5hbWljQXJyYXlBcmc6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWNhbGxzdWIgZHluYW1pY0FycmF5QXJnCglpbnQgMQoJcmV0dXJuCgpkeW5hbWljQXJyYXlBcmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjU2CgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDEKCWludCA4CgkqCglpbnQgMgoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVEeW5hbWljQXJyYXlFbGVtZW50OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNBcnJheUVsZW1lbnQKCWludCAxCglyZXR1cm4KCnVwZGF0ZUR5bmFtaWNBcnJheUVsZW1lbnQ6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjYwCgkvLyBhOiB1aW50NjRbXSA9IFsxMSwgMjIsIDMzXQoJYnl0ZSAweDAwMDMwMDAwMDAwMDAwMDAwMDBiMDAwMDAwMDAwMDAwMDAxNjAwMDAwMDAwMDAwMDAwMjEKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjYyCgkvLyBhWzFdID0gMjIyCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0W10KCWludCAxCglpbnQgOAoJKgoJaW50IDIKCSsKCWludCAyMjIKCWl0b2IKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFtdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI2NAoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0W10KCWludCAxCglpbnQgOAoJKgoJaW50IDIKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfZHluYW1pY1R1cGxlQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgZHluYW1pY1R1cGxlQXJyYXkKCWludCAxCglyZXR1cm4KCmR5bmFtaWNUdXBsZUFycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI2OAoJLy8gYTogW3VpbnQxNiwgdWludDY0XVtdID0gW1sxMSwgMjJdLCBbMzMsIDQ0XV0KCWJ5dGUgMHgwMDAyMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDIxMDAwMDAwMDAwMDAwMDAyYwoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2LHVpbnQ2NF1bXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNzAKCS8vIHJldHVybiBhWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTYsdWludDY0XVtdCglpbnQgMQoJaW50IDEwCgkqCglpbnQgMgoJKwoJaW50IDIgLy8gb2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3JldHVyblR1cGxlV2l0aER5YW1pY0FycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHJldHVyblR1cGxlV2l0aER5YW1pY0FycmF5CglpbnQgMQoJcmV0dXJuCgpyZXR1cm5UdXBsZVdpdGhEeWFtaWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNzQKCS8vIGE6IFt1aW50NjQsIHVpbnQxNiwgdWludDY0W10sIHVpbnQxNltdXSA9IFsxLCAyLCBbMywgNF0sIFs1LCA2XV0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMgoJc3RvcmUgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglieXRlIDB4MDAwZSAvLyBoZWFkIGVuZAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWludCAxNAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgMwoJaXRvYgoJaW50IDQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA2CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0W10sdWludDE2W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI3NgoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0W10sdWludDE2W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9yZXR1cm5EeW5hbWljQXJyYXlGcm9tVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgcmV0dXJuRHluYW1pY0FycmF5RnJvbVR1cGxlCglpbnQgMQoJcmV0dXJuCgpyZXR1cm5EeW5hbWljQXJyYXlGcm9tVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjgwCgkvLyBhOiBbdWludDgsIHVpbnQxNiwgdWludDhbXSwgdWludDE2W10sIHVpbnQ4W11dID0gWzEsIDIsIFszLCA0XSwgWzUsIDZdLCBbNywgOF1dCglieXRlIDB4MDEwMDAyCglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDA5IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDkKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNyAwCglpbnQgNAoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA2CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCA3CglpdG9iCglleHRyYWN0IDcgMAoJaW50IDgKCWl0b2IKCWV4dHJhY3QgNyAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglsb2FkIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2LHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjgyCgkvLyByZXR1cm4gYVs0XTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2LHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgNyAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJZXh0cmFjdDMKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZUR5bmFtaWNBcnJheUluVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0FycmF5SW5UdXBsZQoJaW50IDEKCXJldHVybgoKdXBkYXRlRHluYW1pY0FycmF5SW5UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyODYKCS8vIGE6IFt1aW50OCwgdWludDE2W10sIHVpbnQ4W10sIHVpbnQxNltdLCB1aW50OFtdXSA9IFs5LCBbOF0sIFs3XSwgWzZdLCBbNV1dCglieXRlIDB4MDkKCXN0b3JlIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJYnl0ZSAweDAwMDkgLy8gaGVhZCBlbmQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglpbnQgOQoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgOAoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDcKCWl0b2IKCWV4dHJhY3QgNyAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCA2CglpdG9iCglleHRyYWN0IDYgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglsb2FkIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyODgKCS8vIGFbMF0gPSA5OSBhcyB1aW50OAoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCglpbnQgMCAvLyBvZmZzZXQKCWludCA5OQoJaXRvYgoJZXh0cmFjdCA3IDAKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI4OQoJLy8gYVsxXSA9IFsxMCwgMTFdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCWludCAyIC8vIHR5cGUgbGVuZ3RoCglpbnQgMSAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJYnl0ZSAweDAwMDIwMDBhMDAwYgoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkYKCWJ5dGUgMHgwMDAwRkZGRkZGRkZGRkZGIC8vIGhlYWQgdXBkYXRlIGJpdG1hc2sKCWludCAxIC8vIGlzIGZpcnN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDAgLy8gaXMgbGFzdCBkeW5hbWljIGVsZW1lbnQKCWludCA4IC8vIHRvdGFsIGhlYWQgbGVuZ3RoCglpbnQgMSAvLyBzdGFydE9mSGVhZHMKCWludCA5IC8vIGhlYWQgZW5kCgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNFbGVtZW50CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI5MAoJLy8gYVsyXSA9IFsxMiwgMTNdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgMyAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJYnl0ZSAweDAwMDIwYzBkCglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRgoJYnl0ZSAweDAwMDAwMDAwRkZGRkZGRkYgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDAgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMCAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDggLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAxIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDkgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjkxCgkvLyBhWzNdID0gWzE0LCAxNV0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJaW50IDIgLy8gdHlwZSBsZW5ndGgKCWludCA1IC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwMjAwMGUwMDBmCglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRgoJYnl0ZSAweDAwMDAwMDAwMDAwMEZGRkYgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDAgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMCAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDggLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAxIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDkgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjkyCgkvLyBhWzRdID0gWzE2LCAxN10KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCA3IC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwMjEwMTEKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMCAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMCAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAxIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgOCAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDEgLy8gc3RhcnRPZkhlYWRzCglpbnQgOSAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyOTQKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9ub25MaXRlcmFsRHluYW1pY0VsZW1lbnRJblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgbm9uTGl0ZXJhbER5bmFtaWNFbGVtZW50SW5UdXBsZQoJaW50IDEKCXJldHVybgoKbm9uTGl0ZXJhbER5bmFtaWNFbGVtZW50SW5UdXBsZToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyOTgKCS8vIGU6IHVpbnQxNltdID0gWzUsIDZdCglieXRlIDB4MDAwMjAwMDUwMDA2CglmcmFtZV9idXJ5IC0xIC8vIGU6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI5OQoJLy8gYTogW3VpbnQ4LCB1aW50MTYsIHVpbnQ4W10sIHVpbnQxNltdLCB1aW50OFtdXSA9IFsxLCAyLCBbMywgNF0sIGUsIFs3LCA4XV0KCWJ5dGUgMHgwMTAwMDIKCXN0b3JlIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJYnl0ZSAweDAwMDkgLy8gaGVhZCBlbmQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglpbnQgOQoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWludCA0CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWZyYW1lX2RpZyAtMSAvLyBlOiB1aW50MTZbXQoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgNwoJaXRvYgoJZXh0cmFjdCA3IDAKCWludCA4CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTIgLy8gYTogW3VpbnQ4LHVpbnQxNix1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMwMQoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTIgLy8gYTogW3VpbnQ4LHVpbnQxNix1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVB1c2g6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYXJyYXlQdXNoCglpbnQgMQoJcmV0dXJuCgphcnJheVB1c2g6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzA1CgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyXQoJYnl0ZSAweDAwMDIwMDAxMDAwMgoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMDcKCS8vIGEucHVzaCgzIGFzIHVpbnQxNikKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJZXh0cmFjdCAyIDAKCWNvbmNhdAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzA5CgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfYXJyYXlQb3A6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYXJyYXlQb3AKCWludCAxCglyZXR1cm4KCmFycmF5UG9wOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMxMwoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWJ5dGUgMHgwMDAzMDAwMTAwMDIwMDAzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMxNQoJLy8gYS5wb3AoKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCglleHRyYWN0IDIgMAoJY29uY2F0CglkdXAKCWxlbgoJaW50IDIKCS0KCWludCAwCglzd2FwCglleHRyYWN0MwoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMTcKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVBvcFZhbHVlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgYXJyYXlQb3BWYWx1ZQoJaW50IDEKCXJldHVybgoKYXJyYXlQb3BWYWx1ZToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMjEKCS8vIGE6IHVpbnQxNltdID0gWzEsIDIsIDNdCglieXRlIDB4MDAwMzAwMDEwMDAyMDAwMwoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMjMKCS8vIHYgPSBhLnBvcCgpIQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCglleHRyYWN0IDIgMAoJY29uY2F0CglkdXAKCWxlbgoJaW50IDIKCS0KCWludCAwCglzd2FwCglleHRyYWN0MwoJZHVwCglsZW4KCWludCAyCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWNvdmVyIDIKCWV4dHJhY3QzCglzd2FwCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCglmcmFtZV9idXJ5IC0yIC8vIHY6IHVpbnQxNgoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMjUKCS8vIHJldHVybiB2OwoJZnJhbWVfZGlnIC0yIC8vIHY6IHVpbnQxNgoJYnl0ZSAweEZGRkYKCWImCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVNwbGljZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBhcnJheVNwbGljZQoJaW50IDEKCXJldHVybgoKYXJyYXlTcGxpY2U6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzI5CgkvLyBhOiB1aW50NjRbXSA9IFsxLCAyLCAzXQoJYnl0ZSAweDAwMDMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzMxCgkvLyBhLnNwbGljZSgxLCAxKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgktCglpdG9iCglleHRyYWN0IDYgMgoJaW50IDEKCWludCA4CgkqCglpbnQgMgoJKwoJc3RvcmUgMTIgLy8gc3BsaWNlIHN0YXJ0CglpbnQgMQoJaW50IDgKCSoKCWludCA4CgkrCglzdG9yZSAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDIKCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0CglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0W10KCWR1cAoJbGVuCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCSsKCWludCA4CgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMzMKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVNwbGljZVZhbHVlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDMKCWNhbGxzdWIgYXJyYXlTcGxpY2VWYWx1ZQoJaW50IDEKCXJldHVybgoKYXJyYXlTcGxpY2VWYWx1ZToKCXByb3RvIDQgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMzcKCS8vIGE6IHVpbnQxNltdID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXQoJYnl0ZSAweDAwMGEwMDAxMDAwMjAwMDMwMDA0MDAwNTAwMDYwMDA3MDAwODAwMDkwMDBhCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMzOQoJLy8gaSA9IDEKCWludCAxCglmcmFtZV9idXJ5IC0yIC8vIGk6IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNDAKCS8vIGwgPSA3CglpbnQgNwoJZnJhbWVfYnVyeSAtMyAvLyBsOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzQxCgkvLyB2ID0gYS5zcGxpY2UoaSwgbCkKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDAKCWV4dHJhY3RfdWludDE2CglmcmFtZV9kaWcgLTMgLy8gbDogdWludDY0CgktCglpdG9iCglleHRyYWN0IDYgMgoJZnJhbWVfZGlnIC0yIC8vIGk6IHVpbnQ2NAoJaW50IDIKCSoKCWludCAyCgkrCglzdG9yZSAxMiAvLyBzcGxpY2Ugc3RhcnQKCWZyYW1lX2RpZyAtMyAvLyBsOiB1aW50NjQKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAyCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJc3Vic3RyaW5nMwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWxlbgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCgkrCglpbnQgMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBsOiB1aW50NjQKCWl0b2IKCWV4dHJhY3QgNiAyCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJaW50IDIKCS0KCWV4dHJhY3QzCgljb25jYXQKCXN3YXAKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCWZyYW1lX2J1cnkgLTQgLy8gdjogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzQzCgkvLyByZXR1cm4gdjsKCWZyYW1lX2RpZyAtNCAvLyB2OiB1aW50MTZbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfZHluYW1pY0FycmF5RWxlbWVudHM6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cAoJY2FsbHN1YiBkeW5hbWljQXJyYXlFbGVtZW50cwoJaW50IDEKCXJldHVybgoKZHluYW1pY0FycmF5RWxlbWVudHM6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzQ3CgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyLCAzXQoJYnl0ZSAweDAwMDMwMDAxMDAwMjAwMDMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzQ4CgkvLyBuZXdBOiB1aW50MTZbXSA9IFthWzBdLCBhWzFdLCBhWzJdXQoJYnl0ZSAweDAwMDMKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDAKCWludCAyCgkqCglpbnQgMgoJKwoJaW50IDIKCWV4dHJhY3QzCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDEKCWludCAyCgkqCglpbnQgMgoJKwoJaW50IDIKCWV4dHJhY3QzCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDIKCWludCAyCgkqCglpbnQgMgoJKwoJaW50IDIKCWV4dHJhY3QzCgljb25jYXQKCWZyYW1lX2J1cnkgLTIgLy8gbmV3QTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzUwCgkvLyByZXR1cm4gbmV3QTsKCWZyYW1lX2RpZyAtMiAvLyBuZXdBOiB1aW50MTZbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3BsaWNlTGFzdEVsZW1lbnQ6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgc3BsaWNlTGFzdEVsZW1lbnQKCWludCAxCglyZXR1cm4KCnNwbGljZUxhc3RFbGVtZW50OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1NAoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWJ5dGUgMHgwMDAzMDAwMTAwMDIwMDAzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1NgoJLy8gYS5zcGxpY2UoMiwgMSkKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWludCAyCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEyIC8vIHNwbGljZSBzdGFydAoJaW50IDEKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAyCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJc3Vic3RyaW5nMwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWxlbgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCgkrCglpbnQgMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzU4CgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3BsaWNlTGFzdEVsZW1lbnRWYWx1ZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwCgljYWxsc3ViIHNwbGljZUxhc3RFbGVtZW50VmFsdWUKCWludCAxCglyZXR1cm4KCnNwbGljZUxhc3RFbGVtZW50VmFsdWU6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzYyCgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyLCAzXQoJYnl0ZSAweDAwMDMwMDAxMDAwMjAwMDMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzY0CgkvLyB2ID0gYS5zcGxpY2UoMiwgMSkKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWludCAyCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEyIC8vIHNwbGljZSBzdGFydAoJaW50IDEKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAyCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJc3Vic3RyaW5nMwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWxlbgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCgkrCglpbnQgMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cgljb25jYXQKCWludCAxCglpdG9iCglleHRyYWN0IDYgMgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWludCAyCgktCglleHRyYWN0MwoJY29uY2F0Cglzd2FwCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCglmcmFtZV9idXJ5IC0yIC8vIHY6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM2NgoJLy8gcmV0dXJuIHY7CglmcmFtZV9kaWcgLTIgLy8gdjogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3NwbGljZUZpcnN0RWxlbWVudDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBzcGxpY2VGaXJzdEVsZW1lbnQKCWludCAxCglyZXR1cm4KCnNwbGljZUZpcnN0RWxlbWVudDoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNzAKCS8vIGE6IHVpbnQxNltdID0gWzEsIDIsIDNdCglieXRlIDB4MDAwMzAwMDEwMDAyMDAwMwoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNzIKCS8vIGEuc3BsaWNlKDAsIDEpCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglpbnQgMAoJaW50IDIKCSoKCWludCAyCgkrCglzdG9yZSAxMiAvLyBzcGxpY2Ugc3RhcnQKCWludCAxCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM3NAoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3NwbGljZUZpcnN0RWxlbWVudFZhbHVlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgc3BsaWNlRmlyc3RFbGVtZW50VmFsdWUKCWludCAxCglyZXR1cm4KCnNwbGljZUZpcnN0RWxlbWVudFZhbHVlOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM3OAoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWJ5dGUgMHgwMDAzMDAwMTAwMDIwMDAzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM4MAoJLy8gdiA9IGEuc3BsaWNlKDAsIDEpCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglpbnQgMAoJaW50IDIKCSoKCWludCAyCgkrCglzdG9yZSAxMiAvLyBzcGxpY2Ugc3RhcnQKCWludCAxCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglpbnQgMgoJLQoJZXh0cmFjdDMKCWNvbmNhdAoJc3dhcAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoJZnJhbWVfYnVyeSAtMiAvLyB2OiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozODIKCS8vIHJldHVybiB2OwoJZnJhbWVfZGlnIC0yIC8vIHY6IHVpbnQxNltdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zdHJpbmdSZXR1cm46Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgc3RyaW5nUmV0dXJuCglpbnQgMQoJcmV0dXJuCgpzdHJpbmdSZXR1cm46Cglwcm90byAwIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mzg2CgkvLyByZXR1cm4gJ0hlbGxvIFdvcmxkISc7CglieXRlICJIZWxsbyBXb3JsZCEiCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3RyaW5nQXJnOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBzdHJpbmdBcmcKCWludCAxCglyZXR1cm4KCnN0cmluZ0FyZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozOTAKCS8vIGFzc2VydChzID09PSAnSGVsbG8gV29ybGQhJykKCWZyYW1lX2RpZyAtMSAvLyBzOiBieXRlcwoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJPT0KCWFzc2VydAoJcmV0c3ViCgphYmlfcm91dGVfc3RyaW5nSW5UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBzdHJpbmdJblR1cGxlCglpbnQgMQoJcmV0dXJuCgpzdHJpbmdJblR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM5NAoJLy8gYTogW3VpbnQxNiwgdWludDhbXSwgc3RyaW5nLCB1aW50OFtdXSA9IFsxLCBbMl0sICdIZWxsbyBXb3JsZCEnLCBbM11dCglieXRlIDB4MDAwMQoJc3RvcmUgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglieXRlIDB4MDAwOCAvLyBoZWFkIGVuZAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWludCA4CglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWJ5dGUgMHgKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCAyCglpdG9iCglleHRyYWN0IDcgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglieXRlIDB4MDAwYzQ4NjU2YzZjNmYyMDU3NmY3MjZjNjQyMSAvLyBIZWxsbyBXb3JsZCEKCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNyAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdLHN0cmluZyx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozOTYKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSxzdHJpbmcsdWludDhbXV0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2FjY2VzU3RyaW5nSW5UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBhY2Nlc1N0cmluZ0luVHVwbGUKCWludCAxCglyZXR1cm4KCmFjY2VzU3RyaW5nSW5UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MDAKCS8vIGE6IFt1aW50MTYsIHVpbnQ4W10sIHN0cmluZywgdWludDhbXV0gPSBbMSwgWzJdLCAnSGVsbG8gV29ybGQhJywgWzNdXQoJYnl0ZSAweDAwMDEKCXN0b3JlIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJYnl0ZSAweDAwMDggLy8gaGVhZCBlbmQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglpbnQgOAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJYnl0ZSAweDAwMGM0ODY1NmM2YzZmMjA1NzZmNzI2YzY0MjEgLy8gSGVsbG8gV29ybGQhCglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCAzCglpdG9iCglleHRyYWN0IDcgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSxzdHJpbmcsdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDAyCgkvLyBhc3NlcnQoYVsyXSA9PT0gJ0hlbGxvIFdvcmxkIScpCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdLHN0cmluZyx1aW50OFtdXQoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCA0IC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglsb2FkIDAgLy8gZnVsbCB0dXBsZQoJbG9hZCAxIC8vIGFycmF5IG9mZnNldAoJbG9hZCAyIC8vIGZ1bGwgYXJyYXkgbGVuZ3RoCglleHRyYWN0MwoJZXh0cmFjdCAyIDAgLy8gZXh0cmFjdCBieXRlcyBmcm9tIHN0cmluZwoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJPT0KCWFzc2VydAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MDQKCS8vIHJldHVybiBhWzJdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSxzdHJpbmcsdWludDhbXV0KCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgNCAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJZXh0cmFjdDMKCWV4dHJhY3QgMiAwIC8vIGV4dHJhY3QgYnl0ZXMgZnJvbSBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVTdHJpbmdJblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHVwZGF0ZVN0cmluZ0luVHVwbGUKCWludCAxCglyZXR1cm4KCnVwZGF0ZVN0cmluZ0luVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDA4CgkvLyBhOiBbdWludDgsIHVpbnQxNltdLCBzdHJpbmcsIHVpbnQxNltdLCB1aW50OFtdXSA9IFs5LCBbOF0sICdIaT8nLCBbNl0sIFs1XV0KCWJ5dGUgMHgwOQoJc3RvcmUgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglieXRlIDB4MDAwOSAvLyBoZWFkIGVuZAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWludCA5CglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWJ5dGUgMHgKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCA4CglpdG9iCglleHRyYWN0IDYgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglieXRlIDB4MDAwMzQ4NjkzZiAvLyBIaT8KCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDYKCWl0b2IKCWV4dHJhY3QgNiAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCA1CglpdG9iCglleHRyYWN0IDcgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDEwCgkvLyBhWzBdID0gOTkgYXMgdWludDgKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCglpbnQgMCAvLyBvZmZzZXQKCWludCA5OQoJaXRvYgoJZXh0cmFjdCA3IDAKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDExCgkvLyBhWzFdID0gWzEwLCAxMV0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCglpbnQgMiAvLyB0eXBlIGxlbmd0aAoJaW50IDEgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWJ5dGUgMHgwMDAyMDAwYTAwMGIKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGCglieXRlIDB4MDAwMEZGRkZGRkZGRkZGRiAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMSAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAwIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgOCAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDEgLy8gc3RhcnRPZkhlYWRzCglpbnQgOSAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQxMgoJLy8gYVsyXSA9ICdIZWxsbyBXb3JsZCEnCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCAzIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwYzQ4NjU2YzZjNmYyMDU3NmY3MjZjNjQyMSAvLyBIZWxsbyBXb3JsZCEKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGCglieXRlIDB4MDAwMDAwMDBGRkZGRkZGRiAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMCAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAwIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgOCAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDEgLy8gc3RhcnRPZkhlYWRzCglpbnQgOSAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQxMwoJLy8gYVszXSA9IFsxNCwgMTVdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoJaW50IDIgLy8gdHlwZSBsZW5ndGgKCWludCA1IC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwMjAwMGUwMDBmCglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRgoJYnl0ZSAweDAwMDAwMDAwMDAwMEZGRkYgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDAgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMCAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDggLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAxIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDkgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MTQKCS8vIGFbNF0gPSBbMTYsIDE3XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgNyAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJYnl0ZSAweDAwMDIxMDExCglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDAgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMSAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDggLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAxIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDkgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MTYKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZVR1cGxlV2l0aE9ubHlEeW5hbWljVHlwZXM6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdXBkYXRlVHVwbGVXaXRoT25seUR5bmFtaWNUeXBlcwoJaW50IDEKCXJldHVybgoKdXBkYXRlVHVwbGVXaXRoT25seUR5bmFtaWNUeXBlczoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MjAKCS8vIGE6IFt1aW50MTZbXSwgdWludDE2W10sIHVpbnQxNltdXSA9IFtbMV0sIFsyXSwgWzNdXQoJYnl0ZSAweCAvLyBubyBzdGF0aWMgZWxlbWVudHMKCXN0b3JlIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJYnl0ZSAweDAwMDYgLy8gaGVhZCBlbmQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglpbnQgNgoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNiAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCAzCglpdG9iCglleHRyYWN0IDYgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDIyCgkvLyBhWzBdID0gWzQsIDVdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJaW50IDIgLy8gdHlwZSBsZW5ndGgKCWludCAwIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwMjAwMDQwMDA1CglieXRlIDB4RkZGRkZGRkZGRkZGCglieXRlIDB4MDAwMEZGRkZGRkZGIC8vIGhlYWQgdXBkYXRlIGJpdG1hc2sKCWludCAxIC8vIGlzIGZpcnN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDAgLy8gaXMgbGFzdCBkeW5hbWljIGVsZW1lbnQKCWludCA2IC8vIHRvdGFsIGhlYWQgbGVuZ3RoCglpbnQgMCAvLyBzdGFydE9mSGVhZHMKCWludCA2IC8vIGhlYWQgZW5kCgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNFbGVtZW50CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDIzCgkvLyBhWzFdID0gWzYsIDddCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJaW50IDIgLy8gdHlwZSBsZW5ndGgKCWludCAyIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwMjAwMDYwMDA3CglieXRlIDB4RkZGRkZGRkZGRkZGCglieXRlIDB4MDAwMDAwMDBGRkZGIC8vIGhlYWQgdXBkYXRlIGJpdG1hc2sKCWludCAwIC8vIGlzIGZpcnN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDAgLy8gaXMgbGFzdCBkeW5hbWljIGVsZW1lbnQKCWludCA2IC8vIHRvdGFsIGhlYWQgbGVuZ3RoCglpbnQgMCAvLyBzdGFydE9mSGVhZHMKCWludCA2IC8vIGhlYWQgZW5kCgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNFbGVtZW50CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDI0CgkvLyBhWzJdID0gWzgsIDldCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJaW50IDIgLy8gdHlwZSBsZW5ndGgKCWludCA0IC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwMjAwMDgwMDA5CglieXRlIDB4RkZGRkZGRkZGRkZGCglieXRlIDB4MDAwMDAwMDAwMDAwIC8vIGhlYWQgdXBkYXRlIGJpdG1hc2sKCWludCAwIC8vIGlzIGZpcnN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDEgLy8gaXMgbGFzdCBkeW5hbWljIGVsZW1lbnQKCWludCA2IC8vIHRvdGFsIGhlYWQgbGVuZ3RoCglpbnQgMCAvLyBzdGFydE9mSGVhZHMKCWludCA2IC8vIGhlYWQgZW5kCgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNFbGVtZW50CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDI2CgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zaG9ydGVuRHluYW1pY0VsZW1lbnRJblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHNob3J0ZW5EeW5hbWljRWxlbWVudEluVHVwbGUKCWludCAxCglyZXR1cm4KCnNob3J0ZW5EeW5hbWljRWxlbWVudEluVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDMwCgkvLyBhOiBbdWludDE2W10sIHVpbnQxNltdLCB1aW50MTZbXV0gPSBbWzEsIDJdLCBbMiwgM10sIFszLCA0XV0KCWJ5dGUgMHggLy8gbm8gc3RhdGljIGVsZW1lbnRzCglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDA2IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDYKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCAzCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCAzCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDQKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglsb2FkIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQzMgoJLy8gYVswXSA9IFs1XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCWludCAyIC8vIHR5cGUgbGVuZ3RoCglpbnQgMCAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJYnl0ZSAweDAwMDEwMDA1CglieXRlIDB4RkZGRkZGRkZGRkZGCglieXRlIDB4MDAwMEZGRkZGRkZGIC8vIGhlYWQgdXBkYXRlIGJpdG1hc2sKCWludCAxIC8vIGlzIGZpcnN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDAgLy8gaXMgbGFzdCBkeW5hbWljIGVsZW1lbnQKCWludCA2IC8vIHRvdGFsIGhlYWQgbGVuZ3RoCglpbnQgMCAvLyBzdGFydE9mSGVhZHMKCWludCA2IC8vIGhlYWQgZW5kCgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNFbGVtZW50CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDMzCgkvLyBhWzFdID0gWzZdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJaW50IDIgLy8gdHlwZSBsZW5ndGgKCWludCAyIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwMTAwMDYKCWJ5dGUgMHhGRkZGRkZGRkZGRkYKCWJ5dGUgMHgwMDAwMDAwMEZGRkYgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDAgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMCAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDYgLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAwIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDYgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MzQKCS8vIGFbMl0gPSBbN10KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglpbnQgMiAvLyB0eXBlIGxlbmd0aAoJaW50IDQgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWJ5dGUgMHgwMDAxMDAwNwoJYnl0ZSAweEZGRkZGRkZGRkZGRgoJYnl0ZSAweDAwMDAwMDAwMDAwMCAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMCAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAxIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgNiAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDAgLy8gc3RhcnRPZkhlYWRzCglpbnQgNiAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQzNgoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfbmFtZWRUdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBuYW1lZFR1cGxlCglpbnQgMQoJcmV0dXJuCgpuYW1lZFR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ0MAoJLy8gYTogewoJYnl0ZSAweDAwMDEKCXN0b3JlIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJYnl0ZSAweDAwMDQgLy8gaGVhZCBlbmQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglpbnQgNAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglieXRlIDB4MDAwYzQ4NjU2YzZjNmYyMDU3NmY3MjZjNjQyMSAvLyBIZWxsbyBXb3JsZCEKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglsb2FkIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NDgKCS8vIHJldHVybiBhLmJhcjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCAyIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglsb2FkIDAgLy8gZnVsbCB0dXBsZQoJbG9hZCAxIC8vIGFycmF5IG9mZnNldAoJbG9hZCAyIC8vIGZ1bGwgYXJyYXkgbGVuZ3RoCglleHRyYWN0MwoJZXh0cmFjdCAyIDAgLy8gZXh0cmFjdCBieXRlcyBmcm9tIHN0cmluZwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZU5hbWVkVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdXBkYXRlTmFtZWRUdXBsZQoJaW50IDEKCXJldHVybgoKdXBkYXRlTmFtZWRUdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NTIKCS8vIGE6IHsKCWJ5dGUgMHgwMDAxCglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDA0IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDQKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJYnl0ZSAweDAwMDM0ODY5M2YgLy8gSGk/Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogeyBmb286IHVpbnQxNiwgYmFyOiBzdHJpbmcsIH0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDYwCgkvLyBhLmJhciA9ICdIZWxsbyBXb3JsZCEnCglmcmFtZV9kaWcgLTEgLy8gYTogeyBmb286IHVpbnQxNiwgYmFyOiBzdHJpbmcsIH0KCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgMiAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJYnl0ZSAweDAwMGM0ODY1NmM2YzZmMjA1NzZmNzI2YzY0MjEgLy8gSGVsbG8gV29ybGQhCglieXRlIDB4RkZGRgoJYnl0ZSAweDAwMDAgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDEgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMSAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDIgLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAyIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDQgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogeyBmb286IHVpbnQxNiwgYmFyOiBzdHJpbmcsIH0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDYyCgkvLyByZXR1cm4gYS5iYXI7CglmcmFtZV9kaWcgLTEgLy8gYTogeyBmb286IHVpbnQxNiwgYmFyOiBzdHJpbmcsIH0KCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgMiAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJZXh0cmFjdDMKCWV4dHJhY3QgMiAwIC8vIGV4dHJhY3QgYnl0ZXMgZnJvbSBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9jdXN0b21UeXBlczoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBjdXN0b21UeXBlcwoJaW50IDEKCXJldHVybgoKY3VzdG9tVHlwZXM6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDY2CgkvLyBhYTogQ3VzdG9tVHlwZSA9IHsKCWJ5dGUgMHgwMDAxCglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDA0IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDQKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJYnl0ZSAweDAwMDM0ODY5M2YgLy8gSGk/Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYWE6IEN1c3RvbVR5cGUKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDcxCgkvLyBhYS5iYXIgPSAnSGVsbG8gV29ybGQhJwoJZnJhbWVfZGlnIC0xIC8vIGFhOiBDdXN0b21UeXBlCglpbnQgMSAvLyB0eXBlIGxlbmd0aAoJaW50IDIgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWJ5dGUgMHgwMDBjNDg2NTZjNmM2ZjIwNTc2ZjcyNmM2NDIxIC8vIEhlbGxvIFdvcmxkIQoJYnl0ZSAweEZGRkYKCWJ5dGUgMHgwMDAwIC8vIGhlYWQgdXBkYXRlIGJpdG1hc2sKCWludCAxIC8vIGlzIGZpcnN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDEgLy8gaXMgbGFzdCBkeW5hbWljIGVsZW1lbnQKCWludCAyIC8vIHRvdGFsIGhlYWQgbGVuZ3RoCglpbnQgMiAvLyBzdGFydE9mSGVhZHMKCWludCA0IC8vIGhlYWQgZW5kCgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNFbGVtZW50CglmcmFtZV9idXJ5IC0xIC8vIGFhOiBDdXN0b21UeXBlCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ3MwoJLy8gcmV0dXJuIGFhLmJhcjsKCWZyYW1lX2RpZyAtMSAvLyBhYTogQ3VzdG9tVHlwZQoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCAyIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglsb2FkIDAgLy8gZnVsbCB0dXBsZQoJbG9hZCAxIC8vIGFycmF5IG9mZnNldAoJbG9hZCAyIC8vIGZ1bGwgYXJyYXkgbGVuZ3RoCglleHRyYWN0MwoJZXh0cmFjdCAyIDAgLy8gZXh0cmFjdCBieXRlcyBmcm9tIHN0cmluZwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3N0YXRpY1N0cmluZ0FycmF5QXJnOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCgljYWxsc3ViIHN0YXRpY1N0cmluZ0FycmF5QXJnCglpbnQgMQoJcmV0dXJuCgpzdGF0aWNTdHJpbmdBcnJheUFyZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NzcKCS8vIHJldHVybiBhWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IGJ5dGVzWzNdCglpbnQgMSAvLyB0eXBlIGxlbmd0aAoJaW50IDIgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglsb2FkIDEgLy8gYXJyYXkgb2Zmc2V0Cglsb2FkIDIgLy8gZnVsbCBhcnJheSBsZW5ndGgKCWV4dHJhY3QzCglleHRyYWN0IDIgMCAvLyBleHRyYWN0IGJ5dGVzIGZyb20gc3RyaW5nCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfZHluYW1pY0FjY2Vzc09mRHluYW1pY0VsZW1lbnRJblN0YXRpY0FycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4Cgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCgljYWxsc3ViIGR5bmFtaWNBY2Nlc3NPZkR5bmFtaWNFbGVtZW50SW5TdGF0aWNBcnJheQoJaW50IDEKCXJldHVybgoKZHluYW1pY0FjY2Vzc09mRHluYW1pY0VsZW1lbnRJblN0YXRpY0FycmF5OgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ4MQoJLy8gaSA9IDEKCWludCAxCglmcmFtZV9idXJ5IC0yIC8vIGk6IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0ODIKCS8vIHJldHVybiBhW2ldOwoJZnJhbWVfZGlnIC0xIC8vIGE6IGJ5dGVzWzNdCglpbnQgMSAvLyB0eXBlIGxlbmd0aAoJZnJhbWVfZGlnIC0yIC8vIGk6IHVpbnQ2NAoJaW50IDIKCSogLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglsb2FkIDEgLy8gYXJyYXkgb2Zmc2V0Cglsb2FkIDIgLy8gZnVsbCBhcnJheSBsZW5ndGgKCWV4dHJhY3QzCglleHRyYWN0IDIgMCAvLyBleHRyYWN0IGJ5dGVzIGZyb20gc3RyaW5nCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdHhuVHlwZXM6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCXR4biBHcm91cEluZGV4CglpbnQgMQoJLQoJdHhuIEdyb3VwSW5kZXgKCWludCAyCgktCgl0eG4gR3JvdXBJbmRleAoJaW50IDMKCS0KCXR4biBHcm91cEluZGV4CglpbnQgNAoJLQoJdHhuIEdyb3VwSW5kZXgKCWludCA1CgktCgl0eG4gR3JvdXBJbmRleAoJaW50IDYKCS0KCXR4biBHcm91cEluZGV4CglpbnQgNwoJLQoJY2FsbHN1YiB0eG5UeXBlcwoJaW50IDEKCXJldHVybgoKdHhuVHlwZXM6Cglwcm90byA3IDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NTA2CgkvLyBhc3NlcnQodC5zZW5kZXIgPT09IGEuc2VuZGVyKQoJZnJhbWVfZGlnIC0xIC8vIHQ6IHR4bgoJZ3R4bnMgU2VuZGVyCglmcmFtZV9kaWcgLTIgLy8gYTogYXBwbAoJZ3R4bnMgU2VuZGVyCgk9PQoJYXNzZXJ0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjUwNwoJLy8gYXNzZXJ0KGFjLnNlbmRlciA9PT0gYWYuc2VuZGVyKQoJZnJhbWVfZGlnIC0zIC8vIGFjOiBhY2ZnCglndHhucyBTZW5kZXIKCWZyYW1lX2RpZyAtNCAvLyBhZjogYWZyegoJZ3R4bnMgU2VuZGVyCgk9PQoJYXNzZXJ0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjUwOAoJLy8gYXNzZXJ0KGF0LnNlbmRlciA9PT0ga3Iuc2VuZGVyKQoJZnJhbWVfZGlnIC01IC8vIGF0OiBheGZlcgoJZ3R4bnMgU2VuZGVyCglmcmFtZV9kaWcgLTYgLy8ga3I6IGtleXJlZwoJZ3R4bnMgU2VuZGVyCgk9PQoJYXNzZXJ0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjUwOQoJLy8gYXNzZXJ0KHAuc2VuZGVyID09PSB0LnNlbmRlcikKCWZyYW1lX2RpZyAtNyAvLyBwOiBwYXkKCWd0eG5zIFNlbmRlcgoJZnJhbWVfZGlnIC0xIC8vIHQ6IHR4bgoJZ3R4bnMgU2VuZGVyCgk9PQoJYXNzZXJ0CglyZXRzdWIKCm1haW46Cgl0eG4gTnVtQXBwQXJncwoJYm56IHJvdXRlX2FiaQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgk9PQoJYm56IGJhcmVfcm91dGVfY3JlYXRlCgl0eG4gT25Db21wbGV0aW9uCglpbnQgT3B0SW4KCT09CglpbnQgMQoJbWF0Y2ggYmFyZV9yb3V0ZV9PcHRJbgoKcm91dGVfYWJpOgoJbWV0aG9kICJzdGF0aWNBcnJheSgpdWludDY0IgoJbWV0aG9kICJyZXR1cm5TdGF0aWNBcnJheSgpdWludDY0WzNdIgoJbWV0aG9kICJzdGF0aWNBcnJheUFyZyh1aW50NjRbM10pdWludDY0IgoJbWV0aG9kICJub25MaXRlcmFsU3RhdGljQXJyYXlFbGVtZW50cygpdWludDY0IgoJbWV0aG9kICJtaXhlZFN0YXRpY0FycmF5RWxlbWVudHMoKXVpbnQ2NCIKCW1ldGhvZCAibm9uTGl0ZXJhbFN0YXRpY0FycmF5QWNjZXNzKCl1aW50NjQiCgltZXRob2QgInNldFN0YXRpY0FycmF5RWxlbWVudCgpdWludDY0IgoJbWV0aG9kICJzdGF0aWNBcnJheUluU3RvcmFnZVJlZigpdWludDY0WzNdIgoJbWV0aG9kICJ1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZVJlZigpdWludDY0WzNdIgoJbWV0aG9kICJzdGF0aWNBcnJheUluU3RvcmFnZU1hcCgpdWludDY0WzNdIgoJbWV0aG9kICJ1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZU1hcCgpdWludDY0WzNdIgoJbWV0aG9kICJuZXN0ZWRTdGF0aWNBcnJheSgpdWludDY0IgoJbWV0aG9kICJ1cGRhdGVOZXN0ZWRTdGF0aWNBcnJheUVsZW1lbnQoKXVpbnQ2NCIKCW1ldGhvZCAidXBkYXRlTmVzdGVkU3RhdGljQXJyYXkoKXVpbnQ2NCIKCW1ldGhvZCAidGhyZWVEaW1lbnNpb25hbFVpbnQxNkFycmF5KCl1aW50MTYiCgltZXRob2QgInNpbXBsZVR1cGxlKCl1aW50MTYiCgltZXRob2QgImFycmF5SW5UdXBsZSgpdWludDY0IgoJbWV0aG9kICJ0dXBsZUluQXJyYXkoKXVpbnQxNiIKCW1ldGhvZCAidHVwbGVJblR1cGxlKCl1aW50NjQiCgltZXRob2QgInNob3J0VHlwZU5vdGF0aW9uKCl1aW50MTYiCgltZXRob2QgImRpc2d1c3RpbmcoKXVpbnQ2NCIKCW1ldGhvZCAicmV0dXJuVHVwbGUoKSh1aW50NjQsdWludDE2LHVpbnQ2NCkiCgltZXRob2QgInR1cGxlQXJnKCh1aW50NjQsdWludDE2LHVpbnQ2NCkpdWludDE2IgoJbWV0aG9kICJkeW5hbWljQXJyYXkoKXVpbnQ2NCIKCW1ldGhvZCAicmV0dXJuRHluYW1pY0FycmF5KCl1aW50NjRbXSIKCW1ldGhvZCAiZHluYW1pY0FycmF5QXJnKHVpbnQ2NFtdKXVpbnQ2NCIKCW1ldGhvZCAidXBkYXRlRHluYW1pY0FycmF5RWxlbWVudCgpdWludDY0IgoJbWV0aG9kICJkeW5hbWljVHVwbGVBcnJheSgpdWludDY0IgoJbWV0aG9kICJyZXR1cm5UdXBsZVdpdGhEeWFtaWNBcnJheSgpKHVpbnQ2NCx1aW50MTYsdWludDY0W10sdWludDE2W10pIgoJbWV0aG9kICJyZXR1cm5EeW5hbWljQXJyYXlGcm9tVHVwbGUoKXVpbnQ4W10iCgltZXRob2QgInVwZGF0ZUR5bmFtaWNBcnJheUluVHVwbGUoKSh1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W10pIgoJbWV0aG9kICJub25MaXRlcmFsRHluYW1pY0VsZW1lbnRJblR1cGxlKCkodWludDgsdWludDE2LHVpbnQ4W10sdWludDE2W10sdWludDhbXSkiCgltZXRob2QgImFycmF5UHVzaCgpdWludDE2W10iCgltZXRob2QgImFycmF5UG9wKCl1aW50MTZbXSIKCW1ldGhvZCAiYXJyYXlQb3BWYWx1ZSgpdWludDE2IgoJbWV0aG9kICJhcnJheVNwbGljZSgpdWludDY0W10iCgltZXRob2QgImFycmF5U3BsaWNlVmFsdWUoKXVpbnQxNltdIgoJbWV0aG9kICJkeW5hbWljQXJyYXlFbGVtZW50cygpdWludDE2W10iCgltZXRob2QgInNwbGljZUxhc3RFbGVtZW50KCl1aW50MTZbXSIKCW1ldGhvZCAic3BsaWNlTGFzdEVsZW1lbnRWYWx1ZSgpdWludDE2W10iCgltZXRob2QgInNwbGljZUZpcnN0RWxlbWVudCgpdWludDE2W10iCgltZXRob2QgInNwbGljZUZpcnN0RWxlbWVudFZhbHVlKCl1aW50MTZbXSIKCW1ldGhvZCAic3RyaW5nUmV0dXJuKClzdHJpbmciCgltZXRob2QgInN0cmluZ0FyZyhzdHJpbmcpdm9pZCIKCW1ldGhvZCAic3RyaW5nSW5UdXBsZSgpKHVpbnQxNix1aW50OFtdLHN0cmluZyx1aW50OFtdKSIKCW1ldGhvZCAiYWNjZXNTdHJpbmdJblR1cGxlKClzdHJpbmciCgltZXRob2QgInVwZGF0ZVN0cmluZ0luVHVwbGUoKSh1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXSkiCgltZXRob2QgInVwZGF0ZVR1cGxlV2l0aE9ubHlEeW5hbWljVHlwZXMoKSh1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXSkiCgltZXRob2QgInNob3J0ZW5EeW5hbWljRWxlbWVudEluVHVwbGUoKSh1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXSkiCgltZXRob2QgIm5hbWVkVHVwbGUoKXN0cmluZyIKCW1ldGhvZCAidXBkYXRlTmFtZWRUdXBsZSgpc3RyaW5nIgoJbWV0aG9kICJjdXN0b21UeXBlcygpc3RyaW5nIgoJbWV0aG9kICJzdGF0aWNTdHJpbmdBcnJheUFyZyhzdHJpbmdbM10pc3RyaW5nIgoJbWV0aG9kICJkeW5hbWljQWNjZXNzT2ZEeW5hbWljRWxlbWVudEluU3RhdGljQXJyYXkoc3RyaW5nWzNdKXN0cmluZyIKCW1ldGhvZCAidHhuVHlwZXModHhuLGFwcGwsYWNmZyxhZnJ6LGF4ZmVyLGtleXJlZyxwYXkpdm9pZCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoIGFiaV9yb3V0ZV9zdGF0aWNBcnJheSBhYmlfcm91dGVfcmV0dXJuU3RhdGljQXJyYXkgYWJpX3JvdXRlX3N0YXRpY0FycmF5QXJnIGFiaV9yb3V0ZV9ub25MaXRlcmFsU3RhdGljQXJyYXlFbGVtZW50cyBhYmlfcm91dGVfbWl4ZWRTdGF0aWNBcnJheUVsZW1lbnRzIGFiaV9yb3V0ZV9ub25MaXRlcmFsU3RhdGljQXJyYXlBY2Nlc3MgYWJpX3JvdXRlX3NldFN0YXRpY0FycmF5RWxlbWVudCBhYmlfcm91dGVfc3RhdGljQXJyYXlJblN0b3JhZ2VSZWYgYWJpX3JvdXRlX3VwZGF0ZVN0YXRpY0FycmF5SW5TdG9yYWdlUmVmIGFiaV9yb3V0ZV9zdGF0aWNBcnJheUluU3RvcmFnZU1hcCBhYmlfcm91dGVfdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VNYXAgYWJpX3JvdXRlX25lc3RlZFN0YXRpY0FycmF5IGFiaV9yb3V0ZV91cGRhdGVOZXN0ZWRTdGF0aWNBcnJheUVsZW1lbnQgYWJpX3JvdXRlX3VwZGF0ZU5lc3RlZFN0YXRpY0FycmF5IGFiaV9yb3V0ZV90aHJlZURpbWVuc2lvbmFsVWludDE2QXJyYXkgYWJpX3JvdXRlX3NpbXBsZVR1cGxlIGFiaV9yb3V0ZV9hcnJheUluVHVwbGUgYWJpX3JvdXRlX3R1cGxlSW5BcnJheSBhYmlfcm91dGVfdHVwbGVJblR1cGxlIGFiaV9yb3V0ZV9zaG9ydFR5cGVOb3RhdGlvbiBhYmlfcm91dGVfZGlzZ3VzdGluZyBhYmlfcm91dGVfcmV0dXJuVHVwbGUgYWJpX3JvdXRlX3R1cGxlQXJnIGFiaV9yb3V0ZV9keW5hbWljQXJyYXkgYWJpX3JvdXRlX3JldHVybkR5bmFtaWNBcnJheSBhYmlfcm91dGVfZHluYW1pY0FycmF5QXJnIGFiaV9yb3V0ZV91cGRhdGVEeW5hbWljQXJyYXlFbGVtZW50IGFiaV9yb3V0ZV9keW5hbWljVHVwbGVBcnJheSBhYmlfcm91dGVfcmV0dXJuVHVwbGVXaXRoRHlhbWljQXJyYXkgYWJpX3JvdXRlX3JldHVybkR5bmFtaWNBcnJheUZyb21UdXBsZSBhYmlfcm91dGVfdXBkYXRlRHluYW1pY0FycmF5SW5UdXBsZSBhYmlfcm91dGVfbm9uTGl0ZXJhbER5bmFtaWNFbGVtZW50SW5UdXBsZSBhYmlfcm91dGVfYXJyYXlQdXNoIGFiaV9yb3V0ZV9hcnJheVBvcCBhYmlfcm91dGVfYXJyYXlQb3BWYWx1ZSBhYmlfcm91dGVfYXJyYXlTcGxpY2UgYWJpX3JvdXRlX2FycmF5U3BsaWNlVmFsdWUgYWJpX3JvdXRlX2R5bmFtaWNBcnJheUVsZW1lbnRzIGFiaV9yb3V0ZV9zcGxpY2VMYXN0RWxlbWVudCBhYmlfcm91dGVfc3BsaWNlTGFzdEVsZW1lbnRWYWx1ZSBhYmlfcm91dGVfc3BsaWNlRmlyc3RFbGVtZW50IGFiaV9yb3V0ZV9zcGxpY2VGaXJzdEVsZW1lbnRWYWx1ZSBhYmlfcm91dGVfc3RyaW5nUmV0dXJuIGFiaV9yb3V0ZV9zdHJpbmdBcmcgYWJpX3JvdXRlX3N0cmluZ0luVHVwbGUgYWJpX3JvdXRlX2FjY2VzU3RyaW5nSW5UdXBsZSBhYmlfcm91dGVfdXBkYXRlU3RyaW5nSW5UdXBsZSBhYmlfcm91dGVfdXBkYXRlVHVwbGVXaXRoT25seUR5bmFtaWNUeXBlcyBhYmlfcm91dGVfc2hvcnRlbkR5bmFtaWNFbGVtZW50SW5UdXBsZSBhYmlfcm91dGVfbmFtZWRUdXBsZSBhYmlfcm91dGVfdXBkYXRlTmFtZWRUdXBsZSBhYmlfcm91dGVfY3VzdG9tVHlwZXMgYWJpX3JvdXRlX3N0YXRpY1N0cmluZ0FycmF5QXJnIGFiaV9yb3V0ZV9keW5hbWljQWNjZXNzT2ZEeW5hbWljRWxlbWVudEluU3RhdGljQXJyYXkgYWJpX3JvdXRlX3R4blR5cGVz","clear":"I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"},"contract":{"name":"AbiTest","desc":"","methods":[{"name":"staticArray","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"returnStaticArray","args":[],"desc":"","returns":{"type":"uint64[3]","desc":""}},{"name":"staticArrayArg","args":[{"name":"a","type":"uint64[3]","desc":""}],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"nonLiteralStaticArrayElements","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"mixedStaticArrayElements","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"nonLiteralStaticArrayAccess","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"setStaticArrayElement","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"staticArrayInStorageRef","args":[],"desc":"","returns":{"type":"uint64[3]","desc":""}},{"name":"updateStaticArrayInStorageRef","args":[],"desc":"","returns":{"type":"uint64[3]","desc":""}},{"name":"staticArrayInStorageMap","args":[],"desc":"","returns":{"type":"uint64[3]","desc":""}},{"name":"updateStaticArrayInStorageMap","args":[],"desc":"","returns":{"type":"uint64[3]","desc":""}},{"name":"nestedStaticArray","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"updateNestedStaticArrayElement","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"updateNestedStaticArray","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"threeDimensionalUint16Array","args":[],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"simpleTuple","args":[],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"arrayInTuple","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"tupleInArray","args":[],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"tupleInTuple","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"shortTypeNotation","args":[],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"disgusting","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"returnTuple","args":[],"desc":"","returns":{"type":"(uint64,uint16,uint64)","desc":""}},{"name":"tupleArg","args":[{"name":"a","type":"(uint64,uint16,uint64)","desc":""}],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"dynamicArray","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"returnDynamicArray","args":[],"desc":"","returns":{"type":"uint64[]","desc":""}},{"name":"dynamicArrayArg","args":[{"name":"a","type":"uint64[]","desc":""}],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"updateDynamicArrayElement","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"dynamicTupleArray","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"returnTupleWithDyamicArray","args":[],"desc":"","returns":{"type":"(uint64,uint16,uint64[],uint16[])","desc":""}},{"name":"returnDynamicArrayFromTuple","args":[],"desc":"","returns":{"type":"uint8[]","desc":""}},{"name":"updateDynamicArrayInTuple","args":[],"desc":"","returns":{"type":"(uint8,uint16[],uint8[],uint16[],uint8[])","desc":""}},{"name":"nonLiteralDynamicElementInTuple","args":[],"desc":"","returns":{"type":"(uint8,uint16,uint8[],uint16[],uint8[])","desc":""}},{"name":"arrayPush","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"arrayPop","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"arrayPopValue","args":[],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"arraySplice","args":[],"desc":"","returns":{"type":"uint64[]","desc":""}},{"name":"arraySpliceValue","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"dynamicArrayElements","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"spliceLastElement","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"spliceLastElementValue","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"spliceFirstElement","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"spliceFirstElementValue","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"stringReturn","args":[],"desc":"","returns":{"type":"string","desc":""}},{"name":"stringArg","args":[{"name":"s","type":"string","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"stringInTuple","args":[],"desc":"","returns":{"type":"(uint16,uint8[],string,uint8[])","desc":""}},{"name":"accesStringInTuple","args":[],"desc":"","returns":{"type":"string","desc":""}},{"name":"updateStringInTuple","args":[],"desc":"","returns":{"type":"(uint8,uint16[],string,uint16[],uint8[])","desc":""}},{"name":"updateTupleWithOnlyDynamicTypes","args":[],"desc":"","returns":{"type":"(uint16[],uint16[],uint16[])","desc":""}},{"name":"shortenDynamicElementInTuple","args":[],"desc":"","returns":{"type":"(uint16[],uint16[],uint16[])","desc":""}},{"name":"namedTuple","args":[],"desc":"","returns":{"type":"string","desc":""}},{"name":"updateNamedTuple","args":[],"desc":"","returns":{"type":"string","desc":""}},{"name":"customTypes","args":[],"desc":"","returns":{"type":"string","desc":""}},{"name":"staticStringArrayArg","args":[{"name":"a","type":"string[3]","desc":""}],"desc":"","returns":{"type":"string","desc":""}},{"name":"dynamicAccessOfDynamicElementInStaticArray","args":[{"name":"a","type":"string[3]","desc":""}],"desc":"","returns":{"type":"string","desc":""}},{"name":"txnTypes","args":[{"name":"t","type":"txn","desc":""},{"name":"a","type":"appl","desc":""},{"name":"ac","type":"acfg","desc":""},{"name":"af","type":"afrz","desc":""},{"name":"at","type":"axfer","desc":""},{"name":"kr","type":"keyreg","desc":""},{"name":"p","type":"pay","desc":""}],"desc":"","returns":{"type":"void","desc":""}}]}} \ No newline at end of file +{"hints":{},"schema":{"local":{"declared":{"lRef":{"type":"bytes","key":"lRef"},"lMap":{"type":"bytes","key":"lMap"}},"reserved":{}},"global":{"declared":{"gRef":{"type":"bytes","key":"gRef"},"gMap":{"type":"bytes","key":"gMap"}},"reserved":{}}},"state":{"global":{"num_byte_slices":2,"num_uints":0},"local":{"num_byte_slices":2,"num_uints":0}},"source":{"approval":"I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudDoKCXByb3RvIDMgMQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZCBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgZHluYW1pYyBhcnJheSBvZmZzZXQgb2YgZWxlbWVudAoJaW50IDAKCXN3YXAKCWV4dHJhY3QzIC8vIGV4dHJhY3QgcG9ydGlvbiBvZiB0dXBsZSBiZWZvcmUgZWxlbWVudAoJZnJhbWVfZGlnIC0yIC8vIG5ldyB0dXBsZSBlbGVtZW50Cgljb25jYXQKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfZGlnIC0xIC8vIGhlYWQgb2Zmc2V0CglleHRyYWN0X3VpbnQxNiAvLyBleHRyYWN0IGR5bmFtaWMgYXJyYXkgb2Zmc2V0IG9mIGVsZW1lbnQKCWZyYW1lX2RpZyAtMyAvLyBvbGQgZWxlbWVudCBsZW5ndGgKCSsKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglsZW4KCXN1YnN0cmluZzMKCWNvbmNhdAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTIgLy8gbmV3IHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2YgbmV3IGVsZW1lbnQKCWZyYW1lX2RpZyAtMyAvLyBvbGQgZWxlbWVudCBsZW5ndGgKCTwKCWJueiBzd2FwcGVkX2RpZmZlcmVuY2UKCWZyYW1lX2RpZyAtMiAvLyBuZXcgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBuZXcgZWxlbWVudAoJZnJhbWVfZGlnIC0zIC8vIG9sZCBlbGVtZW50IGxlbmd0aAoJaW50IDEKCXN0b3JlIDcgLy8gc3VidHJhY3QgaGVhZCBkaWZmZXJlbmNlCgliIGdldF9kaWZmZXJlbmNlCgpzd2FwcGVkX2RpZmZlcmVuY2U6CglmcmFtZV9kaWcgLTMgLy8gb2xkIGVsZW1lbnQgbGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gbmV3IHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2YgbmV3IGVsZW1lbnQKCWludCAwCglzdG9yZSA3IC8vIHN1YnRyYWN0IGhlYWQgZGlmZmVyZW5jZQoKZ2V0X2RpZmZlcmVuY2U6CgktIC8vIGdldCBsZW5ndGggZGlmZmVyZW5jZQoJcmV0c3ViCgp1cGRhdGVfZHluYW1pY19oZWFkOgoJcHJvdG8gMiAwCglmcmFtZV9kaWcgLTIgLy8gbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gZHluYW1pYyBhcnJheSBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgZHluYW1pYyBhcnJheSBvZmZzZXQKCWxvYWQgNyAvLyBzdWJ0cmFjdCBoZWFkIGRpZmZlcmVuY2UKCWJ6IHN1YnRyYWN0X2hlYWRfZGlmZmVyZW5jZQoJKyAvLyBhZGQgZGlmZmVyZW5jZSB0byBvZmZzZXQKCWIgZW5kX2NhbGNfbmV3X2hlYWQKCnN1YnRyYWN0X2hlYWRfZGlmZmVyZW5jZToKCXN3YXAKCS0gLy8gc3VidHJhY3QgZGlmZmVyZW5jZSBmcm9tIG9mZmV0CgplbmRfY2FsY19uZXdfaGVhZDoKCWl0b2IgLy8gY29udmVydCB0byBieXRlcwoJZXh0cmFjdCA2IDIgLy8gY29udmVydCB0byB1aW50MTYKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglzd2FwCglmcmFtZV9kaWcgLTEgLy8gb2Zmc2V0Cglzd2FwCglyZXBsYWNlMyAvLyB1cGRhdGUgb2Zmc2V0CglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCXJldHN1YgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgY3JlYXRlCglpbnQgMQoJcmV0dXJuCgpjcmVhdGU6Cglwcm90byAwIDAKCXJldHN1YgoKYmFyZV9yb3V0ZV9PcHRJbjoKCXR4biBPbkNvbXBsZXRpb24KCWludCBPcHRJbgoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgb3B0SW4KCWludCAxCglyZXR1cm4KCm9wdEluOgoJcHJvdG8gMCAwCglyZXRzdWIKCmFiaV9yb3V0ZV9zdGF0aWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBzdGF0aWNBcnJheQoJaW50IDEKCXJldHVybgoKc3RhdGljQXJyYXk6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjkKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMQoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfcmV0dXJuU3RhdGljQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgcmV0dXJuU3RhdGljQXJyYXkKCWludCAxCglyZXR1cm4KCnJldHVyblN0YXRpY0FycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1CgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzcKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3RhdGljQXJyYXlBcmc6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWNhbGxzdWIgc3RhdGljQXJyYXlBcmcKCWludCAxCglyZXR1cm4KCnN0YXRpY0FycmF5QXJnOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQxCgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9ub25MaXRlcmFsU3RhdGljQXJyYXlFbGVtZW50czoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAzCgljYWxsc3ViIG5vbkxpdGVyYWxTdGF0aWNBcnJheUVsZW1lbnRzCglpbnQgMQoJcmV0dXJuCgpub25MaXRlcmFsU3RhdGljQXJyYXlFbGVtZW50czoKCXByb3RvIDQgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NQoJLy8gbjEgPSAxMQoJaW50IDExCglmcmFtZV9idXJ5IC0xIC8vIG4xOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDYKCS8vIG4yID0gMjIKCWludCAyMgoJZnJhbWVfYnVyeSAtMiAvLyBuMjogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ3CgkvLyBuMyA9IDMzCglpbnQgMzMKCWZyYW1lX2J1cnkgLTMgLy8gbjM6IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0OAoJLy8gYTogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFtuMSwgbjIsIG4zXQoJZnJhbWVfZGlnIC0xIC8vIG4xOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMiAvLyBuMjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBuMzogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2J1cnkgLTQgLy8gYTogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjUwCgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtNCAvLyBhOiB1aW50NjRbM10KCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9taXhlZFN0YXRpY0FycmF5RWxlbWVudHM6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMwoJY2FsbHN1YiBtaXhlZFN0YXRpY0FycmF5RWxlbWVudHMKCWludCAxCglyZXR1cm4KCm1peGVkU3RhdGljQXJyYXlFbGVtZW50czoKCXByb3RvIDQgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo1NAoJLy8gbjEgPSAzCglpbnQgMwoJZnJhbWVfYnVyeSAtMSAvLyBuMTogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjU1CgkvLyBuMiA9IDQKCWludCA0CglmcmFtZV9idXJ5IC0yIC8vIG4yOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NTYKCS8vIG4zID0gNQoJaW50IDUKCWZyYW1lX2J1cnkgLTMgLy8gbjM6IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo1NwoJLy8gYTogU3RhdGljQXJyYXk8dWludDY0LCA5PiA9IFswLCAxLCAyLCBuMSwgbjIsIG4zLCA2LCA3LCA4XQoJaW50IDAKCWl0b2IKCWludCAxCglpdG9iCgljb25jYXQKCWludCAyCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBuMTogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMiAvLyBuMjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBuMzogdWludDY0CglpdG9iCgljb25jYXQKCWludCA2CglpdG9iCgljb25jYXQKCWludCA3CglpdG9iCgljb25jYXQKCWludCA4CglpdG9iCgljb25jYXQKCWZyYW1lX2J1cnkgLTQgLy8gYTogdWludDY0WzldCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjU5CgkvLyByZXR1cm4gYVsxXSArIGFbNF0gKyBhWzddOwoJZnJhbWVfZGlnIC00IC8vIGE6IHVpbnQ2NFs5XQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyBhOiB1aW50NjRbOV0KCWludCA0CglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCgkrCglmcmFtZV9kaWcgLTQgLy8gYTogdWludDY0WzldCglpbnQgNwoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJKwoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfbm9uTGl0ZXJhbFN0YXRpY0FycmF5QWNjZXNzOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgbm9uTGl0ZXJhbFN0YXRpY0FycmF5QWNjZXNzCglpbnQgMQoJcmV0dXJuCgpub25MaXRlcmFsU3RhdGljQXJyYXlBY2Nlc3M6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NjMKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo2NAoJLy8gbiA9IDIKCWludCAyCglmcmFtZV9idXJ5IC0yIC8vIG46IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo2NgoJLy8gcmV0dXJuIGFbbl07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglmcmFtZV9kaWcgLTIgLy8gbjogdWludDY0CglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zZXRTdGF0aWNBcnJheUVsZW1lbnQ6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgc2V0U3RhdGljQXJyYXlFbGVtZW50CglpbnQgMQoJcmV0dXJuCgpzZXRTdGF0aWNBcnJheUVsZW1lbnQ6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NzAKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo3MgoJLy8gYVsxXSA9IDIyMgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMjIyCglpdG9iCglyZXBsYWNlMwoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NzQKCS8vIHJldHVybiBhWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3N0YXRpY0FycmF5SW5TdG9yYWdlUmVmOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgc3RhdGljQXJyYXlJblN0b3JhZ2VSZWYKCWludCAxCglyZXR1cm4KCnN0YXRpY0FycmF5SW5TdG9yYWdlUmVmOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjc4CgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6ODAKCS8vIHRoaXMuZ1JlZi5wdXQoYSkKCWJ5dGUgImdSZWYiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfZ2xvYmFsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo4MQoJLy8gdGhpcy5sUmVmLnB1dCh0aGlzLnR4bi5zZW5kZXIsIGEpCgl0eG4gU2VuZGVyCglieXRlICJsUmVmIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYXBwX2xvY2FsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo4MgoJLy8gdGhpcy5iUmVmLnB1dChhKQoJYnl0ZSAiYlJlZiIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWJveF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6ODQKCS8vIHJldDogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsKCWJ5dGUgImdSZWYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCXR4biBTZW5kZXIKCWJ5dGUgImxSZWYiCglhcHBfbG9jYWxfZ2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlICJiUmVmIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIHJldDogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjkwCgkvLyByZXR1cm4gcmV0OwoJZnJhbWVfZGlnIC0yIC8vIHJldDogdWludDY0WzNdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZVJlZjoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwCgljYWxsc3ViIHVwZGF0ZVN0YXRpY0FycmF5SW5TdG9yYWdlUmVmCglpbnQgMQoJcmV0dXJuCgp1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZVJlZjoKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo5NAoJLy8gYTogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsxMSwgMjIsIDMzXQoJaW50IDExCglpdG9iCglpbnQgMjIKCWl0b2IKCWNvbmNhdAoJaW50IDMzCglpdG9iCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjk2CgkvLyB0aGlzLmdSZWYucHV0KGEpCglieXRlICJnUmVmIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYXBwX2dsb2JhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6OTcKCS8vIHRoaXMubFJlZi5wdXQodGhpcy50eG4uc2VuZGVyLCBhKQoJdHhuIFNlbmRlcgoJYnl0ZSAibFJlZiIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9sb2NhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6OTgKCS8vIHRoaXMuYlJlZi5wdXQoYSkKCWJ5dGUgImJSZWYiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglib3hfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEwMAoJLy8gdGhpcy5nUmVmLmdldCgpWzFdID0gMTExCglieXRlICJnUmVmIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDExMQoJaXRvYgoJcmVwbGFjZTMKCWJ5dGUgImdSZWYiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMDEKCS8vIHRoaXMubFJlZi5nZXQodGhpcy50eG4uc2VuZGVyKVsxXSA9IDIyMgoJdHhuIFNlbmRlcgoJYnl0ZSAibFJlZiIKCWFwcF9sb2NhbF9nZXQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDIyMgoJaXRvYgoJcmVwbGFjZTMKCXR4biBTZW5kZXIKCWJ5dGUgImxSZWYiCgl1bmNvdmVyIDIKCWFwcF9sb2NhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTAyCgkvLyB0aGlzLmJSZWYuZ2V0KClbMV0gPSAzMzMKCWJ5dGUgImJSZWYiCglib3hfZ2V0Cglhc3NlcnQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDMzMwoJaXRvYgoJcmVwbGFjZTMKCWJ5dGUgImJSZWYiCglzd2FwCglib3hfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEwNAoJLy8gcmV0OiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWwoJYnl0ZSAiZ1JlZiIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJdHhuIFNlbmRlcgoJYnl0ZSAibFJlZiIKCWFwcF9sb2NhbF9nZXQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCgljb25jYXQKCWJ5dGUgImJSZWYiCglib3hfZ2V0Cglhc3NlcnQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2J1cnkgLTIgLy8gcmV0OiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTEwCgkvLyByZXR1cm4gcmV0OwoJZnJhbWVfZGlnIC0yIC8vIHJldDogdWludDY0WzNdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zdGF0aWNBcnJheUluU3RvcmFnZU1hcDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwCgljYWxsc3ViIHN0YXRpY0FycmF5SW5TdG9yYWdlTWFwCglpbnQgMQoJcmV0dXJuCgpzdGF0aWNBcnJheUluU3RvcmFnZU1hcDoKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMTQKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMTYKCS8vIHRoaXMuZ01hcC5wdXQoJ2dNYXAnLCBhKQoJYnl0ZSAiZ01hcCIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9nbG9iYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjExNwoJLy8gdGhpcy5sTWFwLnB1dCh0aGlzLnR4bi5zZW5kZXIsICdsTWFwJywgYSkKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfbG9jYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjExOAoJLy8gdGhpcy5iTWFwLnB1dCgnYk1hcCcsIGEpCglieXRlICJiTWFwIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMjAKCS8vIHJldDogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsKCWJ5dGUgImdNYXAiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglhcHBfbG9jYWxfZ2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlICJiTWFwIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIHJldDogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEyNgoJLy8gcmV0dXJuIHJldDsKCWZyYW1lX2RpZyAtMiAvLyByZXQ6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cAoJY2FsbHN1YiB1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZU1hcAoJaW50IDEKCXJldHVybgoKdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTMwCgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTMyCgkvLyB0aGlzLmdNYXAucHV0KCdnTWFwJywgYSkKCWJ5dGUgImdNYXAiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfZ2xvYmFsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMzMKCS8vIHRoaXMubE1hcC5wdXQodGhpcy50eG4uc2VuZGVyLCAnbE1hcCcsIGEpCgl0eG4gU2VuZGVyCglieXRlICJsTWFwIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYXBwX2xvY2FsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMzQKCS8vIHRoaXMuYk1hcC5wdXQoJ2JNYXAnLCBhKQoJYnl0ZSAiYk1hcCIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWJveF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTM2CgkvLyB0aGlzLmdNYXAuZ2V0KCdnTWFwJylbMV0gPSAxMTExCglieXRlICJnTWFwIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDExMTEKCWl0b2IKCXJlcGxhY2UzCglieXRlICJnTWFwIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTM3CgkvLyB0aGlzLmxNYXAuZ2V0KHRoaXMudHhuLnNlbmRlciwgJ2xNYXAnKVsxXSA9IDIyMjIKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglhcHBfbG9jYWxfZ2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAyMjIyCglpdG9iCglyZXBsYWNlMwoJdHhuIFNlbmRlcgoJYnl0ZSAibE1hcCIKCXVuY292ZXIgMgoJYXBwX2xvY2FsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMzgKCS8vIHRoaXMuYk1hcC5nZXQoJ2JNYXAnKVsxXSA9IDMzMzMKCWJ5dGUgImJNYXAiCglib3hfZ2V0Cglhc3NlcnQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDMzMzMKCWl0b2IKCXJlcGxhY2UzCglieXRlICJiTWFwIgoJc3dhcAoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNDAKCS8vIHJldDogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsKCWJ5dGUgImdNYXAiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglhcHBfbG9jYWxfZ2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlICJiTWFwIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIHJldDogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE0NgoJLy8gcmV0dXJuIHJldDsKCWZyYW1lX2RpZyAtMiAvLyByZXQ6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfbmVzdGVkU3RhdGljQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgbmVzdGVkU3RhdGljQXJyYXkKCWludCAxCglyZXR1cm4KCm5lc3RlZFN0YXRpY0FycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE1MAoJLy8gYTogU3RhdGljQXJyYXk8U3RhdGljQXJyYXk8dWludDY0LCAzPiwgMz4gPSBbWzExLCAyMiwgMzNdLCBbNDQsIDU1LCA2Nl0sIFs3NywgODgsIDk5XV0KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglpbnQgNDQKCWl0b2IKCWludCA1NQoJaXRvYgoJY29uY2F0CglpbnQgNjYKCWl0b2IKCWNvbmNhdAoJY29uY2F0CglpbnQgNzcKCWl0b2IKCWludCA4OAoJaXRvYgoJY29uY2F0CglpbnQgOTkKCWl0b2IKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXVszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNTIKCS8vIHJldHVybiBhWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXVszXQoJaW50IDEKCWludCAyNCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZU5lc3RlZFN0YXRpY0FycmF5RWxlbWVudDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiB1cGRhdGVOZXN0ZWRTdGF0aWNBcnJheUVsZW1lbnQKCWludCAxCglyZXR1cm4KCnVwZGF0ZU5lc3RlZFN0YXRpY0FycmF5RWxlbWVudDoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNTYKCS8vIGE6IFN0YXRpY0FycmF5PFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4sIDM+ID0gW1sxMSwgMjIsIDMzXSwgWzQ0LCA1NSwgNjZdLCBbNzcsIDg4LCA5OV1dCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJaW50IDQ0CglpdG9iCglpbnQgNTUKCWl0b2IKCWNvbmNhdAoJaW50IDY2CglpdG9iCgljb25jYXQKCWNvbmNhdAoJaW50IDc3CglpdG9iCglpbnQgODgKCWl0b2IKCWNvbmNhdAoJaW50IDk5CglpdG9iCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM11bM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTU4CgkvLyBhWzFdWzFdID0gNTU1CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdWzNdCglpbnQgMQoJaW50IDI0IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCSsKCWludCA1NTUKCWl0b2IKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXVszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNjAKCS8vIHJldHVybiBhWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXVszXQoJaW50IDEKCWludCAyNCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZU5lc3RlZFN0YXRpY0FycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHVwZGF0ZU5lc3RlZFN0YXRpY0FycmF5CglpbnQgMQoJcmV0dXJuCgp1cGRhdGVOZXN0ZWRTdGF0aWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNjQKCS8vIGE6IFN0YXRpY0FycmF5PFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4sIDM+ID0gW1sxMSwgMjIsIDMzXSwgWzQ0LCA1NSwgNjZdLCBbNzcsIDg4LCA5OV1dCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJaW50IDQ0CglpdG9iCglpbnQgNTUKCWl0b2IKCWNvbmNhdAoJaW50IDY2CglpdG9iCgljb25jYXQKCWNvbmNhdAoJaW50IDc3CglpdG9iCglpbnQgODgKCWl0b2IKCWNvbmNhdAoJaW50IDk5CglpdG9iCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM11bM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTY2CgkvLyBhWzFdID0gWzQ0NCwgNTU1LCA2NjZdCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdWzNdCglpbnQgMQoJaW50IDI0IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgNDQ0CglpdG9iCglpbnQgNTU1CglpdG9iCgljb25jYXQKCWludCA2NjYKCWl0b2IKCWNvbmNhdAoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdWzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE2OAoJLy8gcmV0dXJuIGFbMV1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdWzNdCglpbnQgMQoJaW50IDI0IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdGhyZWVEaW1lbnNpb25hbFVpbnQxNkFycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHRocmVlRGltZW5zaW9uYWxVaW50MTZBcnJheQoJaW50IDEKCXJldHVybgoKdGhyZWVEaW1lbnNpb25hbFVpbnQxNkFycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE3MgoJLy8gYTogU3RhdGljQXJyYXk8U3RhdGljQXJyYXk8U3RhdGljQXJyYXk8dWludDE2LCAyPiwgMj4sIDI+ID0gWwoJaW50IDExCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgNDQKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWNvbmNhdAoJaW50IDU1CglpdG9iCglleHRyYWN0IDYgMAoJaW50IDY2CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgNzcKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgODgKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNlsyXVsyXVsyXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNzYKCS8vIGFbMV1bMV0gPSBbNzc3LCA4ODhdCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2WzJdWzJdWzJdCglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAxCglpbnQgNCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJKwoJaW50IDc3NwoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA4ODgKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNlsyXVsyXVsyXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNzgKCS8vIHJldHVybiBhWzFdWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNlsyXVsyXVsyXQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMQoJaW50IDQgLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCSsKCWludCAxCglpbnQgMiAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJKwoJaW50IDIKCWV4dHJhY3QzCglieXRlIDB4RkZGRgoJYiYKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3NpbXBsZVR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHNpbXBsZVR1cGxlCglpbnQgMQoJcmV0dXJuCgpzaW1wbGVUdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxODIKCS8vIGE6IFt1aW50NjQsIHVpbnQxNiwgdWludDY0LCB1aW50MTZdID0gWzExLCAyMiwgMzMsIDQ0XQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMTQKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTEKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDIyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDQ0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50NjQsdWludDE2LHVpbnQ2NCx1aW50MTZdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE4NAoJLy8gcmV0dXJuIGFbM107CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQxNl0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMTgKCWludCAyCglleHRyYWN0MwoJYnl0ZSAweEZGRkYKCWImCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheUluVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYXJyYXlJblR1cGxlCglpbnQgMQoJcmV0dXJuCgphcnJheUluVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTg4CgkvLyBhOiBbdWludDY0LCB1aW50MTYsIFN0YXRpY0FycmF5PHVpbnQ2NCwgMj4sIHVpbnQxNl0gPSBbCglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAxYwoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAxMQoJaXRvYgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMjIKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAzMwoJaXRvYgoJaW50IDQ0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDU1CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50NjQsdWludDE2LHVpbnQ2NFsyXSx1aW50MTZdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE5MgoJLy8gcmV0dXJuIGFbMl1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0WzJdLHVpbnQxNl0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMTAKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV90dXBsZUluQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdHVwbGVJbkFycmF5CglpbnQgMQoJcmV0dXJuCgp0dXBsZUluQXJyYXk6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTk2CgkvLyBhOiBTdGF0aWNBcnJheTxbdWludDY0LCB1aW50MTZdLCAyPiA9IFsKCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDBhCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDExCglpdG9iCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAyMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMGEKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDQ0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTZdWzJdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIwMAoJLy8gcmV0dXJuIGFbMV1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTZdWzJdCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDEKCWludCAxMCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCSsKCWludCAyCglleHRyYWN0MwoJYnl0ZSAweEZGRkYKCWImCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV90dXBsZUluVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdHVwbGVJblR1cGxlCglpbnQgMQoJcmV0dXJuCgp0dXBsZUluVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjA0CgkvLyBhOiBbdWludDE2LCB1aW50MTYsIFt1aW50NjQsIHVpbnQxNl0sIFt1aW50MTYsIHVpbnQ2NF1dID0gWwoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMTgKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTEKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAyMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMGEKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDQ0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDBhCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDU1CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgNjYKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTYsdWludDE2LFt1aW50NjQsdWludDE2XSxbdWludDE2LHVpbnQ2NF1dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIwOAoJLy8gcmV0dXJuIGFbM11bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50MTYsW3VpbnQ2NCx1aW50MTZdLFt1aW50MTYsdWludDY0XV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMTQKCWludCAyCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3Nob3J0VHlwZU5vdGF0aW9uOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHNob3J0VHlwZU5vdGF0aW9uCglpbnQgMQoJcmV0dXJuCgpzaG9ydFR5cGVOb3RhdGlvbjoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMTIKCS8vIGE6IFt1aW50MTY8Mj4sIHVpbnQ2NDwyPiwgdWludDE2PDI+XSA9IFsKCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDE4CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDExCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAzMwoJaXRvYgoJaW50IDQ0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDU1CglpdG9iCglleHRyYWN0IDYgMAoJaW50IDY2CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNlsyXSx1aW50NjRbMl0sdWludDE2WzJdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMTYKCS8vIHJldHVybiBhWzJdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbMl0sdWludDY0WzJdLHVpbnQxNlsyXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMjAKCWludCAxCglpbnQgMiAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJKwoJaW50IDIKCWV4dHJhY3QzCglieXRlIDB4RkZGRgoJYiYKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2Rpc2d1c3Rpbmc6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgZGlzZ3VzdGluZwoJaW50IDEKCXJldHVybgoKZGlzZ3VzdGluZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMjAKCS8vIGE6IFN0YXRpY0FycmF5PFt1aW50MTY8Mj4sIHVpbnQ2NCwgW3VpbnQxNiwgdWludDY0XSwgU3RhdGljQXJyYXk8dWludDY0PDI+LCAyPl0sIDI+ID0gWwoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMzYKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTEKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMjIKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDMzCglpdG9iCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDBhCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDQ0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgNTUKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgNjYKCWl0b2IKCWludCA3NwoJaXRvYgoJY29uY2F0CglpbnQgODgKCWl0b2IKCWludCA5OQoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMzYKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTExCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIyMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMzCglpdG9iCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDBhCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDQ0NAoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDU1NQoJaXRvYgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCA2NjYKCWl0b2IKCWludCA3NzcKCWl0b2IKCWNvbmNhdAoJaW50IDg4OAoJaXRvYgoJaW50IDk5OQoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbMl0sdWludDY0LFt1aW50MTYsdWludDY0XSx1aW50NjRbMl1bMl1dWzJdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIyNQoJLy8gYVsxXVszXVsxXSA9IFs4ODg4LCA5OTk5XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbMl0sdWludDY0LFt1aW50MTYsdWludDY0XSx1aW50NjRbMl1bMl1dWzJdCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDEKCWludCA1NCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDIyCgkrCglpbnQgMQoJaW50IDE2IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CgkrCglpbnQgODg4OAoJaXRvYgoJaW50IDk5OTkKCWl0b2IKCWNvbmNhdAoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNlsyXSx1aW50NjQsW3VpbnQxNix1aW50NjRdLHVpbnQ2NFsyXVsyXV1bMl0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjI2CgkvLyByZXR1cm4gYVsxXVszXVsxXVswXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2WzJdLHVpbnQ2NCxbdWludDE2LHVpbnQ2NF0sdWludDY0WzJdWzJdXVsyXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAxCglpbnQgNTQgLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAyMgoJKwoJaW50IDEKCWludCAxNiAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJKwoJaW50IDAKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3JldHVyblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHJldHVyblR1cGxlCglpbnQgMQoJcmV0dXJuCgpyZXR1cm5UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMzAKCS8vIGE6IFt1aW50NjQsIHVpbnQxNiwgdWludDY0XSA9IFsxMSwgMjIsIDMzXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMTIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTEKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDIyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDY0LHVpbnQxNix1aW50NjRdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIzMQoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0XQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdHVwbGVBcmc6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWNhbGxzdWIgdHVwbGVBcmcKCWludCAxCglyZXR1cm4KCnR1cGxlQXJnOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIzNQoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0XQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCA4CglpbnQgMgoJZXh0cmFjdDMKCWJ5dGUgMHhGRkZGCgliJgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfZHluYW1pY0FycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIGR5bmFtaWNBcnJheQoJaW50IDEKCXJldHVybgoKZHluYW1pY0FycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIzOQoJLy8gYTogdWludDY0W10gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFtdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI0MQoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0W10KCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3JldHVybkR5bmFtaWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiByZXR1cm5EeW5hbWljQXJyYXkKCWludCAxCglyZXR1cm4KCnJldHVybkR5bmFtaWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNDUKCS8vIGE6IHVpbnQ2NFtdID0gWzExLCAyMiwgMzNdCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDMKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNDYKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9keW5hbWljQXJyYXlBcmc6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWNhbGxzdWIgZHluYW1pY0FycmF5QXJnCglpbnQgMQoJcmV0dXJuCgpkeW5hbWljQXJyYXlBcmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjUwCgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlRHluYW1pY0FycmF5RWxlbWVudDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljQXJyYXlFbGVtZW50CglpbnQgMQoJcmV0dXJuCgp1cGRhdGVEeW5hbWljQXJyYXlFbGVtZW50OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI1NAoJLy8gYTogdWludDY0W10gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFtdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI1NgoJLy8gYVsxXSA9IDIyMgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJaW50IDIyMgoJaXRvYgoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjU4CgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfZHluYW1pY1R1cGxlQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgZHluYW1pY1R1cGxlQXJyYXkKCWludCAxCglyZXR1cm4KCmR5bmFtaWNUdXBsZUFycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI2MgoJLy8gYTogW3VpbnQxNiwgdWludDY0XVtdID0gW1sxMSwgMjJdLCBbMzMsIDQ0XV0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDBhCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDExCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMjIKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMGEKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCA0NAoJaXRvYgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0Cgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNix1aW50NjRdW10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjY0CgkvLyByZXR1cm4gYVsxXVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2LHVpbnQ2NF1bXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAxCglpbnQgMTAgLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJaW50IDIKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfcmV0dXJuVHVwbGVXaXRoRHlhbWljQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgcmV0dXJuVHVwbGVXaXRoRHlhbWljQXJyYXkKCWludCAxCglyZXR1cm4KCnJldHVyblR1cGxlV2l0aER5YW1pY0FycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI2OAoJLy8gYTogW3VpbnQ2NCwgdWludDE2LCB1aW50NjRbXSwgdWludDE2W11dID0gWzEsIDIsIFszLCA0XSwgWzUsIDZdXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMGUKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMQoJaXRvYgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDMKCWl0b2IKCWludCA0CglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA2CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDY0LHVpbnQxNix1aW50NjRbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjcwCgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDY0LHVpbnQxNix1aW50NjRbXSx1aW50MTZbXV0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3JldHVybkR5bmFtaWNBcnJheUZyb21UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiByZXR1cm5EeW5hbWljQXJyYXlGcm9tVHVwbGUKCWludCAxCglyZXR1cm4KCnJldHVybkR5bmFtaWNBcnJheUZyb21UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNzQKCS8vIGE6IFt1aW50OCwgdWludDE2LCB1aW50OFtdLCB1aW50MTZbXSwgdWludDhbXV0gPSBbMSwgMiwgWzMsIDRdLCBbNSwgNl0sIFs3LCA4XV0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA5CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNyAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWludCA0CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDUKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgNgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWludCA3CglpdG9iCglleHRyYWN0IDcgMAoJaW50IDgKCWl0b2IKCWV4dHJhY3QgNyAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTYsdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNzYKCS8vIHJldHVybiBhWzRdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTYsdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCA3Cglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAxCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZUR5bmFtaWNBcnJheUluVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0FycmF5SW5UdXBsZQoJaW50IDEKCXJldHVybgoKdXBkYXRlRHluYW1pY0FycmF5SW5UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyODAKCS8vIGE6IFt1aW50OCwgdWludDE2W10sIHVpbnQ4W10sIHVpbnQxNltdLCB1aW50OFtdXSA9IFs5LCBbOF0sIFs3XSwgWzZdLCBbNV1dCglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAwOQoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCA5CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgOAoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNwoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNgoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI4MgoJLy8gYVswXSA9IDk5IGFzIHVpbnQ4CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMAoJaW50IDk5CglpdG9iCglleHRyYWN0IDcgMAoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjgzCgkvLyBhWzFdID0gWzEwLCAxMV0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAxCglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAyCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCXN0b3JlIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxvYWQgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBvbGQgZWxlbWVudAoJaW50IDEwCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDExCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglpbnQgMQoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY190dXBsZV9lbGVtZW50CglkdXAgLy8gZHVwIGxlbmd0aCBkaWZmZXJlbmNlCglpbnQgMwoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY19oZWFkCglkdXAgLy8gZHVwIGxlbmd0aCBkaWZmZXJlbmNlCglpbnQgNQoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY19oZWFkCglkdXAgLy8gZHVwIGxlbmd0aCBkaWZmZXJlbmNlCglpbnQgNwoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY19oZWFkCglwb3AgLy8gcG9wIGxlbmd0aCBkaWZmZXJlbmNlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyODQKCS8vIGFbMl0gPSBbMTIsIDEzXQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDMKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglpbnQgMTIKCWl0b2IKCWV4dHJhY3QgNyAwCglpbnQgMTMKCWl0b2IKCWV4dHJhY3QgNyAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWludCAzCgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX3R1cGxlX2VsZW1lbnQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCA1CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCA3CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCXBvcCAvLyBwb3AgbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI4NQoJLy8gYVszXSA9IFsxNCwgMTVdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNQoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMgoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCAxNAoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCAxNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJaW50IDUKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDcKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mjg2CgkvLyBhWzRdID0gWzE2LCAxN10KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCA3Cglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAxCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCXN0b3JlIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxvYWQgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBvbGQgZWxlbWVudAoJaW50IDE2CglpdG9iCglleHRyYWN0IDcgMAoJaW50IDE3CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglpbnQgNwoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY190dXBsZV9lbGVtZW50Cglwb3AgLy8gcG9wIGxlbmd0aCBkaWZmZXJlbmNlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyODgKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9ub25MaXRlcmFsRHluYW1pY0VsZW1lbnRJblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgbm9uTGl0ZXJhbER5bmFtaWNFbGVtZW50SW5UdXBsZQoJaW50IDEKCXJldHVybgoKbm9uTGl0ZXJhbER5bmFtaWNFbGVtZW50SW5UdXBsZToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyOTIKCS8vIGU6IHVpbnQxNltdID0gWzUsIDZdCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA2CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGU6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI5MwoJLy8gYTogW3VpbnQ4LCB1aW50MTYsIHVpbnQ4W10sIHVpbnQxNltdLCB1aW50OFtdXSA9IFsxLCAyLCBbMywgNF0sIGUsIFs3LCA4XV0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA5CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNyAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWludCA0CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJZnJhbWVfZGlnIC0xIC8vIGU6IHVpbnQxNltdCglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDcKCWl0b2IKCWV4dHJhY3QgNyAwCglpbnQgOAoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTIgLy8gYTogW3VpbnQ4LHVpbnQxNix1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI5NQoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTIgLy8gYTogW3VpbnQ4LHVpbnQxNix1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVB1c2g6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYXJyYXlQdXNoCglpbnQgMQoJcmV0dXJuCgphcnJheVB1c2g6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mjk5CgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyXQoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMDEKCS8vIGEucHVzaCgzIGFzIHVpbnQxNikKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJZXh0cmFjdCAyIDAKCWNvbmNhdAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzAzCgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfYXJyYXlQb3A6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYXJyYXlQb3AKCWludCAxCglyZXR1cm4KCmFycmF5UG9wOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMwNwoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCAzCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMwOQoJLy8gYS5wb3AoKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCglleHRyYWN0IDIgMAoJY29uY2F0CglkdXAKCWxlbgoJaW50IDIKCS0KCWludCAwCglzd2FwCglleHRyYWN0MwoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMTEKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVBvcFZhbHVlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgYXJyYXlQb3BWYWx1ZQoJaW50IDEKCXJldHVybgoKYXJyYXlQb3BWYWx1ZToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMTUKCS8vIGE6IHVpbnQxNltdID0gWzEsIDIsIDNdCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDMKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMTcKCS8vIHYgPSBhLnBvcCgpIQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCglleHRyYWN0IDIgMAoJY29uY2F0CglkdXAKCWxlbgoJaW50IDIKCS0KCWludCAwCglzd2FwCglleHRyYWN0MwoJZHVwCglsZW4KCWludCAyCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWNvdmVyIDIKCWV4dHJhY3QzCglzd2FwCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCglmcmFtZV9idXJ5IC0yIC8vIHY6IHVpbnQxNgoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMTkKCS8vIHJldHVybiB2OwoJZnJhbWVfZGlnIC0yIC8vIHY6IHVpbnQxNgoJYnl0ZSAweEZGRkYKCWImCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVNwbGljZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBhcnJheVNwbGljZQoJaW50IDEKCXJldHVybgoKYXJyYXlTcGxpY2U6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzIzCgkvLyBhOiB1aW50NjRbXSA9IFsxLCAyLCAzXQoJaW50IDEKCWl0b2IKCWludCAyCglpdG9iCgljb25jYXQKCWludCAzCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAzCglzd2FwCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzI1CgkvLyBhLnNwbGljZSgxLCAxKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgktCglpdG9iCglleHRyYWN0IDYgMgoJaW50IDEKCWludCA4CgkqCglpbnQgMgoJKwoJc3RvcmUgMTIgLy8gc3BsaWNlIHN0YXJ0CglpbnQgMQoJaW50IDgKCSoKCWludCA4CgkrCglzdG9yZSAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDIKCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0CglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0W10KCWR1cAoJbGVuCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCSsKCWludCA4CgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMjcKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVNwbGljZVZhbHVlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDMKCWNhbGxzdWIgYXJyYXlTcGxpY2VWYWx1ZQoJaW50IDEKCXJldHVybgoKYXJyYXlTcGxpY2VWYWx1ZToKCXByb3RvIDQgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMzEKCS8vIGE6IHVpbnQxNltdID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXQoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCA0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJaW50IDYKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCA3CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgOAoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJaW50IDkKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCAxMAoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMGEKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMzMKCS8vIGkgPSAxCglpbnQgMQoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzM0CgkvLyBsID0gNwoJaW50IDcKCWZyYW1lX2J1cnkgLTMgLy8gbDogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMzNQoJLy8gdiA9IGEuc3BsaWNlKGksIGwpCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAwCglleHRyYWN0X3VpbnQxNgoJZnJhbWVfZGlnIC0zIC8vIGw6IHVpbnQ2NAoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtMiAvLyBpOiB1aW50NjQKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTIgLy8gc3BsaWNlIHN0YXJ0CglmcmFtZV9kaWcgLTMgLy8gbDogdWludDY0CglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9kaWcgLTMgLy8gbDogdWludDY0CglpdG9iCglleHRyYWN0IDYgMgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWludCAyCgktCglleHRyYWN0MwoJY29uY2F0Cglzd2FwCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCglmcmFtZV9idXJ5IC00IC8vIHY6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMzNwoJLy8gcmV0dXJuIHY7CglmcmFtZV9kaWcgLTQgLy8gdjogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2R5bmFtaWNBcnJheUVsZW1lbnRzOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgZHluYW1pY0FycmF5RWxlbWVudHMKCWludCAxCglyZXR1cm4KCmR5bmFtaWNBcnJheUVsZW1lbnRzOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM0MQoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCAzCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM0MgoJLy8gbmV3QTogdWludDE2W10gPSBbYVswXSwgYVsxXSwgYVsyXV0KCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDAKCWludCAyIC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWludCAyCglleHRyYWN0MwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMQoJaW50IDIgLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJaW50IDIKCWV4dHJhY3QzCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDIKCWludCAyIC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWludCAyCglleHRyYWN0MwoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIG5ld0E6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM0NAoJLy8gcmV0dXJuIG5ld0E7CglmcmFtZV9kaWcgLTIgLy8gbmV3QTogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3NwbGljZUxhc3RFbGVtZW50OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHNwbGljZUxhc3RFbGVtZW50CglpbnQgMQoJcmV0dXJuCgpzcGxpY2VMYXN0RWxlbWVudDoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNDgKCS8vIGE6IHVpbnQxNltdID0gWzEsIDIsIDNdCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDMKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNTAKCS8vIGEuc3BsaWNlKDIsIDEpCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglpbnQgMgoJaW50IDIKCSoKCWludCAyCgkrCglzdG9yZSAxMiAvLyBzcGxpY2Ugc3RhcnQKCWludCAxCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1MgoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3NwbGljZUxhc3RFbGVtZW50VmFsdWU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cAoJY2FsbHN1YiBzcGxpY2VMYXN0RWxlbWVudFZhbHVlCglpbnQgMQoJcmV0dXJuCgpzcGxpY2VMYXN0RWxlbWVudFZhbHVlOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1NgoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCAzCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1OAoJLy8gdiA9IGEuc3BsaWNlKDIsIDEpCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglpbnQgMgoJaW50IDIKCSoKCWludCAyCgkrCglzdG9yZSAxMiAvLyBzcGxpY2Ugc3RhcnQKCWludCAxCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglpbnQgMgoJLQoJZXh0cmFjdDMKCWNvbmNhdAoJc3dhcAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoJZnJhbWVfYnVyeSAtMiAvLyB2OiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNjAKCS8vIHJldHVybiB2OwoJZnJhbWVfZGlnIC0yIC8vIHY6IHVpbnQxNltdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zcGxpY2VGaXJzdEVsZW1lbnQ6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgc3BsaWNlRmlyc3RFbGVtZW50CglpbnQgMQoJcmV0dXJuCgpzcGxpY2VGaXJzdEVsZW1lbnQ6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzY0CgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyLCAzXQoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWJ5dGUgMHgwMDAzCglzd2FwCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzY2CgkvLyBhLnNwbGljZSgwLCAxKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgktCglpdG9iCglleHRyYWN0IDYgMgoJaW50IDAKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTIgLy8gc3BsaWNlIHN0YXJ0CglpbnQgMQoJaW50IDIKCSoKCWludCAyCgkrCglzdG9yZSAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDIKCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0CglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWR1cAoJbGVuCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCSsKCWludCAyCgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNjgKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zcGxpY2VGaXJzdEVsZW1lbnRWYWx1ZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwCgljYWxsc3ViIHNwbGljZUZpcnN0RWxlbWVudFZhbHVlCglpbnQgMQoJcmV0dXJuCgpzcGxpY2VGaXJzdEVsZW1lbnRWYWx1ZToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNzIKCS8vIGE6IHVpbnQxNltdID0gWzEsIDIsIDNdCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDMKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNzQKCS8vIHYgPSBhLnNwbGljZSgwLCAxKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgktCglpdG9iCglleHRyYWN0IDYgMgoJaW50IDAKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTIgLy8gc3BsaWNlIHN0YXJ0CglpbnQgMQoJaW50IDIKCSoKCWludCAyCgkrCglzdG9yZSAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDIKCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0CglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWR1cAoJbGVuCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCSsKCWludCAyCgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWNvbmNhdAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAyCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJaW50IDIKCS0KCWV4dHJhY3QzCgljb25jYXQKCXN3YXAKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCWZyYW1lX2J1cnkgLTIgLy8gdjogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mzc2CgkvLyByZXR1cm4gdjsKCWZyYW1lX2RpZyAtMiAvLyB2OiB1aW50MTZbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3RyaW5nUmV0dXJuOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CgljYWxsc3ViIHN0cmluZ1JldHVybgoJaW50IDEKCXJldHVybgoKc3RyaW5nUmV0dXJuOgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM4MAoJLy8gcmV0dXJuICdIZWxsbyBXb3JsZCEnOwoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3N0cmluZ0FyZzoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgc3RyaW5nQXJnCglpbnQgMQoJcmV0dXJuCgpzdHJpbmdBcmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mzg0CgkvLyBhc3NlcnQocyA9PT0gJ0hlbGxvIFdvcmxkIScpCglmcmFtZV9kaWcgLTEgLy8gczogYnl0ZXMKCWJ5dGUgIkhlbGxvIFdvcmxkISIKCT09Cglhc3NlcnQKCXJldHN1YgoKYWJpX3JvdXRlX3N0cmluZ0luVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgc3RyaW5nSW5UdXBsZQoJaW50IDEKCXJldHVybgoKc3RyaW5nSW5UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozODgKCS8vIGE6IFt1aW50MTYsIHVpbnQ4W10sIHN0cmluZywgdWludDhbXV0gPSBbMSwgWzJdLCAnSGVsbG8gV29ybGQhJywgWzNdXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDgKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNyAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSxzdHJpbmcsdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzkwCgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2LHVpbnQ4W10sc3RyaW5nLHVpbnQ4W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hY2Nlc1N0cmluZ0luVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYWNjZXNTdHJpbmdJblR1cGxlCglpbnQgMQoJcmV0dXJuCgphY2Nlc1N0cmluZ0luVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mzk0CgkvLyBhOiBbdWludDE2LCB1aW50OFtdLCBzdHJpbmcsIHVpbnQ4W11dID0gWzEsIFsyXSwgJ0hlbGxvIFdvcmxkIScsIFszXV0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA4CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWludCAyCglpdG9iCglleHRyYWN0IDcgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWJ5dGUgIkhlbGxvIFdvcmxkISIKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNyAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2LHVpbnQ4W10sc3RyaW5nLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM5NgoJLy8gYXNzZXJ0KGFbMl0gPT09ICdIZWxsbyBXb3JsZCEnKQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSxzdHJpbmcsdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNAoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglleHRyYWN0IDIgMAoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJPT0KCWFzc2VydAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozOTgKCS8vIHJldHVybiBhWzJdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSxzdHJpbmcsdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNAoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglleHRyYWN0IDIgMAoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZVN0cmluZ0luVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdXBkYXRlU3RyaW5nSW5UdXBsZQoJaW50IDEKCXJldHVybgoKdXBkYXRlU3RyaW5nSW5UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MDIKCS8vIGE6IFt1aW50OCwgdWludDE2W10sIHN0cmluZywgdWludDE2W10sIHVpbnQ4W11dID0gWzksIFs4XSwgJ0hpPycsIFs2XSwgWzVdXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDkKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgOQoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDgKCWl0b2IKCWV4dHJhY3QgNiAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJYnl0ZSAiSGk/IgoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNgoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDA0CgkvLyBhWzBdID0gOTkgYXMgdWludDgKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDAKCWludCA5OQoJaXRvYgoJZXh0cmFjdCA3IDAKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDA1CgkvLyBhWzFdID0gWzEwLCAxMV0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDEKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDIKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglpbnQgMTAKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMTEKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWludCAxCgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX3R1cGxlX2VsZW1lbnQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCAzCgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCA1CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCA3CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCXBvcCAvLyBwb3AgbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDA2CgkvLyBhWzJdID0gJ0hlbGxvIFdvcmxkIScKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDMKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglieXRlICJIZWxsbyBXb3JsZCEiCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJaW50IDMKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDUKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDcKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MDcKCS8vIGFbM10gPSBbMTQsIDE1XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNQoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMgoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCAxNAoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCAxNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJaW50IDUKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDcKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MDgKCS8vIGFbNF0gPSBbMTYsIDE3XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNwoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCAxNgoJaXRvYgoJZXh0cmFjdCA3IDAKCWludCAxNwoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJaW50IDcKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MTAKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZVR1cGxlV2l0aE9ubHlEeW5hbWljVHlwZXM6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdXBkYXRlVHVwbGVXaXRoT25seUR5bmFtaWNUeXBlcwoJaW50IDEKCXJldHVybgoKdXBkYXRlVHVwbGVXaXRoT25seUR5bmFtaWNUeXBlczoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MTQKCS8vIGE6IFt1aW50MTZbXSwgdWludDE2W10sIHVpbnQxNltdXSA9IFtbMV0sIFsyXSwgWzNdXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDYKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDE2CgkvLyBhWzBdID0gWzQsIDVdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAwCglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAyCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCXN0b3JlIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxvYWQgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBvbGQgZWxlbWVudAoJaW50IDQKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJaW50IDAKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDIKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDQKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MTcKCS8vIGFbMV0gPSBbNiwgN10KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDIKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglpbnQgNgoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA3CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglpbnQgMgoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY190dXBsZV9lbGVtZW50CglkdXAgLy8gZHVwIGxlbmd0aCBkaWZmZXJlbmNlCglpbnQgNAoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY19oZWFkCglwb3AgLy8gcG9wIGxlbmd0aCBkaWZmZXJlbmNlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQxOAoJLy8gYVsyXSA9IFs4LCA5XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNAoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMgoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCA4CglpdG9iCglleHRyYWN0IDYgMAoJaW50IDkKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWludCA0CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX3R1cGxlX2VsZW1lbnQKCXBvcCAvLyBwb3AgbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDIwCgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zaG9ydGVuRHluYW1pY0VsZW1lbnRJblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHNob3J0ZW5EeW5hbWljRWxlbWVudEluVHVwbGUKCWludCAxCglyZXR1cm4KCnNob3J0ZW5EeW5hbWljRWxlbWVudEluVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDI0CgkvLyBhOiBbdWludDE2W10sIHVpbnQxNltdLCB1aW50MTZbXV0gPSBbWzEsIDJdLCBbMiwgM10sIFszLCA0XV0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA2CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQyNgoJLy8gYVswXSA9IFs1XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMAoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMgoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCA1CglpdG9iCglleHRyYWN0IDYgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJaW50IDAKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDIKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDQKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MjcKCS8vIGFbMV0gPSBbNl0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDIKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglpbnQgNgoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWludCAyCgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX3R1cGxlX2VsZW1lbnQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCA0CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCXBvcCAvLyBwb3AgbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDI4CgkvLyBhWzJdID0gWzddCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCA0Cglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAyCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCXN0b3JlIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxvYWQgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBvbGQgZWxlbWVudAoJaW50IDcKCWl0b2IKCWV4dHJhY3QgNiAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglpbnQgNAoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY190dXBsZV9lbGVtZW50Cglwb3AgLy8gcG9wIGxlbmd0aCBkaWZmZXJlbmNlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQzMAoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfbmFtZWRUdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBuYW1lZFR1cGxlCglpbnQgMQoJcmV0dXJuCgpuYW1lZFR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQzNAoJLy8gYTogewoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDQKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHsgZm9vOiB1aW50MTYsIGJhcjogc3RyaW5nLCB9CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ0MgoJLy8gcmV0dXJuIGEuYmFyOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHsgZm9vOiB1aW50MTYsIGJhcjogc3RyaW5nLCB9CglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJZXh0cmFjdCAyIDAKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVOYW1lZFR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHVwZGF0ZU5hbWVkVHVwbGUKCWludCAxCglyZXR1cm4KCnVwZGF0ZU5hbWVkVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDQ2CgkvLyBhOiB7CglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAwNAoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglieXRlICJIaT8iCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogeyBmb286IHVpbnQxNiwgYmFyOiBzdHJpbmcsIH0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDU0CgkvLyBhLmJhciA9ICdIZWxsbyBXb3JsZCEnCglmcmFtZV9kaWcgLTEgLy8gYTogeyBmb286IHVpbnQxNiwgYmFyOiBzdHJpbmcsIH0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMgoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWJ5dGUgIkhlbGxvIFdvcmxkISIKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpbnQgMgoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY190dXBsZV9lbGVtZW50Cglwb3AgLy8gcG9wIGxlbmd0aCBkaWZmZXJlbmNlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfYnVyeSAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NTYKCS8vIHJldHVybiBhLmJhcjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAyCglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAxCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCWV4dHJhY3QgMiAwCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfY3VzdG9tVHlwZXM6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgY3VzdG9tVHlwZXMKCWludCAxCglyZXR1cm4KCmN1c3RvbVR5cGVzOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ2MAoJLy8gYWE6IEN1c3RvbVR5cGUgPSB7CglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAwNAoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglieXRlICJIaT8iCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYWE6IEN1c3RvbVR5cGUKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDY1CgkvLyBhYS5iYXIgPSAnSGVsbG8gV29ybGQhJwoJZnJhbWVfZGlnIC0xIC8vIGFhOiBDdXN0b21UeXBlCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglieXRlICJIZWxsbyBXb3JsZCEiCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJaW50IDIKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYWE6IEN1c3RvbVR5cGUKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDY3CgkvLyByZXR1cm4gYWEuYmFyOwoJZnJhbWVfZGlnIC0xIC8vIGFhOiBDdXN0b21UeXBlCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJZXh0cmFjdCAyIDAKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zdGF0aWNTdHJpbmdBcnJheUFyZzoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJY2FsbHN1YiBzdGF0aWNTdHJpbmdBcnJheUFyZwoJaW50IDEKCXJldHVybgoKc3RhdGljU3RyaW5nQXJyYXlBcmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDcxCgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBieXRlc1szXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAxCglpbnQgMgoJKgoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglleHRyYWN0IDIgMAoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2R5bmFtaWNBY2Nlc3NPZkR5bmFtaWNFbGVtZW50SW5TdGF0aWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJY2FsbHN1YiBkeW5hbWljQWNjZXNzT2ZEeW5hbWljRWxlbWVudEluU3RhdGljQXJyYXkKCWludCAxCglyZXR1cm4KCmR5bmFtaWNBY2Nlc3NPZkR5bmFtaWNFbGVtZW50SW5TdGF0aWNBcnJheToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NzUKCS8vIGkgPSAxCglpbnQgMQoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDc2CgkvLyByZXR1cm4gYVtpXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBieXRlc1szXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2RpZyAtMiAvLyBpOiB1aW50NjQKCWludCAyCgkqCglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAxCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCWV4dHJhY3QgMiAwCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfZHluYW1pY0FycmF5SW5NaWRkbGVPZlR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIGR5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZQoJaW50IDEKCXJldHVybgoKZHluYW1pY0FycmF5SW5NaWRkbGVPZlR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ4MAoJLy8gYTogW3VpbnQxNiwgdWludDhbXSwgdWludDE2XSA9IFsxLCBbMl0sIDNdCglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAwNgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2LHVpbnQ4W10sdWludDE2XQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0ODIKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSx1aW50MTZdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hY2Nlc3NEeW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYWNjZXNzRHluYW1pY0FycmF5SW5NaWRkbGVPZlR1cGxlCglpbnQgMQoJcmV0dXJuCgphY2Nlc3NEeW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDg2CgkvLyBhOiBbdWludDE2LCB1aW50OFtdLCB1aW50MTZdID0gWzEsIFsyXSwgM10KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA2CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWludCAyCglpdG9iCglleHRyYWN0IDcgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAzCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSx1aW50MTZdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ4OAoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdLHVpbnQxNl0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMgoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hY2Nlc3NEeW5hbWljQXJyYXlFbGVtZW50SW5UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBhY2Nlc3NEeW5hbWljQXJyYXlFbGVtZW50SW5UdXBsZQoJaW50IDEKCXJldHVybgoKYWNjZXNzRHluYW1pY0FycmF5RWxlbWVudEluVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDkyCgkvLyBhOiBbdWludDE2LCB1aW50OFtdXSA9IFsxMSwgWzIyLCAzMywgNDRdXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDQKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTEKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWludCAyMgoJaXRvYgoJZXh0cmFjdCA3IDAKCWludCAzMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJaW50IDQ0CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2LHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ5NAoJLy8gcmV0dXJuIGFbMV1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAyCglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWludCAxCglpbnQgMSAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCgkrCglpbnQgMQoJZXh0cmFjdDMKCWJ5dGUgMHhGRkZGRkZGRgoJYiYKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZUR5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGUKCWludCAxCglyZXR1cm4KCnVwZGF0ZUR5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0OTgKCS8vIGE6IFt1aW50MTYsIHVpbnQ4W10sIHVpbnQxNl0gPSBbMSwgWzJdLCAzXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDYKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNyAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdLHVpbnQxNl0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NTAwCgkvLyBhWzFdID0gWzQsIDVdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdLHVpbnQxNl0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMgoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCA0CglpdG9iCglleHRyYWN0IDcgMAoJaW50IDUKCWl0b2IKCWV4dHJhY3QgNyAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWludCAyCgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX3R1cGxlX2VsZW1lbnQKCXBvcCAvLyBwb3AgbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSx1aW50MTZdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjUwMgoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdLHVpbnQxNl0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKbWFpbjoKCXR4biBOdW1BcHBBcmdzCglibnogcm91dGVfYWJpCgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCT09CglibnogYmFyZV9yb3V0ZV9jcmVhdGUKCXR4biBPbkNvbXBsZXRpb24KCWludCBPcHRJbgoJPT0KCWludCAxCgltYXRjaCBiYXJlX3JvdXRlX09wdEluCgpyb3V0ZV9hYmk6CgltZXRob2QgInN0YXRpY0FycmF5KCl1aW50NjQiCgltZXRob2QgInJldHVyblN0YXRpY0FycmF5KCl1aW50NjRbM10iCgltZXRob2QgInN0YXRpY0FycmF5QXJnKHVpbnQ2NFszXSl1aW50NjQiCgltZXRob2QgIm5vbkxpdGVyYWxTdGF0aWNBcnJheUVsZW1lbnRzKCl1aW50NjQiCgltZXRob2QgIm1peGVkU3RhdGljQXJyYXlFbGVtZW50cygpdWludDY0IgoJbWV0aG9kICJub25MaXRlcmFsU3RhdGljQXJyYXlBY2Nlc3MoKXVpbnQ2NCIKCW1ldGhvZCAic2V0U3RhdGljQXJyYXlFbGVtZW50KCl1aW50NjQiCgltZXRob2QgInN0YXRpY0FycmF5SW5TdG9yYWdlUmVmKCl1aW50NjRbM10iCgltZXRob2QgInVwZGF0ZVN0YXRpY0FycmF5SW5TdG9yYWdlUmVmKCl1aW50NjRbM10iCgltZXRob2QgInN0YXRpY0FycmF5SW5TdG9yYWdlTWFwKCl1aW50NjRbM10iCgltZXRob2QgInVwZGF0ZVN0YXRpY0FycmF5SW5TdG9yYWdlTWFwKCl1aW50NjRbM10iCgltZXRob2QgIm5lc3RlZFN0YXRpY0FycmF5KCl1aW50NjQiCgltZXRob2QgInVwZGF0ZU5lc3RlZFN0YXRpY0FycmF5RWxlbWVudCgpdWludDY0IgoJbWV0aG9kICJ1cGRhdGVOZXN0ZWRTdGF0aWNBcnJheSgpdWludDY0IgoJbWV0aG9kICJ0aHJlZURpbWVuc2lvbmFsVWludDE2QXJyYXkoKXVpbnQxNiIKCW1ldGhvZCAic2ltcGxlVHVwbGUoKXVpbnQxNiIKCW1ldGhvZCAiYXJyYXlJblR1cGxlKCl1aW50NjQiCgltZXRob2QgInR1cGxlSW5BcnJheSgpdWludDE2IgoJbWV0aG9kICJ0dXBsZUluVHVwbGUoKXVpbnQ2NCIKCW1ldGhvZCAic2hvcnRUeXBlTm90YXRpb24oKXVpbnQxNiIKCW1ldGhvZCAiZGlzZ3VzdGluZygpdWludDY0IgoJbWV0aG9kICJyZXR1cm5UdXBsZSgpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAidHVwbGVBcmcoKHVpbnQ2NCx1aW50MTYsdWludDY0KSl1aW50MTYiCgltZXRob2QgImR5bmFtaWNBcnJheSgpdWludDY0IgoJbWV0aG9kICJyZXR1cm5EeW5hbWljQXJyYXkoKXVpbnQ2NFtdIgoJbWV0aG9kICJkeW5hbWljQXJyYXlBcmcodWludDY0W10pdWludDY0IgoJbWV0aG9kICJ1cGRhdGVEeW5hbWljQXJyYXlFbGVtZW50KCl1aW50NjQiCgltZXRob2QgImR5bmFtaWNUdXBsZUFycmF5KCl1aW50NjQiCgltZXRob2QgInJldHVyblR1cGxlV2l0aER5YW1pY0FycmF5KCkodWludDY0LHVpbnQxNix1aW50NjRbXSx1aW50MTZbXSkiCgltZXRob2QgInJldHVybkR5bmFtaWNBcnJheUZyb21UdXBsZSgpdWludDhbXSIKCW1ldGhvZCAidXBkYXRlRHluYW1pY0FycmF5SW5UdXBsZSgpKHVpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXSkiCgltZXRob2QgIm5vbkxpdGVyYWxEeW5hbWljRWxlbWVudEluVHVwbGUoKSh1aW50OCx1aW50MTYsdWludDhbXSx1aW50MTZbXSx1aW50OFtdKSIKCW1ldGhvZCAiYXJyYXlQdXNoKCl1aW50MTZbXSIKCW1ldGhvZCAiYXJyYXlQb3AoKXVpbnQxNltdIgoJbWV0aG9kICJhcnJheVBvcFZhbHVlKCl1aW50MTYiCgltZXRob2QgImFycmF5U3BsaWNlKCl1aW50NjRbXSIKCW1ldGhvZCAiYXJyYXlTcGxpY2VWYWx1ZSgpdWludDE2W10iCgltZXRob2QgImR5bmFtaWNBcnJheUVsZW1lbnRzKCl1aW50MTZbXSIKCW1ldGhvZCAic3BsaWNlTGFzdEVsZW1lbnQoKXVpbnQxNltdIgoJbWV0aG9kICJzcGxpY2VMYXN0RWxlbWVudFZhbHVlKCl1aW50MTZbXSIKCW1ldGhvZCAic3BsaWNlRmlyc3RFbGVtZW50KCl1aW50MTZbXSIKCW1ldGhvZCAic3BsaWNlRmlyc3RFbGVtZW50VmFsdWUoKXVpbnQxNltdIgoJbWV0aG9kICJzdHJpbmdSZXR1cm4oKXN0cmluZyIKCW1ldGhvZCAic3RyaW5nQXJnKHN0cmluZyl2b2lkIgoJbWV0aG9kICJzdHJpbmdJblR1cGxlKCkodWludDE2LHVpbnQ4W10sc3RyaW5nLHVpbnQ4W10pIgoJbWV0aG9kICJhY2Nlc1N0cmluZ0luVHVwbGUoKXN0cmluZyIKCW1ldGhvZCAidXBkYXRlU3RyaW5nSW5UdXBsZSgpKHVpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdKSIKCW1ldGhvZCAidXBkYXRlVHVwbGVXaXRoT25seUR5bmFtaWNUeXBlcygpKHVpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdKSIKCW1ldGhvZCAic2hvcnRlbkR5bmFtaWNFbGVtZW50SW5UdXBsZSgpKHVpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdKSIKCW1ldGhvZCAibmFtZWRUdXBsZSgpc3RyaW5nIgoJbWV0aG9kICJ1cGRhdGVOYW1lZFR1cGxlKClzdHJpbmciCgltZXRob2QgImN1c3RvbVR5cGVzKClzdHJpbmciCgltZXRob2QgInN0YXRpY1N0cmluZ0FycmF5QXJnKHN0cmluZ1szXSlzdHJpbmciCgltZXRob2QgImR5bmFtaWNBY2Nlc3NPZkR5bmFtaWNFbGVtZW50SW5TdGF0aWNBcnJheShzdHJpbmdbM10pc3RyaW5nIgoJbWV0aG9kICJkeW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGUoKSh1aW50MTYsdWludDhbXSx1aW50MTYpIgoJbWV0aG9kICJhY2Nlc3NEeW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGUoKXVpbnQ4W10iCgltZXRob2QgImFjY2Vzc0R5bmFtaWNBcnJheUVsZW1lbnRJblR1cGxlKCl1aW50MzIiCgltZXRob2QgInVwZGF0ZUR5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZSgpKHVpbnQxNix1aW50OFtdLHVpbnQxNikiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCBhYmlfcm91dGVfc3RhdGljQXJyYXkgYWJpX3JvdXRlX3JldHVyblN0YXRpY0FycmF5IGFiaV9yb3V0ZV9zdGF0aWNBcnJheUFyZyBhYmlfcm91dGVfbm9uTGl0ZXJhbFN0YXRpY0FycmF5RWxlbWVudHMgYWJpX3JvdXRlX21peGVkU3RhdGljQXJyYXlFbGVtZW50cyBhYmlfcm91dGVfbm9uTGl0ZXJhbFN0YXRpY0FycmF5QWNjZXNzIGFiaV9yb3V0ZV9zZXRTdGF0aWNBcnJheUVsZW1lbnQgYWJpX3JvdXRlX3N0YXRpY0FycmF5SW5TdG9yYWdlUmVmIGFiaV9yb3V0ZV91cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZVJlZiBhYmlfcm91dGVfc3RhdGljQXJyYXlJblN0b3JhZ2VNYXAgYWJpX3JvdXRlX3VwZGF0ZVN0YXRpY0FycmF5SW5TdG9yYWdlTWFwIGFiaV9yb3V0ZV9uZXN0ZWRTdGF0aWNBcnJheSBhYmlfcm91dGVfdXBkYXRlTmVzdGVkU3RhdGljQXJyYXlFbGVtZW50IGFiaV9yb3V0ZV91cGRhdGVOZXN0ZWRTdGF0aWNBcnJheSBhYmlfcm91dGVfdGhyZWVEaW1lbnNpb25hbFVpbnQxNkFycmF5IGFiaV9yb3V0ZV9zaW1wbGVUdXBsZSBhYmlfcm91dGVfYXJyYXlJblR1cGxlIGFiaV9yb3V0ZV90dXBsZUluQXJyYXkgYWJpX3JvdXRlX3R1cGxlSW5UdXBsZSBhYmlfcm91dGVfc2hvcnRUeXBlTm90YXRpb24gYWJpX3JvdXRlX2Rpc2d1c3RpbmcgYWJpX3JvdXRlX3JldHVyblR1cGxlIGFiaV9yb3V0ZV90dXBsZUFyZyBhYmlfcm91dGVfZHluYW1pY0FycmF5IGFiaV9yb3V0ZV9yZXR1cm5EeW5hbWljQXJyYXkgYWJpX3JvdXRlX2R5bmFtaWNBcnJheUFyZyBhYmlfcm91dGVfdXBkYXRlRHluYW1pY0FycmF5RWxlbWVudCBhYmlfcm91dGVfZHluYW1pY1R1cGxlQXJyYXkgYWJpX3JvdXRlX3JldHVyblR1cGxlV2l0aER5YW1pY0FycmF5IGFiaV9yb3V0ZV9yZXR1cm5EeW5hbWljQXJyYXlGcm9tVHVwbGUgYWJpX3JvdXRlX3VwZGF0ZUR5bmFtaWNBcnJheUluVHVwbGUgYWJpX3JvdXRlX25vbkxpdGVyYWxEeW5hbWljRWxlbWVudEluVHVwbGUgYWJpX3JvdXRlX2FycmF5UHVzaCBhYmlfcm91dGVfYXJyYXlQb3AgYWJpX3JvdXRlX2FycmF5UG9wVmFsdWUgYWJpX3JvdXRlX2FycmF5U3BsaWNlIGFiaV9yb3V0ZV9hcnJheVNwbGljZVZhbHVlIGFiaV9yb3V0ZV9keW5hbWljQXJyYXlFbGVtZW50cyBhYmlfcm91dGVfc3BsaWNlTGFzdEVsZW1lbnQgYWJpX3JvdXRlX3NwbGljZUxhc3RFbGVtZW50VmFsdWUgYWJpX3JvdXRlX3NwbGljZUZpcnN0RWxlbWVudCBhYmlfcm91dGVfc3BsaWNlRmlyc3RFbGVtZW50VmFsdWUgYWJpX3JvdXRlX3N0cmluZ1JldHVybiBhYmlfcm91dGVfc3RyaW5nQXJnIGFiaV9yb3V0ZV9zdHJpbmdJblR1cGxlIGFiaV9yb3V0ZV9hY2Nlc1N0cmluZ0luVHVwbGUgYWJpX3JvdXRlX3VwZGF0ZVN0cmluZ0luVHVwbGUgYWJpX3JvdXRlX3VwZGF0ZVR1cGxlV2l0aE9ubHlEeW5hbWljVHlwZXMgYWJpX3JvdXRlX3Nob3J0ZW5EeW5hbWljRWxlbWVudEluVHVwbGUgYWJpX3JvdXRlX25hbWVkVHVwbGUgYWJpX3JvdXRlX3VwZGF0ZU5hbWVkVHVwbGUgYWJpX3JvdXRlX2N1c3RvbVR5cGVzIGFiaV9yb3V0ZV9zdGF0aWNTdHJpbmdBcnJheUFyZyBhYmlfcm91dGVfZHluYW1pY0FjY2Vzc09mRHluYW1pY0VsZW1lbnRJblN0YXRpY0FycmF5IGFiaV9yb3V0ZV9keW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGUgYWJpX3JvdXRlX2FjY2Vzc0R5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZSBhYmlfcm91dGVfYWNjZXNzRHluYW1pY0FycmF5RWxlbWVudEluVHVwbGUgYWJpX3JvdXRlX3VwZGF0ZUR5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZQ==","clear":"I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"},"contract":{"name":"AbiTest","desc":"","methods":[{"name":"staticArray","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"returnStaticArray","args":[],"desc":"","returns":{"type":"uint64[3]","desc":""}},{"name":"staticArrayArg","args":[{"name":"a","type":"uint64[3]","desc":""}],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"nonLiteralStaticArrayElements","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"mixedStaticArrayElements","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"nonLiteralStaticArrayAccess","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"setStaticArrayElement","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"staticArrayInStorageRef","args":[],"desc":"","returns":{"type":"uint64[3]","desc":""}},{"name":"updateStaticArrayInStorageRef","args":[],"desc":"","returns":{"type":"uint64[3]","desc":""}},{"name":"staticArrayInStorageMap","args":[],"desc":"","returns":{"type":"uint64[3]","desc":""}},{"name":"updateStaticArrayInStorageMap","args":[],"desc":"","returns":{"type":"uint64[3]","desc":""}},{"name":"nestedStaticArray","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"updateNestedStaticArrayElement","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"updateNestedStaticArray","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"threeDimensionalUint16Array","args":[],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"simpleTuple","args":[],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"arrayInTuple","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"tupleInArray","args":[],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"tupleInTuple","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"shortTypeNotation","args":[],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"disgusting","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"returnTuple","args":[],"desc":"","returns":{"type":"(uint64,uint16,uint64)","desc":""}},{"name":"tupleArg","args":[{"name":"a","type":"(uint64,uint16,uint64)","desc":""}],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"dynamicArray","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"returnDynamicArray","args":[],"desc":"","returns":{"type":"uint64[]","desc":""}},{"name":"dynamicArrayArg","args":[{"name":"a","type":"uint64[]","desc":""}],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"updateDynamicArrayElement","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"dynamicTupleArray","args":[],"desc":"","returns":{"type":"uint64","desc":""}},{"name":"returnTupleWithDyamicArray","args":[],"desc":"","returns":{"type":"(uint64,uint16,uint64[],uint16[])","desc":""}},{"name":"returnDynamicArrayFromTuple","args":[],"desc":"","returns":{"type":"uint8[]","desc":""}},{"name":"updateDynamicArrayInTuple","args":[],"desc":"","returns":{"type":"(uint8,uint16[],uint8[],uint16[],uint8[])","desc":""}},{"name":"nonLiteralDynamicElementInTuple","args":[],"desc":"","returns":{"type":"(uint8,uint16,uint8[],uint16[],uint8[])","desc":""}},{"name":"arrayPush","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"arrayPop","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"arrayPopValue","args":[],"desc":"","returns":{"type":"uint16","desc":""}},{"name":"arraySplice","args":[],"desc":"","returns":{"type":"uint64[]","desc":""}},{"name":"arraySpliceValue","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"dynamicArrayElements","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"spliceLastElement","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"spliceLastElementValue","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"spliceFirstElement","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"spliceFirstElementValue","args":[],"desc":"","returns":{"type":"uint16[]","desc":""}},{"name":"stringReturn","args":[],"desc":"","returns":{"type":"string","desc":""}},{"name":"stringArg","args":[{"name":"s","type":"string","desc":""}],"desc":"","returns":{"type":"void","desc":""}},{"name":"stringInTuple","args":[],"desc":"","returns":{"type":"(uint16,uint8[],string,uint8[])","desc":""}},{"name":"accesStringInTuple","args":[],"desc":"","returns":{"type":"string","desc":""}},{"name":"updateStringInTuple","args":[],"desc":"","returns":{"type":"(uint8,uint16[],string,uint16[],uint8[])","desc":""}},{"name":"updateTupleWithOnlyDynamicTypes","args":[],"desc":"","returns":{"type":"(uint16[],uint16[],uint16[])","desc":""}},{"name":"shortenDynamicElementInTuple","args":[],"desc":"","returns":{"type":"(uint16[],uint16[],uint16[])","desc":""}},{"name":"namedTuple","args":[],"desc":"","returns":{"type":"string","desc":""}},{"name":"updateNamedTuple","args":[],"desc":"","returns":{"type":"string","desc":""}},{"name":"customTypes","args":[],"desc":"","returns":{"type":"string","desc":""}},{"name":"staticStringArrayArg","args":[{"name":"a","type":"string[3]","desc":""}],"desc":"","returns":{"type":"string","desc":""}},{"name":"dynamicAccessOfDynamicElementInStaticArray","args":[{"name":"a","type":"string[3]","desc":""}],"desc":"","returns":{"type":"string","desc":""}},{"name":"dynamicArrayInMiddleOfTuple","args":[],"desc":"","returns":{"type":"(uint16,uint8[],uint16)","desc":""}},{"name":"accessDynamicArrayInMiddleOfTuple","args":[],"desc":"","returns":{"type":"uint8[]","desc":""}},{"name":"accessDynamicArrayElementInTuple","args":[],"desc":"","returns":{"type":"uint32","desc":""}},{"name":"updateDynamicArrayInMiddleOfTuple","args":[],"desc":"","returns":{"type":"(uint16,uint8[],uint16)","desc":""}}]}} \ No newline at end of file diff --git a/tests/contracts/AbiTest.src_map.json b/tests/contracts/AbiTest.src_map.json index 8882d9c3c..6898b4ff3 100644 --- a/tests/contracts/AbiTest.src_map.json +++ b/tests/contracts/AbiTest.src_map.json @@ -131,5638 +131,7694 @@ "129": 0, "130": 0, "131": 0, - "132": 0, - "133": 0, - "134": 0, - "135": 0, - "136": 0, - "137": 0, - "138": 0, - "139": 0, - "140": 0, - "141": 0, - "142": 0, - "143": 0, - "144": 0, - "145": 0, - "146": 0, - "147": 0, - "148": 0, - "149": 0, - "150": 0, - "151": 0, - "152": 0, - "153": 0, - "154": 0, - "155": 0, - "156": 0, - "157": 0, - "158": 0, - "159": 0, - "160": 0, - "161": 0, - "162": 0, - "163": 0, - "164": 0, - "165": 0, - "166": 0, - "167": 0, - "168": 0, - "169": 0, - "170": 0, - "171": 0, - "172": 0, - "173": 0, - "174": 0, - "175": 0, - "176": 0, - "177": 0, - "178": 0, - "179": 0, - "180": 0, - "181": 0, - "182": 0, - "183": 0, - "184": 0, - "185": 0, - "186": 0, - "187": 0, - "188": 0, - "189": 0, - "190": 0, - "191": 0, - "192": 0, - "193": 0, - "194": 0, - "195": 0, - "196": 0, - "197": 0, - "198": 0, - "199": 0, - "200": 0, - "201": 0, - "202": 0, - "203": 0, - "204": 0, - "205": 0, - "206": 0, - "207": 0, - "208": 0, - "209": 0, - "210": 0, - "211": 0, - "212": 0, - "213": 0, - "214": 0, - "215": 0, - "216": 0, - "217": 0, - "218": 0, - "219": 0, - "220": 0, - "221": 0, - "222": 0, - "223": 0, - "224": 0, - "225": 0, - "226": 0, - "227": 0, - "228": 0, - "229": 0, - "230": 0, - "231": 0, - "232": 0, - "233": 0, - "234": 0, - "235": 0, - "236": 0, - "237": 0, - "238": 0, - "239": 0, - "240": 0, - "241": 0, - "242": 0, - "243": 0, - "244": 0, - "245": 0, - "246": 0, - "247": 0, - "248": 0, - "249": 0, - "250": 0, - "251": 0, - "252": 0, - "253": 0, - "254": 0, - "255": 0, - "256": 0, - "257": 0, - "258": 0, - "259": 0, - "260": 0, - "261": 0, - "262": 0, - "263": 0, - "264": 0, - "265": 0, - "266": 0, - "267": 0, - "268": 0, - "269": 0, - "270": 0, - "271": 0, - "272": 0, - "273": 0, - "274": 0, - "275": 0, - "276": 0, - "277": 0, - "278": 0, - "279": 0, - "280": 0, - "281": 0, - "282": 0, - "283": 0, - "284": 0, - "285": 0, - "286": 0, - "287": 0, - "288": 0, - "289": 0, - "290": 0, - "291": 0, - "292": 0, - "293": 0, - "294": 0, - "295": 0, - "296": 0, - "297": 0, - "298": 0, - "299": 0, - "300": 0, - "301": 0, - "302": 0, - "303": 0, - "304": 0, - "305": 0, - "306": 0, - "307": 0, - "308": 0, - "309": 0, - "310": 0, - "311": 0, - "312": 0, - "313": 0, - "314": 0, - "315": 0, - "316": 0, - "317": 0, - "318": 0, - "319": 0, - "320": 0, - "321": 0, - "322": 0, - "323": 0, - "324": 0, - "325": 0, - "326": 0, - "327": 0, - "328": 0, - "329": 0, - "330": 0, - "331": 0, - "332": 0, - "333": 0, - "334": 0, - "335": 0, - "336": 0, - "337": 0, - "338": 0, - "339": 0, - "340": 0, - "341": 0, - "342": 0, - "343": 0, - "344": 0, - "345": 0, - "346": 0, - "347": 0, - "348": 0, - "349": 0, - "350": 0, - "351": 0, - "352": 0, - "353": 0, - "354": 0, - "355": 0, - "356": 0, - "357": 0, - "358": 0, - "359": 0, - "360": 0, - "361": 0, - "362": 0, - "363": 0, - "364": 0, - "365": 0, - "366": 0, - "367": 0, - "368": 0, - "369": 0, - "370": 1, - "371": 1, - "372": 1, - "373": 4, - "374": 4, - "375": 4, - "376": 5, - "377": 5, - "378": 6, - "379": 6, - "380": 7, - "381": 7, - "382": 8, - "383": 8, - "384": 9, - "385": 10, - "386": 10, - "387": 11, - "388": 11, - "389": 12, - "390": 12, - "391": 13, - "392": 14, - "393": 14, - "394": 15, - "395": 16, - "396": 17, - "397": 18, - "398": 18, - "399": 19, - "400": 22, - "401": 22, - "402": 22, - "403": 23, - "404": 23, - "405": 24, - "406": 24, - "407": 25, - "408": 25, - "409": 26, - "410": 27, - "411": 27, - "412": 28, - "413": 29, - "414": 29, - "415": 30, - "416": 30, - "417": 31, - "418": 31, - "419": 32, - "420": 32, - "421": 33, - "422": 34, - "423": 34, - "424": 35, - "425": 36, - "426": 37, - "427": 37, - "428": 38, - "429": 38, - "430": 39, - "431": 39, - "432": 40, - "433": 40, - "434": 40, - "435": 41, - "436": 41, - "437": 42, - "438": 42, - "439": 43, - "440": 43, - "441": 44, - "442": 45, - "443": 45, - "444": 46, - "445": 47, - "446": 48, - "447": 48, - "448": 51, - "449": 51, - "450": 52, - "451": 52, - "452": 52, - "453": 53, - "454": 53, - "455": 54, - "456": 54, - "457": 55, - "458": 55, - "459": 56, - "460": 57, - "461": 57, - "462": 60, - "463": 60, - "464": 61, - "465": 61, - "466": 62, - "467": 62, - "468": 63, - "469": 64, - "470": 64, - "471": 65, - "472": 65, - "473": 66, - "474": 67, - "475": 67, - "476": 68, - "477": 69, - "478": 69, - "479": 69, - "480": 70, - "481": 73, - "482": 74, - "483": 75, - "484": 75, - "485": 75, - "486": 76, - "487": 77, - "488": 78, - "489": 79, - "490": 80, - "491": 81, - "492": 82, - "493": 83, - "494": 84, - "495": 85, - "496": 86, - "497": 87, - "498": 87, - "499": 88, - "500": 89, - "501": 89, - "502": 90, - "503": 91, - "504": 91, - "505": 91, - "506": 92, - "507": 93, - "508": 93, - "509": 93, - "510": 96, - "511": 99, - "512": 99, - "513": 100, - "514": 101, - "515": 101, - "516": 102, - "517": 102, - "518": 103, - "519": 103, - "520": 104, - "521": 104, - "522": 105, - "523": 105, - "524": 106, - "525": 106, - "526": 107, - "527": 108, - "528": 109, - "529": 110, - "530": 111, - "531": 114, - "532": 114, - "533": 115, - "534": 116, - "535": 117, - "536": 117, - "537": 118, - "538": 119, - "539": 120, - "540": 121, - "541": 122, - "542": 122, - "543": 122, - "544": 123, - "545": 124, - "546": 127, - "547": 127, - "548": 127, - "549": 128, - "550": 131, - "551": 131, - "552": 132, - "553": 133, - "554": 134, - "555": 134, - "556": 135, - "557": 136, - "558": 137, - "559": 138, - "560": 139, - "561": 139, - "562": 139, - "563": 140, - "564": 141, - "565": 144, - "566": 144, - "567": 144, - "568": 145, - "569": 148, - "570": 148, - "571": 149, - "572": 150, - "573": 151, - "574": 151, - "575": 152, - "576": 153, - "577": 154, - "578": 155, - "579": 156, - "580": 157, - "581": 157, - "582": 157, - "583": 158, - "584": 159, - "585": 162, - "586": 162, - "587": 162, - "588": 166, - "589": 166, - "590": 167, - "591": 167, - "592": 171, - "593": 171, - "594": 172, - "595": 173, - "596": 174, - "597": 175, - "598": 176, - "599": 177, - "600": 178, - "601": 179, - "602": 180, - "603": 181, - "604": 184, - "605": 184, - "606": 185, - "607": 186, - "608": 187, - "609": 187, - "610": 188, - "611": 189, - "612": 190, - "613": 191, - "614": 192, - "615": 193, - "616": 193, - "617": 193, - "618": 194, - "619": 195, - "620": 198, - "621": 198, - "622": 198, - "623": 202, - "624": 202, - "625": 203, - "626": 203, - "627": 207, - "628": 207, - "629": 208, - "630": 209, - "631": 210, - "632": 211, - "633": 212, - "634": 215, - "635": 215, - "636": 216, - "637": 217, - "638": 218, - "639": 218, - "640": 219, - "641": 220, - "642": 221, - "643": 222, - "644": 223, - "645": 223, - "646": 223, - "647": 224, - "648": 224, - "649": 224, - "650": 225, - "651": 226, - "652": 229, - "653": 229, - "654": 229, - "655": 233, - "656": 233, - "657": 234, - "658": 235, - "659": 236, - "660": 237, - "661": 238, - "662": 239, - "663": 240, - "664": 241, - "665": 242, - "666": 243, - "667": 246, - "668": 246, - "669": 247, - "670": 248, - "671": 249, - "672": 249, - "673": 250, - "674": 251, - "675": 252, - "676": 253, - "677": 254, - "678": 255, - "679": 255, - "680": 256, - "681": 256, - "682": 256, - "683": 257, - "684": 258, - "685": 261, - "686": 261, - "687": 261, - "688": 265, - "689": 265, - "690": 266, - "691": 266, - "692": 270, - "693": 270, - "694": 271, - "695": 271, - "696": 275, - "697": 275, - "698": 276, - "699": 276, - "700": 280, - "701": 280, - "702": 281, - "703": 282, - "704": 282, - "705": 283, - "706": 284, - "707": 285, - "708": 285, - "709": 286, - "710": 287, - "711": 288, - "712": 288, - "713": 292, - "714": 292, - "715": 293, - "716": 294, - "717": 295, - "718": 296, - "719": 297, - "720": 298, - "721": 299, - "722": 300, - "723": 301, - "724": 302, - "725": 305, - "726": 305, - "727": 306, - "728": 307, - "729": 308, - "730": 308, - "731": 309, - "732": 310, - "733": 311, - "734": 312, - "735": 313, - "736": 314, - "737": 314, - "738": 315, - "739": 315, - "740": 315, - "741": 316, - "742": 317, - "743": 320, - "744": 320, - "745": 320, - "746": 324, - "747": 324, - "748": 325, - "749": 325, - "750": 329, - "751": 329, - "752": 330, - "753": 330, - "754": 334, - "755": 334, - "756": 335, - "757": 335, - "758": 339, - "759": 339, - "760": 339, - "761": 339, - "762": 339, - "763": 339, - "764": 339, - "765": 339, - "766": 339, - "767": 339, - "768": 339, - "769": 339, - "770": 339, - "771": 339, - "772": 339, - "773": 339, - "774": 339, - "775": 339, - "776": 339, - "777": 339, - "778": 339, - "779": 339, - "780": 339, - "781": 339, - "782": 339, - "783": 339, - "784": 340, - "785": 340, - "786": 341, - "787": 342, - "788": 343, - "789": 343, - "790": 344, - "791": 345, - "792": 346, - "793": 346, - "794": 347, - "795": 348, - "796": 349, - "797": 349, - "798": 349, - "799": 349, - "800": 349, - "801": 349, - "802": 349, - "803": 349, - "804": 349, - "805": 349, - "806": 349, - "807": 349, - "808": 349, - "809": 349, - "810": 349, - "811": 349, - "812": 349, - "813": 349, - "814": 349, - "815": 349, - "816": 349, - "817": 349, - "818": 349, - "819": 349, - "820": 349, - "821": 349, - "822": 350, - "823": 351, - "824": 351, - "825": 355, - "826": 355, - "827": 356, - "828": 357, - "829": 358, - "830": 359, - "831": 360, - "832": 360, - "833": 361, - "834": 361, - "835": 362, - "836": 363, - "837": 364, - "838": 365, - "839": 366, - "840": 366, - "841": 367, - "842": 367, - "843": 368, - "844": 369, - "845": 370, - "846": 371, - "847": 372, - "848": 373, - "849": 374, - "850": 375, - "851": 376, - "852": 377, - "853": 380, - "854": 380, - "855": 381, - "856": 382, - "857": 383, - "858": 383, - "859": 384, - "860": 385, - "861": 386, - "862": 387, - "863": 388, - "864": 389, - "865": 390, - "866": 390, - "867": 390, - "868": 391, - "869": 392, - "870": 395, - "871": 395, - "872": 395, - "873": 399, - "874": 399, - "875": 400, - "876": 400, - "877": 404, - "878": 405, - "879": 405, - "880": 409, - "881": 409, - "882": 410, - "883": 410, - "884": 411, - "885": 412, - "886": 413, - "887": 414, - "888": 415, - "889": 416, - "890": 417, - "891": 418, - "892": 419, - "893": 420, - "894": 421, - "895": 424, - "896": 424, - "897": 425, - "898": 426, - "899": 427, - "900": 427, - "901": 428, - "902": 429, - "903": 430, - "904": 431, - "905": 432, - "906": 433, - "907": 433, - "908": 433, - "909": 434, - "910": 435, - "911": 438, - "912": 438, - "913": 438, - "914": 442, - "915": 442, - "916": 443, - "917": 443, - "918": 447, - "919": 447, - "920": 448, - "921": 449, - "922": 449, - "923": 450, - "924": 451, - "925": 452, - "926": 452, - "927": 456, - "928": 456, - "929": 457, - "930": 458, - "931": 459, - "932": 460, - "933": 461, - "934": 462, - "935": 463, - "936": 464, - "937": 465, - "938": 466, - "939": 469, - "940": 469, - "941": 470, - "942": 471, - "943": 472, - "944": 472, - "945": 473, - "946": 474, - "947": 475, - "948": 476, - "949": 477, - "950": 478, - "951": 479, - "952": 479, - "953": 479, - "954": 480, - "955": 481, - "956": 484, - "957": 484, - "958": 484, - "959": 488, - "960": 488, - "961": 489, - "962": 489, - "963": 493, - "964": 493, - "965": 494, - "966": 494, - "967": 495, - "968": 499, - "969": 499, - "970": 500, - "971": 500, - "972": 501, - "973": 501, - "974": 502, - "975": 506, - "976": 506, - "977": 507, - "978": 507, - "979": 508, - "980": 512, - "981": 512, - "982": 513, - "983": 514, - "984": 515, - "985": 516, - "986": 517, - "987": 518, - "988": 519, - "989": 519, - "990": 520, - "991": 520, - "992": 521, - "993": 522, - "994": 523, - "995": 524, - "996": 525, - "997": 526, - "998": 527, - "999": 528, - "1000": 528, - "1001": 529, - "1002": 530, - "1003": 531, - "1004": 532, - "1005": 533, - "1006": 534, - "1007": 535, - "1008": 536, - "1009": 537, - "1010": 537, - "1011": 541, - "1012": 541, - "1013": 542, - "1014": 543, - "1015": 544, - "1016": 545, - "1017": 546, - "1018": 549, - "1019": 549, - "1020": 550, - "1021": 551, - "1022": 552, - "1023": 552, - "1024": 553, - "1025": 554, - "1026": 555, - "1027": 556, - "1028": 557, - "1029": 558, - "1030": 559, - "1031": 559, - "1032": 559, - "1033": 560, - "1034": 561, - "1035": 564, - "1036": 564, - "1037": 564, - "1038": 568, - "1039": 568, - "1040": 569, - "1041": 569, - "1042": 573, - "1043": 573, - "1044": 574, - "1045": 574, - "1046": 575, - "1047": 579, - "1048": 579, - "1049": 580, - "1050": 580, - "1051": 581, - "1052": 581, - "1053": 582, - "1054": 586, - "1055": 586, - "1056": 587, - "1057": 587, - "1058": 588, - "1059": 592, - "1060": 592, - "1061": 593, - "1062": 594, - "1063": 595, - "1064": 595, - "1065": 596, - "1066": 597, - "1067": 598, - "1068": 598, - "1069": 599, - "1070": 600, - "1071": 604, - "1072": 604, - "1073": 605, - "1074": 605, - "1075": 606, - "1076": 607, - "1077": 608, - "1078": 608, - "1079": 609, - "1080": 610, - "1081": 611, - "1082": 611, - "1083": 612, - "1084": 612, - "1085": 613, - "1086": 613, - "1087": 614, - "1088": 618, - "1089": 618, - "1090": 619, - "1091": 620, - "1092": 621, - "1093": 622, - "1094": 622, - "1095": 622, - "1096": 623, - "1097": 624, - "1098": 625, - "1099": 625, - "1100": 626, - "1101": 627, - "1102": 631, - "1103": 631, - "1104": 632, - "1105": 633, - "1106": 634, - "1107": 635, - "1108": 636, - "1109": 637, - "1110": 638, - "1111": 638, - "1112": 639, - "1113": 639, - "1114": 640, - "1115": 641, - "1116": 642, - "1117": 643, - "1118": 644, - "1119": 645, - "1120": 646, - "1121": 647, - "1122": 647, - "1123": 648, - "1124": 649, - "1125": 650, - "1126": 651, - "1127": 652, - "1128": 653, - "1129": 654, - "1130": 655, - "1131": 656, - "1132": 656, - "1133": 660, - "1134": 660, - "1135": 661, - "1136": 662, - "1137": 663, - "1138": 664, - "1139": 665, - "1140": 668, - "1141": 668, - "1142": 669, - "1143": 670, - "1144": 671, - "1145": 671, - "1146": 672, - "1147": 673, - "1148": 674, - "1149": 675, - "1150": 676, - "1151": 677, - "1152": 678, - "1153": 678, - "1154": 678, - "1155": 679, - "1156": 680, - "1157": 683, - "1158": 683, - "1159": 683, - "1160": 687, - "1161": 687, - "1162": 688, - "1163": 688, - "1164": 692, - "1165": 692, - "1166": 693, - "1167": 693, - "1168": 694, - "1169": 698, - "1170": 698, - "1171": 699, - "1172": 699, - "1173": 700, - "1174": 700, - "1175": 701, - "1176": 705, - "1177": 705, - "1178": 706, - "1179": 706, - "1180": 707, - "1181": 711, - "1182": 711, - "1183": 712, - "1184": 713, - "1185": 714, - "1186": 715, - "1187": 716, - "1188": 717, - "1189": 718, - "1190": 718, - "1191": 719, - "1192": 719, - "1193": 720, - "1194": 721, - "1195": 722, - "1196": 723, - "1197": 724, - "1198": 725, - "1199": 726, - "1200": 727, - "1201": 727, - "1202": 728, - "1203": 729, - "1204": 730, - "1205": 731, - "1206": 732, - "1207": 733, - "1208": 734, - "1209": 735, - "1210": 736, - "1211": 736, - "1212": 740, - "1213": 740, - "1214": 741, - "1215": 742, - "1216": 743, - "1217": 744, - "1218": 745, - "1219": 748, - "1220": 748, - "1221": 749, - "1222": 750, - "1223": 751, - "1224": 751, - "1225": 752, - "1226": 753, - "1227": 754, - "1228": 755, - "1229": 756, - "1230": 757, - "1231": 758, - "1232": 758, - "1233": 758, - "1234": 759, - "1235": 760, - "1236": 763, - "1237": 763, - "1238": 763, - "1239": 767, - "1240": 767, - "1241": 768, - "1242": 768, - "1243": 772, - "1244": 772, - "1245": 773, - "1246": 773, - "1247": 774, - "1248": 778, - "1249": 778, - "1250": 779, - "1251": 779, - "1252": 780, - "1253": 780, - "1254": 781, - "1255": 785, - "1256": 785, - "1257": 786, - "1258": 786, - "1259": 787, - "1260": 791, - "1261": 791, - "1262": 792, - "1263": 793, - "1264": 794, - "1265": 794, - "1266": 794, - "1267": 795, - "1268": 796, - "1269": 797, - "1270": 797, - "1271": 798, - "1272": 799, - "1273": 803, - "1274": 803, - "1275": 804, - "1276": 804, - "1277": 805, - "1278": 806, - "1279": 807, - "1280": 807, - "1281": 807, - "1282": 808, - "1283": 809, - "1284": 810, - "1285": 810, - "1286": 811, - "1287": 811, - "1288": 812, - "1289": 812, - "1290": 813, - "1291": 817, - "1292": 817, - "1293": 818, - "1294": 819, - "1295": 820, - "1296": 821, - "1297": 821, - "1298": 821, - "1299": 822, - "1300": 823, - "1301": 824, - "1302": 824, - "1303": 825, - "1304": 826, - "1305": 830, - "1306": 830, - "1307": 831, - "1308": 832, - "1309": 833, - "1310": 834, - "1311": 835, - "1312": 836, - "1313": 837, - "1314": 837, - "1315": 838, - "1316": 838, - "1317": 839, - "1318": 840, - "1319": 841, - "1320": 842, - "1321": 843, - "1322": 844, - "1323": 845, - "1324": 846, - "1325": 846, - "1326": 847, - "1327": 848, - "1328": 849, - "1329": 850, - "1330": 851, - "1331": 852, - "1332": 853, - "1333": 854, - "1334": 855, - "1335": 855, - "1336": 859, - "1337": 859, - "1338": 860, - "1339": 861, - "1340": 862, - "1341": 863, - "1342": 864, - "1343": 867, - "1344": 867, - "1345": 868, - "1346": 869, - "1347": 870, - "1348": 870, - "1349": 871, - "1350": 872, - "1351": 873, - "1352": 874, - "1353": 875, - "1354": 876, - "1355": 876, - "1356": 876, - "1357": 877, - "1358": 878, - "1359": 881, - "1360": 881, - "1361": 881, - "1362": 885, - "1363": 885, - "1364": 886, - "1365": 886, - "1366": 890, - "1367": 890, - "1368": 891, - "1369": 891, - "1370": 892, - "1371": 893, - "1372": 894, - "1373": 895, - "1374": 896, - "1375": 897, - "1376": 898, - "1377": 899, - "1378": 900, - "1379": 903, - "1380": 903, - "1381": 904, - "1382": 905, - "1383": 906, - "1384": 906, - "1385": 907, - "1386": 908, - "1387": 909, - "1388": 910, - "1389": 911, - "1390": 912, - "1391": 912, - "1392": 912, - "1393": 913, - "1394": 914, - "1395": 917, - "1396": 917, - "1397": 917, - "1398": 921, - "1399": 921, - "1400": 922, - "1401": 922, - "1402": 926, - "1403": 926, - "1404": 927, - "1405": 927, - "1406": 928, - "1407": 928, - "1408": 928, - "1409": 929, - "1410": 930, - "1411": 931, - "1412": 931, - "1413": 935, - "1414": 935, - "1415": 936, - "1416": 936, - "1417": 937, - "1418": 938, - "1419": 939, - "1420": 940, - "1421": 941, - "1422": 942, - "1423": 943, - "1424": 944, - "1425": 945, - "1426": 948, - "1427": 948, - "1428": 949, - "1429": 950, - "1430": 951, - "1431": 951, - "1432": 952, - "1433": 953, - "1434": 954, - "1435": 955, - "1436": 956, - "1437": 957, - "1438": 957, - "1439": 957, - "1440": 958, - "1441": 959, - "1442": 962, - "1443": 962, - "1444": 962, - "1445": 966, - "1446": 966, - "1447": 967, - "1448": 967, - "1449": 971, - "1450": 971, - "1451": 972, - "1452": 972, - "1453": 973, - "1454": 973, - "1455": 973, - "1456": 973, - "1457": 973, - "1458": 973, - "1459": 973, - "1460": 973, - "1461": 973, - "1462": 973, - "1463": 973, - "1464": 973, - "1465": 973, - "1466": 973, - "1467": 973, - "1468": 973, - "1469": 973, - "1470": 973, - "1471": 973, - "1472": 973, - "1473": 973, - "1474": 973, - "1475": 973, - "1476": 973, - "1477": 973, - "1478": 973, - "1479": 974, - "1480": 975, - "1481": 975, - "1482": 979, - "1483": 979, - "1484": 980, - "1485": 980, - "1486": 981, - "1487": 982, - "1488": 983, - "1489": 984, - "1490": 985, - "1491": 986, - "1492": 987, - "1493": 988, - "1494": 989, - "1495": 992, - "1496": 992, - "1497": 993, - "1498": 994, - "1499": 995, - "1500": 995, - "1501": 996, - "1502": 997, - "1503": 998, - "1504": 999, - "1505": 1000, - "1506": 1001, - "1507": 1001, - "1508": 1001, - "1509": 1002, - "1510": 1003, - "1511": 1006, - "1512": 1006, - "1513": 1006, - "1514": 1010, - "1515": 1010, - "1516": 1010, - "1517": 1010, - "1518": 1010, - "1519": 1010, - "1520": 1010, - "1521": 1010, - "1522": 1010, - "1523": 1010, - "1524": 1010, - "1525": 1010, - "1526": 1010, - "1527": 1010, - "1528": 1010, - "1529": 1010, - "1530": 1010, - "1531": 1010, - "1532": 1011, - "1533": 1011, - "1534": 1015, - "1535": 1015, - "1536": 1016, - "1537": 1016, - "1538": 1017, - "1539": 1017, - "1540": 1017, - "1541": 1017, - "1542": 1017, - "1543": 1017, - "1544": 1018, - "1545": 1019, - "1546": 1019, - "1547": 1023, - "1548": 1023, - "1549": 1024, - "1550": 1024, - "1551": 1025, - "1552": 1026, - "1553": 1027, - "1554": 1027, - "1555": 1028, - "1556": 1029, - "1557": 1030, - "1558": 1031, - "1559": 1032, - "1560": 1033, - "1561": 1036, - "1562": 1036, - "1563": 1037, - "1564": 1038, - "1565": 1039, - "1566": 1039, - "1567": 1040, - "1568": 1041, - "1569": 1042, - "1570": 1043, - "1571": 1044, - "1572": 1045, - "1573": 1045, - "1574": 1045, - "1575": 1046, - "1576": 1047, - "1577": 1050, - "1578": 1050, - "1579": 1050, - "1580": 1054, - "1581": 1054, - "1582": 1055, - "1583": 1055, - "1584": 1059, - "1585": 1059, - "1586": 1060, - "1587": 1060, - "1588": 1061, - "1589": 1062, - "1590": 1063, - "1591": 1063, - "1592": 1064, - "1593": 1065, - "1594": 1066, - "1595": 1067, - "1596": 1068, - "1597": 1069, - "1598": 1072, - "1599": 1072, - "1600": 1073, - "1601": 1074, - "1602": 1075, - "1603": 1075, - "1604": 1076, - "1605": 1077, - "1606": 1078, - "1607": 1079, - "1608": 1080, - "1609": 1081, - "1610": 1081, - "1611": 1081, - "1612": 1082, - "1613": 1083, - "1614": 1086, - "1615": 1086, - "1616": 1086, - "1617": 1090, - "1618": 1090, - "1619": 1090, - "1620": 1090, - "1621": 1090, - "1622": 1090, - "1623": 1090, - "1624": 1090, - "1625": 1090, - "1626": 1090, - "1627": 1090, - "1628": 1090, - "1629": 1090, - "1630": 1090, - "1631": 1090, - "1632": 1090, - "1633": 1090, - "1634": 1090, - "1635": 1090, - "1636": 1090, - "1637": 1090, - "1638": 1090, - "1639": 1090, - "1640": 1090, - "1641": 1090, - "1642": 1090, - "1643": 1090, - "1644": 1090, - "1645": 1090, - "1646": 1090, - "1647": 1091, - "1648": 1091, - "1649": 1095, - "1650": 1095, - "1651": 1096, - "1652": 1096, - "1653": 1097, - "1654": 1098, - "1655": 1099, - "1656": 1100, - "1657": 1101, - "1658": 1102, - "1659": 1103, - "1660": 1104, - "1661": 1105, - "1662": 1108, - "1663": 1108, - "1664": 1109, - "1665": 1110, - "1666": 1111, - "1667": 1111, - "1668": 1112, - "1669": 1113, - "1670": 1114, - "1671": 1115, - "1672": 1116, - "1673": 1117, - "1674": 1117, - "1675": 1117, - "1676": 1118, - "1677": 1119, - "1678": 1122, - "1679": 1122, - "1680": 1122, - "1681": 1126, - "1682": 1126, - "1683": 1127, - "1684": 1127, - "1685": 1131, - "1686": 1131, - "1687": 1132, - "1688": 1132, - "1689": 1133, - "1690": 1134, - "1691": 1135, - "1692": 1135, - "1693": 1136, - "1694": 1137, - "1695": 1138, - "1696": 1139, - "1697": 1140, - "1698": 1141, - "1699": 1144, - "1700": 1144, - "1701": 1145, - "1702": 1146, - "1703": 1147, - "1704": 1147, - "1705": 1148, - "1706": 1149, - "1707": 1150, - "1708": 1151, - "1709": 1152, - "1710": 1153, - "1711": 1153, - "1712": 1153, - "1713": 1154, - "1714": 1155, - "1715": 1158, - "1716": 1158, - "1717": 1158, - "1718": 1162, - "1719": 1162, - "1720": 1162, - "1721": 1162, - "1722": 1162, - "1723": 1162, - "1724": 1162, - "1725": 1162, - "1726": 1162, - "1727": 1162, - "1728": 1162, - "1729": 1162, - "1730": 1162, - "1731": 1162, - "1732": 1162, - "1733": 1162, - "1734": 1162, - "1735": 1162, - "1736": 1162, - "1737": 1162, - "1738": 1162, - "1739": 1162, - "1740": 1162, - "1741": 1162, - "1742": 1162, - "1743": 1162, - "1744": 1163, - "1745": 1163, - "1746": 1167, - "1747": 1167, - "1748": 1168, - "1749": 1168, - "1750": 1169, - "1751": 1170, - "1752": 1171, - "1753": 1172, - "1754": 1173, - "1755": 1174, - "1756": 1175, - "1757": 1176, - "1758": 1177, - "1759": 1180, - "1760": 1180, - "1761": 1181, - "1762": 1182, - "1763": 1183, - "1764": 1183, - "1765": 1184, - "1766": 1185, - "1767": 1186, - "1768": 1187, - "1769": 1188, - "1770": 1189, - "1771": 1189, - "1772": 1189, - "1773": 1190, - "1774": 1191, - "1775": 1194, - "1776": 1194, - "1777": 1194, - "1778": 1198, - "1779": 1198, - "1780": 1198, - "1781": 1198, - "1782": 1198, - "1783": 1198, - "1784": 1198, - "1785": 1198, - "1786": 1198, - "1787": 1198, - "1788": 1198, - "1789": 1198, - "1790": 1198, - "1791": 1198, - "1792": 1198, - "1793": 1198, - "1794": 1198, - "1795": 1198, - "1796": 1198, - "1797": 1198, - "1798": 1198, - "1799": 1198, - "1800": 1198, - "1801": 1198, - "1802": 1198, - "1803": 1198, - "1804": 1199, - "1805": 1199, - "1806": 1203, - "1807": 1203, - "1808": 1204, - "1809": 1204, - "1810": 1205, - "1811": 1206, - "1812": 1207, - "1813": 1207, - "1814": 1208, - "1815": 1209, - "1816": 1210, - "1817": 1211, - "1818": 1212, - "1819": 1213, - "1820": 1216, - "1821": 1216, - "1822": 1217, - "1823": 1218, - "1824": 1219, - "1825": 1219, - "1826": 1220, - "1827": 1221, - "1828": 1222, - "1829": 1223, - "1830": 1224, - "1831": 1225, - "1832": 1225, - "1833": 1225, - "1834": 1226, - "1835": 1227, - "1836": 1230, - "1837": 1230, - "1838": 1230, - "1839": 1234, - "1840": 1234, - "1841": 1234, - "1842": 1234, - "1843": 1234, - "1844": 1234, - "1845": 1234, - "1846": 1234, - "1847": 1234, - "1848": 1234, - "1849": 1234, - "1850": 1234, - "1851": 1234, - "1852": 1234, - "1853": 1234, - "1854": 1234, - "1855": 1234, - "1856": 1234, - "1857": 1234, - "1858": 1234, - "1859": 1234, - "1860": 1234, - "1861": 1234, - "1862": 1234, - "1863": 1234, - "1864": 1234, - "1865": 1234, - "1866": 1234, - "1867": 1234, - "1868": 1234, - "1869": 1234, - "1870": 1234, - "1871": 1234, - "1872": 1234, - "1873": 1234, - "1874": 1234, - "1875": 1234, - "1876": 1234, - "1877": 1234, - "1878": 1234, - "1879": 1234, - "1880": 1234, - "1881": 1234, - "1882": 1234, - "1883": 1234, - "1884": 1234, - "1885": 1234, - "1886": 1234, - "1887": 1234, - "1888": 1234, - "1889": 1234, - "1890": 1234, - "1891": 1234, - "1892": 1234, - "1893": 1234, - "1894": 1234, - "1895": 1234, - "1896": 1234, - "1897": 1234, - "1898": 1234, - "1899": 1234, - "1900": 1234, - "1901": 1234, - "1902": 1234, - "1903": 1234, - "1904": 1234, - "1905": 1234, - "1906": 1234, - "1907": 1234, - "1908": 1234, - "1909": 1234, - "1910": 1234, - "1911": 1234, - "1912": 1234, - "1913": 1234, - "1914": 1234, - "1915": 1234, - "1916": 1234, - "1917": 1234, - "1918": 1234, - "1919": 1234, - "1920": 1234, - "1921": 1234, - "1922": 1234, - "1923": 1234, - "1924": 1234, - "1925": 1234, - "1926": 1234, - "1927": 1234, - "1928": 1234, - "1929": 1234, - "1930": 1234, - "1931": 1234, - "1932": 1234, - "1933": 1234, - "1934": 1234, - "1935": 1234, - "1936": 1234, - "1937": 1234, - "1938": 1234, - "1939": 1234, - "1940": 1234, - "1941": 1234, - "1942": 1234, - "1943": 1234, - "1944": 1234, - "1945": 1234, - "1946": 1234, - "1947": 1234, - "1948": 1234, - "1949": 1235, - "1950": 1235, - "1951": 1239, - "1952": 1239, - "1953": 1240, - "1954": 1240, - "1955": 1241, - "1956": 1241, - "1957": 1241, - "1958": 1241, - "1959": 1241, - "1960": 1241, - "1961": 1241, - "1962": 1241, - "1963": 1241, - "1964": 1241, - "1965": 1241, - "1966": 1241, - "1967": 1241, - "1968": 1241, - "1969": 1241, - "1970": 1241, - "1971": 1241, - "1972": 1241, - "1973": 1242, - "1974": 1243, - "1975": 1243, - "1976": 1247, - "1977": 1247, - "1978": 1248, - "1979": 1248, - "1980": 1249, - "1981": 1250, - "1982": 1251, - "1983": 1252, - "1984": 1253, - "1985": 1254, - "1986": 1255, - "1987": 1256, - "1988": 1257, - "1989": 1260, - "1990": 1260, - "1991": 1261, - "1992": 1262, - "1993": 1263, - "1994": 1263, - "1995": 1264, - "1996": 1265, - "1997": 1266, - "1998": 1267, - "1999": 1268, - "2000": 1269, - "2001": 1269, - "2002": 1269, - "2003": 1270, - "2004": 1271, - "2005": 1274, - "2006": 1274, - "2007": 1274, - "2008": 1278, - "2009": 1278, - "2010": 1278, - "2011": 1278, - "2012": 1278, - "2013": 1278, - "2014": 1278, - "2015": 1278, - "2016": 1278, - "2017": 1278, - "2018": 1278, - "2019": 1278, - "2020": 1278, - "2021": 1278, - "2022": 1278, - "2023": 1278, - "2024": 1278, - "2025": 1278, - "2026": 1278, - "2027": 1278, - "2028": 1279, - "2029": 1279, - "2030": 1283, - "2031": 1283, - "2032": 1284, - "2033": 1285, - "2034": 1286, - "2035": 1287, - "2036": 1288, - "2037": 1291, - "2038": 1291, - "2039": 1292, - "2040": 1293, - "2041": 1294, - "2042": 1294, - "2043": 1295, - "2044": 1296, - "2045": 1297, - "2046": 1298, - "2047": 1299, - "2048": 1299, - "2049": 1299, - "2050": 1300, - "2051": 1300, - "2052": 1300, - "2053": 1301, - "2054": 1302, - "2055": 1305, - "2056": 1305, - "2057": 1305, - "2058": 1309, - "2059": 1309, - "2060": 1310, - "2061": 1311, - "2062": 1312, - "2063": 1313, - "2064": 1313, - "2065": 1314, - "2066": 1315, - "2067": 1316, - "2068": 1317, - "2069": 1318, - "2070": 1319, - "2071": 1322, - "2072": 1322, - "2073": 1323, - "2074": 1324, - "2075": 1325, - "2076": 1325, - "2077": 1326, - "2078": 1327, - "2079": 1328, - "2080": 1329, - "2081": 1330, - "2082": 1331, - "2083": 1331, - "2084": 1331, - "2085": 1332, - "2086": 1333, - "2087": 1336, - "2088": 1336, - "2089": 1336, - "2090": 1340, - "2091": 1340, - "2092": 1341, - "2093": 1341, - "2094": 1345, - "2095": 1345, - "2096": 1346, - "2097": 1347, - "2098": 1348, - "2099": 1349, - "2100": 1350, - "2101": 1351, - "2102": 1352, - "2103": 1353, - "2104": 1354, - "2105": 1355, - "2106": 1356, - "2107": 1357, - "2108": 1358, - "2109": 1359, - "2110": 1362, - "2111": 1362, - "2112": 1363, - "2113": 1364, - "2114": 1365, - "2115": 1365, - "2116": 1366, - "2117": 1367, - "2118": 1368, - "2119": 1369, - "2120": 1370, - "2121": 1371, - "2122": 1371, - "2123": 1371, - "2124": 1372, - "2125": 1373, - "2126": 1376, - "2127": 1376, - "2128": 1376, - "2129": 1380, - "2130": 1380, - "2131": 1381, - "2132": 1381, - "2133": 1385, - "2134": 1385, - "2135": 1386, - "2136": 1387, - "2137": 1388, - "2138": 1389, - "2139": 1390, - "2140": 1393, - "2141": 1393, - "2142": 1394, - "2143": 1395, - "2144": 1396, - "2145": 1396, - "2146": 1397, - "2147": 1398, - "2148": 1399, - "2149": 1400, - "2150": 1401, - "2151": 1401, - "2152": 1401, - "2153": 1402, - "2154": 1402, - "2155": 1402, - "2156": 1403, - "2157": 1404, - "2158": 1407, - "2159": 1407, - "2160": 1407, - "2161": 1411, - "2162": 1411, - "2163": 1412, - "2164": 1413, - "2165": 1414, - "2166": 1415, - "2167": 1416, - "2168": 1417, - "2169": 1418, - "2170": 1419, - "2171": 1420, - "2172": 1421, - "2173": 1422, - "2174": 1423, - "2175": 1424, - "2176": 1425, - "2177": 1428, - "2178": 1428, - "2179": 1429, - "2180": 1430, - "2181": 1431, - "2182": 1431, - "2183": 1432, - "2184": 1433, - "2185": 1434, - "2186": 1435, - "2187": 1436, - "2188": 1437, - "2189": 1437, - "2190": 1437, - "2191": 1438, - "2192": 1439, - "2193": 1442, - "2194": 1442, - "2195": 1442, - "2196": 1446, - "2197": 1446, - "2198": 1447, - "2199": 1447, - "2200": 1451, - "2201": 1451, - "2202": 1452, - "2203": 1453, - "2204": 1454, - "2205": 1455, - "2206": 1456, - "2207": 1457, - "2208": 1457, - "2209": 1458, - "2210": 1459, - "2211": 1460, - "2212": 1460, - "2213": 1464, - "2214": 1464, - "2215": 1465, - "2216": 1466, - "2217": 1467, - "2218": 1468, - "2219": 1469, - "2220": 1470, - "2221": 1471, - "2222": 1472, - "2223": 1473, - "2224": 1474, - "2225": 1475, - "2226": 1476, - "2227": 1477, - "2228": 1478, - "2229": 1481, - "2230": 1481, - "2231": 1482, - "2232": 1483, - "2233": 1484, - "2234": 1484, - "2235": 1485, - "2236": 1486, - "2237": 1487, - "2238": 1488, - "2239": 1489, - "2240": 1490, - "2241": 1490, - "2242": 1490, - "2243": 1491, - "2244": 1492, - "2245": 1495, - "2246": 1495, - "2247": 1495, - "2248": 1499, - "2249": 1499, - "2250": 1499, - "2251": 1499, - "2252": 1499, - "2253": 1499, - "2254": 1499, - "2255": 1499, - "2256": 1499, - "2257": 1499, - "2258": 1499, - "2259": 1499, - "2260": 1499, - "2261": 1499, - "2262": 1499, - "2263": 1499, - "2264": 1499, - "2265": 1499, - "2266": 1499, - "2267": 1499, - "2268": 1499, - "2269": 1499, - "2270": 1499, - "2271": 1499, - "2272": 1500, - "2273": 1500, - "2274": 1504, - "2275": 1504, - "2276": 1505, - "2277": 1506, - "2278": 1506, - "2279": 1507, - "2280": 1508, - "2281": 1509, - "2282": 1510, - "2283": 1511, - "2284": 1512, - "2285": 1513, - "2286": 1514, - "2287": 1515, - "2288": 1516, - "2289": 1517, - "2290": 1518, - "2291": 1519, - "2292": 1520, - "2293": 1523, - "2294": 1523, - "2295": 1524, - "2296": 1525, - "2297": 1526, - "2298": 1526, - "2299": 1527, - "2300": 1528, - "2301": 1529, - "2302": 1530, - "2303": 1531, - "2304": 1532, - "2305": 1532, - "2306": 1532, - "2307": 1533, - "2308": 1534, - "2309": 1537, - "2310": 1537, - "2311": 1537, - "2312": 1541, - "2313": 1541, - "2314": 1541, - "2315": 1541, - "2316": 1541, - "2317": 1541, - "2318": 1541, - "2319": 1541, - "2320": 1541, - "2321": 1541, - "2322": 1541, - "2323": 1541, - "2324": 1542, - "2325": 1542, - "2326": 1543, - "2327": 1543, - "2328": 1543, - "2329": 1543, - "2330": 1544, - "2331": 1544, - "2332": 1545, - "2333": 1545, - "2334": 1546, - "2335": 1546, - "2336": 1547, - "2337": 1548, - "2338": 1548, - "2339": 1549, - "2340": 1549, - "2341": 1550, - "2342": 1551, - "2343": 1551, - "2344": 1552, - "2345": 1553, - "2346": 1554, - "2347": 1555, - "2348": 1556, - "2349": 1557, - "2350": 1558, - "2351": 1559, - "2352": 1559, - "2353": 1560, - "2354": 1561, - "2355": 1562, - "2356": 1562, - "2357": 1563, - "2358": 1564, - "2359": 1564, - "2360": 1564, - "2361": 1565, - "2362": 1565, - "2363": 1566, - "2364": 1567, - "2365": 1568, - "2366": 1568, - "2367": 1569, - "2368": 1569, - "2369": 1570, - "2370": 1571, - "2371": 1572, - "2372": 1572, - "2373": 1573, - "2374": 1573, - "2375": 1574, - "2376": 1575, - "2377": 1575, - "2378": 1575, - "2379": 1576, - "2380": 1576, - "2381": 1577, - "2382": 1578, - "2383": 1578, - "2384": 1578, - "2385": 1579, - "2386": 1580, - "2387": 1581, - "2388": 1582, - "2389": 1583, - "2390": 1583, - "2391": 1584, - "2392": 1585, - "2393": 1586, - "2394": 1586, - "2395": 1587, - "2396": 1587, - "2397": 1588, - "2398": 1588, - "2399": 1589, - "2400": 1589, - "2401": 1590, - "2402": 1591, - "2403": 1592, - "2404": 1592, - "2405": 1596, - "2406": 1596, - "2407": 1597, - "2408": 1598, - "2409": 1599, - "2410": 1600, - "2411": 1601, - "2412": 1604, - "2413": 1604, - "2414": 1605, - "2415": 1606, - "2416": 1607, - "2417": 1607, - "2418": 1608, - "2419": 1609, - "2420": 1610, - "2421": 1611, - "2422": 1612, - "2423": 1613, - "2424": 1613, - "2425": 1613, - "2426": 1614, - "2427": 1615, - "2428": 1618, - "2429": 1618, - "2430": 1618, - "2431": 1622, - "2432": 1622, - "2433": 1623, - "2434": 1623, - "2435": 1624, - "2436": 1624, - "2437": 1625, - "2438": 1625, - "2439": 1626, - "2440": 1626, - "2441": 1627, - "2442": 1627, - "2443": 1628, - "2444": 1629, - "2445": 1629, - "2446": 1630, - "2447": 1630, - "2448": 1631, - "2449": 1632, - "2450": 1632, - "2451": 1632, - "2452": 1633, - "2453": 1633, - "2454": 1634, - "2455": 1635, - "2456": 1635, - "2457": 1635, - "2458": 1636, - "2459": 1637, - "2460": 1638, - "2461": 1639, - "2462": 1640, - "2463": 1641, - "2464": 1642, - "2465": 1642, - "2466": 1643, - "2467": 1644, - "2468": 1645, - "2469": 1645, - "2470": 1646, - "2471": 1647, - "2472": 1647, - "2473": 1647, - "2474": 1648, - "2475": 1648, - "2476": 1649, - "2477": 1650, - "2478": 1651, - "2479": 1651, - "2480": 1652, - "2481": 1652, - "2482": 1653, - "2483": 1654, - "2484": 1655, - "2485": 1655, - "2486": 1656, - "2487": 1656, - "2488": 1657, - "2489": 1658, - "2490": 1658, - "2491": 1658, - "2492": 1659, - "2493": 1659, - "2494": 1660, - "2495": 1661, - "2496": 1661, - "2497": 1661, - "2498": 1662, - "2499": 1663, - "2500": 1664, - "2501": 1665, - "2502": 1666, - "2503": 1667, - "2504": 1668, - "2505": 1668, - "2506": 1669, - "2507": 1670, - "2508": 1671, - "2509": 1671, - "2510": 1672, - "2511": 1673, - "2512": 1673, - "2513": 1673, - "2514": 1674, - "2515": 1674, - "2516": 1675, - "2517": 1676, - "2518": 1677, - "2519": 1677, - "2520": 1678, - "2521": 1678, - "2522": 1679, - "2523": 1680, - "2524": 1681, - "2525": 1681, - "2526": 1682, - "2527": 1682, - "2528": 1683, - "2529": 1684, - "2530": 1684, - "2531": 1684, - "2532": 1685, - "2533": 1686, - "2534": 1687, - "2535": 1687, - "2536": 1687, - "2537": 1688, - "2538": 1689, - "2539": 1690, - "2540": 1691, - "2541": 1692, - "2542": 1692, - "2543": 1693, - "2544": 1694, - "2545": 1695, - "2546": 1695, - "2547": 1696, - "2548": 1696, - "2549": 1697, - "2550": 1697, - "2551": 1698, - "2552": 1698, - "2553": 1699, - "2554": 1700, - "2555": 1701, - "2556": 1701, - "2557": 1705, - "2558": 1705, - "2559": 1706, - "2560": 1707, - "2561": 1707, - "2562": 1708, - "2563": 1708, - "2564": 1708, - "2565": 1709, - "2566": 1709, - "2567": 1710, - "2568": 1710, - "2569": 1711, - "2570": 1711, - "2571": 1712, - "2572": 1713, - "2573": 1714, - "2574": 1715, - "2575": 1716, - "2576": 1717, - "2577": 1720, - "2578": 1720, - "2579": 1721, - "2580": 1722, - "2581": 1723, - "2582": 1723, - "2583": 1724, - "2584": 1725, - "2585": 1726, - "2586": 1727, - "2587": 1728, - "2588": 1729, - "2589": 1729, - "2590": 1729, - "2591": 1730, - "2592": 1731, - "2593": 1734, - "2594": 1734, - "2595": 1734, - "2596": 1738, - "2597": 1738, - "2598": 1739, - "2599": 1739, - "2600": 1740, - "2601": 1740, - "2602": 1741, - "2603": 1741, - "2604": 1742, - "2605": 1742, - "2606": 1743, - "2607": 1743, - "2608": 1744, - "2609": 1745, - "2610": 1745, - "2611": 1746, - "2612": 1747, - "2613": 1748, - "2614": 1748, - "2615": 1748, - "2616": 1749, - "2617": 1750, - "2618": 1751, - "2619": 1752, - "2620": 1753, - "2621": 1754, - "2622": 1754, - "2623": 1755, - "2624": 1756, - "2625": 1757, - "2626": 1757, - "2627": 1758, - "2628": 1759, - "2629": 1759, - "2630": 1759, - "2631": 1760, - "2632": 1760, - "2633": 1761, - "2634": 1762, - "2635": 1763, - "2636": 1763, - "2637": 1764, - "2638": 1764, - "2639": 1765, - "2640": 1766, - "2641": 1767, - "2642": 1767, - "2643": 1768, - "2644": 1768, - "2645": 1769, - "2646": 1770, - "2647": 1770, - "2648": 1770, - "2649": 1771, - "2650": 1772, - "2651": 1773, - "2652": 1774, - "2653": 1775, - "2654": 1776, - "2655": 1776, - "2656": 1777, - "2657": 1778, - "2658": 1779, - "2659": 1779, - "2660": 1780, - "2661": 1781, - "2662": 1781, - "2663": 1781, - "2664": 1782, - "2665": 1782, - "2666": 1783, - "2667": 1784, - "2668": 1785, - "2669": 1785, - "2670": 1786, - "2671": 1786, - "2672": 1787, - "2673": 1788, - "2674": 1789, - "2675": 1789, - "2676": 1790, - "2677": 1790, - "2678": 1791, - "2679": 1792, - "2680": 1792, - "2681": 1792, - "2682": 1793, - "2683": 1794, - "2684": 1795, - "2685": 1796, - "2686": 1797, - "2687": 1798, - "2688": 1798, - "2689": 1799, - "2690": 1800, - "2691": 1801, - "2692": 1801, - "2693": 1802, - "2694": 1803, - "2695": 1803, - "2696": 1803, - "2697": 1804, - "2698": 1804, - "2699": 1805, - "2700": 1806, - "2701": 1807, - "2702": 1807, - "2703": 1808, - "2704": 1808, - "2705": 1809, - "2706": 1810, - "2707": 1811, - "2708": 1811, - "2709": 1812, - "2710": 1812, - "2711": 1813, - "2712": 1814, - "2713": 1814, - "2714": 1814, - "2715": 1815, - "2716": 1816, - "2717": 1817, - "2718": 1818, - "2719": 1818, - "2720": 1819, - "2721": 1820, - "2722": 1821, - "2723": 1821, - "2724": 1822, - "2725": 1822, - "2726": 1823, - "2727": 1823, - "2728": 1824, - "2729": 1824, - "2730": 1825, - "2731": 1826, - "2732": 1827, - "2733": 1827, - "2734": 1831, - "2735": 1831, - "2736": 1832, - "2737": 1833, - "2738": 1833, - "2739": 1834, - "2740": 1835, - "2741": 1835, - "2742": 1835, - "2743": 1836, - "2744": 1837, - "2745": 1837, - "2746": 1841, - "2747": 1841, - "2748": 1842, - "2749": 1843, - "2750": 1844, - "2751": 1844, - "2752": 1844, - "2753": 1845, - "2754": 1845, - "2755": 1846, - "2756": 1846, - "2757": 1847, - "2758": 1847, - "2759": 1848, - "2760": 1849, - "2761": 1850, - "2762": 1851, - "2763": 1852, - "2764": 1852, - "2765": 1853, - "2766": 1853, - "2767": 1853, - "2768": 1854, - "2769": 1854, - "2770": 1858, - "2771": 1858, - "2772": 1859, - "2773": 1860, - "2774": 1860, - "2775": 1861, - "2776": 1861, - "2777": 1861, - "2778": 1862, - "2779": 1862, - "2780": 1862, - "2781": 1862, - "2782": 1862, - "2783": 1862, - "2784": 1863, - "2785": 1863, - "2786": 1864, - "2787": 1864, - "2788": 1865, - "2789": 1866, - "2790": 1867, - "2791": 1868, - "2792": 1869, - "2793": 1869, - "2794": 1870, - "2795": 1870, - "2796": 1870, - "2797": 1871, - "2798": 1871, - "2799": 1875, - "2800": 1875, - "2801": 1876, - "2802": 1877, - "2803": 1877, - "2804": 1878, - "2805": 1878, - "2806": 1878, - "2807": 1879, - "2808": 1879, - "2809": 1880, - "2810": 1880, - "2811": 1881, - "2812": 1881, - "2813": 1882, - "2814": 1883, - "2815": 1884, - "2816": 1885, - "2817": 1886, - "2818": 1886, - "2819": 1887, - "2820": 1887, - "2821": 1887, - "2822": 1888, - "2823": 1888, - "2824": 1892, - "2825": 1892, - "2826": 1893, - "2827": 1894, - "2828": 1894, - "2829": 1895, - "2830": 1895, - "2831": 1895, - "2832": 1896, - "2833": 1896, - "2834": 1897, - "2835": 1897, - "2836": 1898, - "2837": 1898, - "2838": 1899, - "2839": 1900, - "2840": 1901, - "2841": 1902, - "2842": 1903, - "2843": 1903, - "2844": 1904, - "2845": 1904, - "2846": 1904, - "2847": 1905, - "2848": 1905, - "2849": 1909, - "2850": 1909, - "2851": 1910, - "2852": 1911, - "2853": 1912, - "2854": 1913, - "2855": 1914, - "2856": 1917, - "2857": 1917, - "2858": 1918, - "2859": 1919, - "2860": 1920, - "2861": 1920, - "2862": 1921, - "2863": 1922, - "2864": 1923, - "2865": 1924, - "2866": 1925, - "2867": 1926, - "2868": 1927, - "2869": 1927, - "2870": 1927, - "2871": 1928, - "2872": 1929, - "2873": 1932, - "2874": 1932, - "2875": 1932, - "2876": 1936, - "2877": 1936, - "2878": 1936, - "2879": 1936, - "2880": 1936, - "2881": 1936, - "2882": 1936, - "2883": 1936, - "2884": 1937, - "2885": 1937, - "2886": 1941, - "2887": 1941, - "2888": 1942, - "2889": 1942, - "2890": 1943, - "2891": 1943, - "2892": 1944, - "2893": 1944, - "2894": 1945, - "2895": 1945, - "2896": 1946, - "2897": 1946, - "2898": 1947, - "2899": 1948, - "2900": 1948, - "2901": 1949, - "2902": 1949, - "2903": 1950, - "2904": 1951, - "2905": 1951, - "2906": 1951, - "2907": 1952, - "2908": 1952, - "2909": 1953, - "2910": 1954, - "2911": 1954, - "2912": 1954, - "2913": 1955, - "2914": 1956, - "2915": 1957, - "2916": 1958, - "2917": 1959, - "2918": 1960, - "2919": 1961, - "2920": 1961, - "2921": 1962, - "2922": 1963, - "2923": 1964, - "2924": 1964, - "2925": 1965, - "2926": 1966, - "2927": 1966, - "2928": 1966, - "2929": 1967, - "2930": 1967, - "2931": 1968, - "2932": 1969, - "2933": 1970, - "2934": 1970, - "2935": 1971, - "2936": 1971, - "2937": 1972, - "2938": 1973, - "2939": 1974, - "2940": 1974, - "2941": 1975, - "2942": 1975, - "2943": 1976, - "2944": 1977, - "2945": 1978, - "2946": 1978, - "2947": 1979, - "2948": 1980, - "2949": 1981, - "2950": 1981, - "2951": 1982, - "2952": 1983, - "2953": 1983, - "2954": 1983, - "2955": 1984, - "2956": 1984, - "2957": 1985, - "2958": 1986, - "2959": 1987, - "2960": 1987, - "2961": 1988, - "2962": 1988, - "2963": 1989, - "2964": 1990, - "2965": 1991, - "2966": 1991, - "2967": 1992, - "2968": 1992, - "2969": 1993, - "2970": 1994, - "2971": 1994, - "2972": 1994, - "2973": 1995, - "2974": 1996, - "2975": 1997, - "2976": 1997, - "2977": 1997, - "2978": 1998, - "2979": 1999, - "2980": 2000, - "2981": 2001, - "2982": 2002, - "2983": 2002, - "2984": 2003, - "2985": 2004, - "2986": 2005, - "2987": 2005, - "2988": 2006, - "2989": 2006, - "2990": 2007, - "2991": 2007, - "2992": 2008, - "2993": 2008, - "2994": 2009, - "2995": 2010, - "2996": 2011, - "2997": 2011, - "2998": 2015, - "2999": 2015, - "3000": 2016, - "3001": 2017, - "3002": 2018, - "3003": 2019, - "3004": 2020, - "3005": 2023, - "3006": 2023, - "3007": 2024, - "3008": 2025, - "3009": 2026, - "3010": 2026, - "3011": 2027, - "3012": 2028, - "3013": 2029, - "3014": 2030, - "3015": 2031, - "3016": 2032, - "3017": 2032, - "3018": 2032, - "3019": 2033, - "3020": 2034, - "3021": 2037, - "3022": 2037, - "3023": 2037, - "3024": 2041, - "3025": 2041, - "3026": 2041, - "3027": 2041, - "3028": 2041, - "3029": 2041, - "3030": 2041, - "3031": 2041, - "3032": 2042, - "3033": 2042, - "3034": 2046, - "3035": 2046, - "3036": 2047, - "3037": 2048, - "3038": 2049, - "3039": 2050, - "3040": 2051, - "3041": 2052, - "3042": 2053, - "3043": 2053, - "3044": 2053, - "3045": 2054, - "3046": 2055, - "3047": 2055, - "3048": 2055, - "3049": 2056, - "3050": 2057, - "3051": 2057, - "3052": 2058, - "3053": 2059, - "3054": 2059, - "3055": 2059, - "3056": 2060, - "3057": 2061, - "3058": 2061, - "3059": 2065, - "3060": 2065, - "3061": 2066, - "3062": 2067, - "3063": 2068, - "3064": 2069, - "3065": 2070, - "3066": 2073, - "3067": 2073, - "3068": 2074, - "3069": 2075, - "3070": 2076, - "3071": 2076, - "3072": 2077, - "3073": 2078, - "3074": 2079, - "3075": 2080, - "3076": 2081, - "3077": 2082, - "3078": 2082, - "3079": 2082, - "3080": 2083, - "3081": 2084, - "3082": 2087, - "3083": 2087, - "3084": 2087, - "3085": 2091, - "3086": 2091, - "3087": 2092, - "3088": 2092, - "3089": 2096, - "3090": 2096, - "3091": 2097, - "3092": 2098, - "3093": 2099, - "3094": 2100, - "3095": 2101, - "3096": 2102, - "3097": 2103, - "3098": 2103, - "3099": 2103, - "3100": 2104, - "3101": 2105, - "3102": 2105, - "3103": 2105, - "3104": 2106, - "3105": 2107, - "3106": 2108, - "3107": 2109, - "3108": 2110, - "3109": 2111, - "3110": 2112, - "3111": 2113, - "3112": 2114, - "3113": 2114, - "3114": 2118, - "3115": 2118, - "3116": 2119, - "3117": 2120, - "3118": 2121, - "3119": 2122, - "3120": 2123, - "3121": 2126, - "3122": 2126, - "3123": 2127, - "3124": 2128, - "3125": 2129, - "3126": 2129, - "3127": 2130, - "3128": 2131, - "3129": 2132, - "3130": 2133, - "3131": 2134, - "3132": 2135, - "3133": 2136, - "3134": 2136, - "3135": 2136, - "3136": 2137, - "3137": 2138, - "3138": 2141, - "3139": 2141, - "3140": 2141, - "3141": 2145, - "3142": 2145, - "3143": 2146, - "3144": 2146, - "3145": 2150, - "3146": 2150, - "3147": 2151, - "3148": 2152, - "3149": 2153, - "3150": 2154, - "3151": 2155, - "3152": 2156, - "3153": 2157, - "3154": 2157, - "3155": 2157, - "3156": 2158, - "3157": 2159, - "3158": 2159, - "3159": 2159, - "3160": 2160, - "3161": 2161, - "3162": 2162, - "3163": 2163, - "3164": 2164, - "3165": 2165, - "3166": 2166, - "3167": 2167, - "3168": 2168, - "3169": 2169, - "3170": 2170, - "3171": 2171, - "3172": 2171, - "3173": 2172, - "3174": 2172, - "3175": 2173, - "3176": 2174, - "3177": 2175, - "3178": 2175, - "3179": 2176, - "3180": 2176, - "3181": 2180, - "3182": 2180, - "3183": 2181, - "3184": 2181, - "3185": 2182, - "3186": 2183, - "3187": 2184, - "3188": 2185, - "3189": 2186, - "3190": 2187, - "3191": 2190, - "3192": 2190, - "3193": 2191, - "3194": 2192, - "3195": 2193, - "3196": 2193, - "3197": 2194, - "3198": 2195, - "3199": 2196, - "3200": 2197, - "3201": 2198, - "3202": 2199, - "3203": 2199, - "3204": 2199, - "3205": 2200, - "3206": 2201, - "3207": 2204, - "3208": 2204, - "3209": 2204, - "3210": 2208, - "3211": 2208, - "3212": 2208, - "3213": 2208, - "3214": 2208, - "3215": 2208, - "3216": 2208, - "3217": 2208, - "3218": 2208, - "3219": 2208, - "3220": 2208, - "3221": 2208, - "3222": 2208, - "3223": 2208, - "3224": 2208, - "3225": 2208, - "3226": 2208, - "3227": 2208, - "3228": 2208, - "3229": 2208, - "3230": 2208, - "3231": 2208, - "3232": 2208, - "3233": 2208, - "3234": 2208, - "3235": 2208, - "3236": 2208, - "3237": 2208, - "3238": 2209, - "3239": 2209, - "3240": 2213, - "3241": 2213, - "3242": 2214, - "3243": 2215, - "3244": 2216, - "3245": 2217, - "3246": 2218, - "3247": 2219, - "3248": 2219, - "3249": 2219, - "3250": 2220, - "3251": 2221, - "3252": 2222, - "3253": 2223, - "3254": 2224, - "3255": 2225, - "3256": 2225, - "3257": 2226, - "3258": 2227, - "3259": 2228, - "3260": 2229, - "3261": 2230, - "3262": 2231, - "3263": 2231, - "3264": 2232, - "3265": 2232, - "3266": 2233, - "3267": 2234, - "3268": 2234, - "3269": 2235, - "3270": 2236, - "3271": 2236, - "3272": 2237, - "3273": 2238, - "3274": 2239, - "3275": 2239, - "3276": 2240, - "3277": 2240, - "3278": 2241, - "3279": 2242, - "3280": 2243, - "3281": 2244, - "3282": 2245, - "3283": 2246, - "3284": 2247, - "3285": 2248, - "3286": 2248, - "3287": 2252, - "3288": 2252, - "3289": 2253, - "3290": 2254, - "3291": 2255, - "3292": 2256, - "3293": 2257, - "3294": 2260, - "3295": 2260, - "3296": 2261, - "3297": 2262, - "3298": 2263, - "3299": 2263, - "3300": 2264, - "3301": 2265, - "3302": 2266, - "3303": 2267, - "3304": 2268, - "3305": 2269, - "3306": 2269, - "3307": 2270, - "3308": 2270, - "3309": 2270, - "3310": 2271, - "3311": 2272, - "3312": 2275, - "3313": 2275, - "3314": 2275, - "3315": 2279, - "3316": 2279, - "3317": 2279, - "3318": 2279, - "3319": 2279, - "3320": 2279, - "3321": 2279, - "3322": 2279, - "3323": 2279, - "3324": 2279, - "3325": 2279, - "3326": 2279, - "3327": 2279, - "3328": 2279, - "3329": 2279, - "3330": 2279, - "3331": 2279, - "3332": 2279, - "3333": 2279, - "3334": 2279, - "3335": 2279, - "3336": 2279, - "3337": 2279, - "3338": 2279, - "3339": 2280, - "3340": 2280, - "3341": 2284, - "3342": 2285, - "3343": 2285, - "3344": 2289, - "3345": 2289, - "3346": 2290, - "3347": 2290, - "3348": 2294, - "3349": 2294, - "3350": 2295, - "3351": 2296, - "3352": 2297, - "3353": 2297, - "3354": 2298, - "3355": 2299, - "3356": 2300, - "3357": 2300, - "3358": 2300, - "3359": 2301, - "3360": 2301, - "3361": 2302, - "3362": 2303, - "3363": 2304, - "3364": 2305, - "3365": 2306, - "3366": 2306, - "3367": 2307, - "3368": 2307, - "3369": 2308, - "3370": 2309, - "3371": 2310, - "3372": 2311, - "3373": 2312, - "3374": 2312, - "3375": 2313, - "3376": 2313, - "3377": 2314, - "3378": 2315, - "3379": 2315, - "3380": 2316, - "3381": 2317, - "3382": 2317, - "3383": 2318, - "3384": 2319, - "3385": 2320, - "3386": 2320, - "3387": 2321, - "3388": 2321, - "3389": 2322, - "3390": 2323, - "3391": 2324, - "3392": 2325, - "3393": 2326, - "3394": 2327, - "3395": 2328, - "3396": 2329, - "3397": 2329, - "3398": 2330, - "3399": 2331, - "3400": 2331, - "3401": 2331, - "3402": 2332, - "3403": 2332, - "3404": 2333, - "3405": 2333, - "3406": 2334, - "3407": 2334, - "3408": 2335, - "3409": 2336, - "3410": 2337, - "3411": 2338, - "3412": 2339, - "3413": 2340, - "3414": 2340, - "3415": 2341, - "3416": 2341, - "3417": 2345, - "3418": 2345, - "3419": 2346, - "3420": 2347, - "3421": 2348, - "3422": 2349, - "3423": 2350, - "3424": 2353, - "3425": 2353, - "3426": 2354, - "3427": 2355, - "3428": 2356, - "3429": 2356, - "3430": 2357, - "3431": 2358, - "3432": 2359, - "3433": 2360, - "3434": 2361, - "3435": 2362, - "3436": 2363, - "3437": 2363, - "3438": 2363, - "3439": 2364, - "3440": 2365, - "3441": 2368, - "3442": 2368, - "3443": 2368, - "3444": 2372, - "3445": 2372, - "3446": 2373, - "3447": 2373, - "3448": 2377, - "3449": 2377, - "3450": 2377, - "3451": 2377, - "3452": 2378, - "3453": 2378, - "3454": 2379, - "3455": 2380, - "3456": 2381, - "3457": 2382, - "3458": 2383, - "3459": 2384, - "3460": 2385, - "3461": 2386, - "3462": 2387, - "3463": 2387, - "3464": 2388, - "3465": 2389, - "3466": 2390, - "3467": 2391, - "3468": 2392, - "3469": 2393, - "3470": 2394, - "3471": 2395, - "3472": 2396, - "3473": 2396, - "3474": 2397, - "3475": 2398, - "3476": 2399, - "3477": 2400, - "3478": 2401, - "3479": 2402, - "3480": 2403, - "3481": 2404, - "3482": 2405, - "3483": 2405, - "3484": 2409, - "3485": 2409, - "3486": 2410, - "3487": 2411, - "3488": 2412, - "3489": 2413, - "3490": 2414, - "3491": 2417, - "3492": 2417, - "3493": 2418, - "3494": 2419, - "3495": 2420, - "3496": 2420, - "3497": 2421, - "3498": 2422, - "3499": 2423, - "3500": 2424, - "3501": 2425, - "3502": 2426, - "3503": 2426, - "3504": 2426, - "3505": 2427, - "3506": 2428, - "3507": 2431, - "3508": 2431, - "3509": 2431, - "3510": 2435, - "3511": 2435, - "3512": 2436, - "3513": 2436, - "3514": 2440, - "3515": 2440, - "3516": 2441, - "3517": 2442, - "3518": 2443, - "3519": 2444, - "3520": 2445, - "3521": 2446, - "3522": 2446, - "3523": 2446, - "3524": 2447, - "3525": 2448, - "3526": 2449, - "3527": 2450, - "3528": 2451, - "3529": 2452, - "3530": 2452, - "3531": 2453, - "3532": 2454, - "3533": 2455, - "3534": 2456, - "3535": 2457, - "3536": 2458, - "3537": 2458, - "3538": 2459, - "3539": 2459, - "3540": 2460, - "3541": 2461, - "3542": 2461, - "3543": 2462, - "3544": 2463, - "3545": 2463, - "3546": 2464, - "3547": 2465, - "3548": 2466, - "3549": 2466, - "3550": 2467, - "3551": 2467, - "3552": 2468, - "3553": 2469, - "3554": 2470, - "3555": 2471, - "3556": 2472, - "3557": 2473, - "3558": 2474, - "3559": 2475, - "3560": 2475, - "3561": 2479, - "3562": 2479, - "3563": 2480, - "3564": 2481, - "3565": 2482, - "3566": 2483, - "3567": 2484, - "3568": 2487, - "3569": 2487, - "3570": 2488, - "3571": 2489, - "3572": 2490, - "3573": 2490, - "3574": 2491, - "3575": 2492, - "3576": 2493, - "3577": 2494, - "3578": 2495, - "3579": 2496, - "3580": 2497, - "3581": 2497, - "3582": 2497, - "3583": 2498, - "3584": 2499, - "3585": 2502, - "3586": 2502, - "3587": 2502, - "3588": 2506, - "3589": 2506, - "3590": 2507, - "3591": 2507, - "3592": 2511, - "3593": 2511, - "3594": 2512, - "3595": 2513, - "3596": 2514, - "3597": 2515, - "3598": 2516, - "3599": 2517, - "3600": 2517, - "3601": 2517, - "3602": 2518, - "3603": 2519, - "3604": 2520, - "3605": 2521, - "3606": 2522, - "3607": 2523, - "3608": 2523, - "3609": 2524, - "3610": 2525, - "3611": 2526, - "3612": 2527, - "3613": 2528, - "3614": 2529, - "3615": 2529, - "3616": 2530, - "3617": 2530, - "3618": 2531, - "3619": 2532, - "3620": 2532, - "3621": 2533, - "3622": 2534, - "3623": 2534, - "3624": 2535, - "3625": 2536, - "3626": 2537, - "3627": 2537, - "3628": 2538, - "3629": 2538, - "3630": 2539, - "3631": 2540, - "3632": 2541, - "3633": 2542, - "3634": 2543, - "3635": 2544, - "3636": 2545, - "3637": 2546, - "3638": 2547, - "3639": 2548, - "3640": 2548, - "3641": 2548, - "3642": 2549, - "3643": 2549, - "3644": 2550, - "3645": 2550, - "3646": 2551, - "3647": 2551, - "3648": 2552, - "3649": 2553, - "3650": 2554, - "3651": 2555, - "3652": 2556, - "3653": 2557, - "3654": 2557, - "3655": 2558, - "3656": 2558, - "3657": 2562, - "3658": 2562, - "3659": 2563, - "3660": 2564, - "3661": 2565, - "3662": 2566, - "3663": 2567, - "3664": 2570, - "3665": 2570, - "3666": 2571, - "3667": 2572, - "3668": 2573, - "3669": 2573, - "3670": 2574, - "3671": 2575, - "3672": 2576, - "3673": 2577, - "3674": 2578, - "3675": 2579, - "3676": 2579, - "3677": 2579, - "3678": 2580, - "3679": 2581, - "3680": 2584, - "3681": 2584, - "3682": 2584, - "3683": 2588, - "3684": 2588, - "3685": 2589, - "3686": 2589, - "3687": 2593, - "3688": 2593, - "3689": 2594, - "3690": 2595, - "3691": 2596, - "3692": 2597, - "3693": 2598, - "3694": 2599, - "3695": 2599, - "3696": 2599, - "3697": 2600, - "3698": 2601, - "3699": 2602, - "3700": 2603, - "3701": 2604, - "3702": 2605, - "3703": 2605, - "3704": 2606, - "3705": 2607, - "3706": 2608, - "3707": 2609, - "3708": 2610, - "3709": 2611, - "3710": 2611, - "3711": 2612, - "3712": 2612, - "3713": 2613, - "3714": 2614, - "3715": 2614, - "3716": 2615, - "3717": 2616, - "3718": 2616, - "3719": 2617, - "3720": 2618, - "3721": 2619, - "3722": 2619, - "3723": 2620, - "3724": 2620, - "3725": 2621, - "3726": 2622, - "3727": 2623, - "3728": 2624, - "3729": 2625, - "3730": 2626, - "3731": 2627, - "3732": 2628, - "3733": 2628, - "3734": 2632, - "3735": 2632, - "3736": 2633, - "3737": 2634, - "3738": 2635, - "3739": 2636, - "3740": 2637, - "3741": 2640, - "3742": 2640, - "3743": 2641, - "3744": 2642, - "3745": 2643, - "3746": 2643, - "3747": 2644, - "3748": 2645, - "3749": 2646, - "3750": 2647, - "3751": 2648, - "3752": 2649, - "3753": 2650, - "3754": 2650, - "3755": 2650, - "3756": 2651, - "3757": 2652, - "3758": 2655, - "3759": 2655, - "3760": 2655, - "3761": 2659, - "3762": 2659, - "3763": 2660, - "3764": 2660, - "3765": 2664, - "3766": 2664, - "3767": 2665, - "3768": 2666, - "3769": 2667, - "3770": 2668, - "3771": 2669, - "3772": 2670, - "3773": 2670, - "3774": 2670, - "3775": 2671, - "3776": 2672, - "3777": 2673, - "3778": 2674, - "3779": 2675, - "3780": 2676, - "3781": 2676, - "3782": 2677, - "3783": 2678, - "3784": 2679, - "3785": 2680, - "3786": 2681, - "3787": 2682, - "3788": 2682, - "3789": 2683, - "3790": 2683, - "3791": 2684, - "3792": 2685, - "3793": 2685, - "3794": 2686, - "3795": 2687, - "3796": 2687, - "3797": 2688, - "3798": 2689, - "3799": 2690, - "3800": 2690, - "3801": 2691, - "3802": 2691, - "3803": 2692, - "3804": 2693, - "3805": 2694, - "3806": 2695, - "3807": 2696, - "3808": 2697, - "3809": 2698, - "3810": 2699, - "3811": 2700, - "3812": 2701, - "3813": 2701, - "3814": 2701, - "3815": 2702, - "3816": 2702, - "3817": 2703, - "3818": 2703, - "3819": 2704, - "3820": 2704, - "3821": 2705, - "3822": 2706, - "3823": 2707, - "3824": 2708, - "3825": 2709, - "3826": 2710, - "3827": 2710, - "3828": 2711, - "3829": 2711, - "3830": 2715, - "3831": 2715, - "3832": 2716, - "3833": 2717, - "3834": 2718, - "3835": 2719, - "3836": 2720, - "3837": 2723, - "3838": 2723, - "3839": 2724, - "3840": 2725, - "3841": 2726, - "3842": 2726, - "3843": 2727, - "3844": 2728, - "3845": 2729, - "3846": 2730, - "3847": 2731, - "3848": 2731, - "3849": 2731, - "3850": 2732, - "3851": 2733, - "3852": 2736, - "3853": 2736, - "3854": 2736, - "3855": 2740, - "3856": 2740, - "3857": 2741, - "3858": 2742, - "3859": 2743, - "3860": 2744, - "3861": 2744, - "3862": 2744, - "3863": 2745, - "3864": 2746, - "3865": 2747, - "3866": 2748, - "3867": 2749, - "3868": 2750, - "3869": 2751, - "3870": 2754, - "3871": 2754, - "3872": 2755, - "3873": 2756, - "3874": 2757, - "3875": 2757, - "3876": 2758, - "3877": 2759, - "3878": 2760, - "3879": 2761, - "3880": 2762, - "3881": 2762, - "3882": 2762, - "3883": 2763, - "3884": 2763, - "3885": 2763, - "3886": 2764, - "3887": 2764, - "3888": 2764, - "3889": 2765, - "3890": 2766, - "3891": 2769, - "3892": 2769, - "3893": 2769, - "3894": 2773, - "3895": 2773, - "3896": 2774, - "3897": 2774, - "3898": 2775, - "3899": 2776, - "3900": 2777, - "3901": 2780, - "3902": 2780, - "3903": 2781, - "3904": 2782, - "3905": 2783, - "3906": 2783, - "3907": 2784, - "3908": 2785, - "3909": 2786, - "3910": 2787, - "3911": 2788, - "3912": 2789, - "3913": 2789, - "3914": 2789, - "3915": 2790, - "3916": 2791, - "3917": 2794, - "3918": 2794, - "3919": 2794, - "3920": 2798, - "3921": 2799, - "3922": 2799, - "3923": 2800, - "3924": 2800, - "3925": 2801, - "3926": 2801, - "3927": 2802, - "3928": 2803, - "3929": 2803, - "3930": 2804, - "3931": 2805, - "3932": 2805, - "3933": 2806, - "3934": 2807, - "3935": 2808, - "3936": 2808, - "3937": 2808, - "3938": 2809, - "3939": 2810, - "3940": 2811, - "3941": 2812, - "3942": 2813, - "3943": 2814, - "3944": 2814, - "3945": 2815, - "3946": 2816, - "3947": 2817, - "3948": 2817, - "3949": 2818, - "3950": 2819, - "3951": 2819, - "3952": 2819, - "3953": 2820, - "3954": 2820, - "3955": 2821, - "3956": 2822, - "3957": 2823, - "3958": 2823, - "3959": 2824, - "3960": 2824, - "3961": 2825, - "3962": 2826, - "3963": 2827, - "3964": 2827, - "3965": 2828, - "3966": 2828, - "3967": 2829, - "3968": 2830, - "3969": 2831, - "3970": 2831, - "3971": 2832, - "3972": 2833, - "3973": 2834, - "3974": 2834, - "3975": 2835, - "3976": 2836, - "3977": 2836, - "3978": 2836, - "3979": 2837, - "3980": 2837, - "3981": 2838, - "3982": 2839, - "3983": 2840, - "3984": 2840, - "3985": 2841, - "3986": 2841, - "3987": 2842, - "3988": 2843, - "3989": 2844, - "3990": 2844, - "3991": 2845, - "3992": 2845, - "3993": 2846, - "3994": 2847, - "3995": 2847, - "3996": 2847, - "3997": 2848, - "3998": 2849, - "3999": 2850, - "4000": 2851, - "4001": 2851, - "4002": 2852, - "4003": 2853, - "4004": 2854, - "4005": 2854, - "4006": 2855, - "4007": 2855, - "4008": 2856, - "4009": 2856, - "4010": 2857, - "4011": 2857, - "4012": 2858, - "4013": 2859, - "4014": 2860, - "4015": 2860, - "4016": 2864, - "4017": 2864, - "4018": 2865, - "4019": 2866, - "4020": 2867, - "4021": 2868, - "4022": 2869, - "4023": 2872, - "4024": 2872, - "4025": 2873, - "4026": 2874, - "4027": 2875, - "4028": 2875, - "4029": 2876, - "4030": 2877, - "4031": 2878, - "4032": 2879, - "4033": 2880, - "4034": 2881, - "4035": 2881, - "4036": 2881, - "4037": 2882, - "4038": 2883, - "4039": 2886, - "4040": 2886, - "4041": 2886, - "4042": 2890, - "4043": 2891, - "4044": 2891, - "4045": 2892, - "4046": 2892, - "4047": 2893, - "4048": 2893, - "4049": 2894, - "4050": 2895, - "4051": 2895, - "4052": 2896, - "4053": 2897, - "4054": 2897, - "4055": 2898, - "4056": 2899, - "4057": 2900, - "4058": 2900, - "4059": 2900, - "4060": 2901, - "4061": 2902, - "4062": 2903, - "4063": 2904, - "4064": 2905, - "4065": 2906, - "4066": 2906, - "4067": 2907, - "4068": 2908, - "4069": 2909, - "4070": 2909, - "4071": 2910, - "4072": 2911, - "4073": 2911, - "4074": 2911, - "4075": 2912, - "4076": 2912, - "4077": 2913, - "4078": 2914, - "4079": 2915, - "4080": 2915, - "4081": 2916, - "4082": 2916, - "4083": 2917, - "4084": 2918, - "4085": 2919, - "4086": 2919, - "4087": 2920, - "4088": 2920, - "4089": 2921, - "4090": 2922, - "4091": 2923, - "4092": 2923, - "4093": 2924, - "4094": 2925, - "4095": 2926, - "4096": 2926, - "4097": 2927, - "4098": 2928, - "4099": 2928, - "4100": 2928, - "4101": 2929, - "4102": 2929, - "4103": 2930, - "4104": 2931, - "4105": 2932, - "4106": 2932, - "4107": 2933, - "4108": 2933, - "4109": 2934, - "4110": 2935, - "4111": 2936, - "4112": 2936, - "4113": 2937, - "4114": 2937, - "4115": 2938, - "4116": 2939, - "4117": 2939, - "4118": 2939, - "4119": 2940, - "4120": 2941, - "4121": 2942, - "4122": 2943, - "4123": 2943, - "4124": 2944, - "4125": 2945, - "4126": 2946, - "4127": 2946, - "4128": 2947, - "4129": 2947, - "4130": 2948, - "4131": 2948, - "4132": 2949, - "4133": 2949, - "4134": 2950, - "4135": 2951, - "4136": 2952, - "4137": 2952, - "4138": 2956, - "4139": 2956, - "4140": 2957, - "4141": 2958, - "4142": 2958, - "4143": 2959, - "4144": 2959, - "4145": 2959, - "4146": 2960, - "4147": 2960, - "4148": 2961, - "4149": 2961, - "4150": 2962, - "4151": 2962, - "4152": 2963, - "4153": 2964, - "4154": 2964, - "4155": 2964, - "4156": 2965, - "4157": 2965, - "4158": 2966, - "4159": 2967, - "4160": 2971, - "4161": 2971, - "4162": 2972, - "4163": 2973, - "4164": 2973, - "4165": 2974, - "4166": 2974, - "4167": 2974, - "4168": 2975, - "4169": 2975, - "4170": 2976, - "4171": 2976, - "4172": 2977, - "4173": 2977, - "4174": 2978, - "4175": 2979, - "4176": 2979, - "4177": 2979, - "4178": 2980, - "4179": 2981, - "4180": 2982, - "4181": 2983, - "4182": 2983, - "4183": 2983, - "4184": 2984, - "4185": 2985, - "4186": 2986, - "4187": 2987, - "4188": 2988, - "4189": 2989, - "4190": 2990, - "4191": 2993, - "4192": 2993, - "4193": 2994, - "4194": 2995, - "4195": 2996, - "4196": 2996, - "4197": 2997, - "4198": 2998, - "4199": 2999, - "4200": 3000, - "4201": 3001, - "4202": 3002, - "4203": 3002, - "4204": 3002, - "4205": 3003, - "4206": 3004, - "4207": 3007, - "4208": 3007, - "4209": 3007, - "4210": 3011, - "4211": 3011, - "4212": 3012, - "4213": 3012, - "4214": 3013, - "4215": 3013, - "4216": 3014, - "4217": 3014, - "4218": 3015, - "4219": 3015, - "4220": 3016, - "4221": 3016, - "4222": 3017, - "4223": 3018, - "4224": 3018, - "4225": 3019, - "4226": 3020, - "4227": 3021, - "4228": 3021, - "4229": 3021, - "4230": 3022, - "4231": 3023, - "4232": 3024, - "4233": 3025, - "4234": 3026, - "4235": 3027, - "4236": 3027, - "4237": 3028, - "4238": 3029, - "4239": 3030, - "4240": 3030, - "4241": 3031, - "4242": 3032, - "4243": 3032, - "4244": 3032, - "4245": 3033, - "4246": 3033, - "4247": 3034, - "4248": 3035, - "4249": 3036, - "4250": 3036, - "4251": 3037, - "4252": 3037, - "4253": 3038, - "4254": 3039, - "4255": 3040, - "4256": 3040, - "4257": 3041, - "4258": 3041, - "4259": 3042, - "4260": 3043, - "4261": 3044, - "4262": 3044, - "4263": 3045, - "4264": 3046, - "4265": 3047, - "4266": 3047, - "4267": 3048, - "4268": 3049, - "4269": 3049, - "4270": 3049, - "4271": 3050, - "4272": 3050, - "4273": 3051, - "4274": 3052, - "4275": 3053, - "4276": 3053, - "4277": 3054, - "4278": 3054, - "4279": 3055, - "4280": 3056, - "4281": 3057, - "4282": 3057, - "4283": 3058, - "4284": 3058, - "4285": 3059, - "4286": 3060, - "4287": 3060, - "4288": 3060, - "4289": 3061, - "4290": 3062, - "4291": 3063, - "4292": 3064, - "4293": 3065, - "4294": 3066, - "4295": 3066, - "4296": 3067, - "4297": 3068, - "4298": 3069, - "4299": 3069, - "4300": 3070, - "4301": 3071, - "4302": 3071, - "4303": 3071, - "4304": 3072, - "4305": 3072, - "4306": 3073, - "4307": 3074, - "4308": 3075, - "4309": 3075, - "4310": 3076, - "4311": 3076, - "4312": 3077, - "4313": 3078, - "4314": 3079, - "4315": 3079, - "4316": 3080, - "4317": 3080, - "4318": 3081, - "4319": 3082, - "4320": 3082, - "4321": 3082, - "4322": 3083, - "4323": 3084, - "4324": 3085, - "4325": 3086, - "4326": 3086, - "4327": 3087, - "4328": 3088, - "4329": 3089, - "4330": 3089, - "4331": 3090, - "4332": 3090, - "4333": 3091, - "4334": 3091, - "4335": 3092, - "4336": 3092, - "4337": 3093, - "4338": 3094, - "4339": 3095, - "4340": 3095, - "4341": 3099, - "4342": 3099, - "4343": 3100, - "4344": 3101, - "4345": 3101, - "4346": 3102, - "4347": 3103, - "4348": 3103, - "4349": 3103, - "4350": 3104, - "4351": 3105, - "4352": 3105, - "4353": 3109, - "4354": 3109, - "4355": 3110, - "4356": 3111, - "4357": 3112, - "4358": 3112, - "4359": 3112, - "4360": 3113, - "4361": 3113, - "4362": 3114, - "4363": 3114, - "4364": 3115, - "4365": 3115, - "4366": 3116, - "4367": 3117, - "4368": 3118, - "4369": 3119, - "4370": 3120, - "4371": 3120, - "4372": 3121, - "4373": 3121, - "4374": 3121, - "4375": 3122, - "4376": 3122, - "4377": 3126, - "4378": 3126, - "4379": 3127, - "4380": 3128, - "4381": 3128, - "4382": 3129, - "4383": 3129, - "4384": 3129, - "4385": 3130, - "4386": 3130, - "4387": 3131, - "4388": 3131, - "4389": 3132, - "4390": 3132, - "4391": 3133, - "4392": 3134, - "4393": 3135, - "4394": 3136, - "4395": 3137, - "4396": 3137, - "4397": 3138, - "4398": 3138, - "4399": 3138, - "4400": 3139, - "4401": 3139, - "4402": 3143, - "4403": 3143, - "4404": 3144, - "4405": 3145, - "4406": 3145, - "4407": 3146, - "4408": 3146, - "4409": 3146, - "4410": 3147, - "4411": 3147, - "4412": 3148, - "4413": 3148, - "4414": 3149, - "4415": 3149, - "4416": 3150, - "4417": 3151, - "4418": 3152, - "4419": 3153, - "4420": 3154, - "4421": 3154, - "4422": 3155, - "4423": 3155, - "4424": 3155, - "4425": 3156, - "4426": 3156, - "4427": 3160, - "4428": 3160, - "4429": 3161, - "4430": 3162, - "4431": 3162, - "4432": 3163, - "4433": 3163, - "4434": 3163, - "4435": 3164, - "4436": 3164, - "4437": 3165, - "4438": 3165, - "4439": 3166, - "4440": 3166, - "4441": 3167, - "4442": 3168, - "4443": 3169, - "4444": 3170, - "4445": 3171, - "4446": 3171, - "4447": 3172, - "4448": 3172, - "4449": 3172, - "4450": 3173, - "4451": 3173, - "4452": 3177, - "4453": 3177, - "4454": 3178, - "4455": 3179, - "4456": 3180, - "4457": 3181, - "4458": 3182, - "4459": 3185, - "4460": 3185, - "4461": 3186, - "4462": 3187, - "4463": 3188, - "4464": 3188, - "4465": 3189, - "4466": 3190, - "4467": 3191, - "4468": 3192, - "4469": 3193, - "4470": 3194, - "4471": 3194, - "4472": 3194, - "4473": 3195, - "4474": 3196, - "4475": 3199, - "4476": 3199, - "4477": 3199, - "4478": 3203, - "4479": 3204, - "4480": 3204, - "4481": 3205, - "4482": 3205, - "4483": 3206, - "4484": 3206, - "4485": 3207, - "4486": 3207, - "4487": 3208, - "4488": 3208, - "4489": 3209, - "4490": 3210, - "4491": 3210, - "4492": 3211, - "4493": 3212, - "4494": 3213, - "4495": 3213, - "4496": 3213, - "4497": 3214, - "4498": 3215, - "4499": 3216, - "4500": 3217, - "4501": 3218, - "4502": 3219, - "4503": 3219, - "4504": 3220, - "4505": 3221, - "4506": 3222, - "4507": 3222, - "4508": 3223, - "4509": 3224, - "4510": 3224, - "4511": 3224, - "4512": 3225, - "4513": 3225, - "4514": 3226, - "4515": 3227, - "4516": 3228, - "4517": 3228, - "4518": 3229, - "4519": 3229, - "4520": 3230, - "4521": 3231, - "4522": 3232, - "4523": 3232, - "4524": 3233, - "4525": 3234, - "4526": 3235, - "4527": 3235, - "4528": 3235, - "4529": 3236, - "4530": 3237, - "4531": 3238, - "4532": 3239, - "4533": 3240, - "4534": 3241, - "4535": 3241, - "4536": 3242, - "4537": 3243, - "4538": 3244, - "4539": 3244, - "4540": 3245, - "4541": 3246, - "4542": 3246, - "4543": 3246, - "4544": 3247, - "4545": 3247, - "4546": 3248, - "4547": 3249, - "4548": 3250, - "4549": 3250, - "4550": 3251, - "4551": 3251, - "4552": 3252, - "4553": 3253, - "4554": 3254, - "4555": 3254, - "4556": 3255, - "4557": 3255, - "4558": 3256, - "4559": 3257, - "4560": 3257, - "4561": 3257, - "4562": 3258, - "4563": 3259, - "4564": 3260, - "4565": 3261, - "4566": 3261, - "4567": 3262, - "4568": 3263, - "4569": 3264, - "4570": 3264, - "4571": 3265, - "4572": 3265, - "4573": 3266, - "4574": 3266, - "4575": 3267, - "4576": 3267, - "4577": 3268, - "4578": 3269, - "4579": 3270, - "4580": 3270, - "4581": 3274, - "4582": 3274, - "4583": 3275, - "4584": 3276, - "4585": 3277, - "4586": 3277, - "4587": 3277, - "4588": 3278, - "4589": 3278, - "4590": 3278, - "4591": 3278, - "4592": 3278, - "4593": 3278, - "4594": 3278, - "4595": 3278, - "4596": 3279, - "4597": 3279, - "4598": 3280, - "4599": 3280, - "4600": 3281, - "4601": 3282, - "4602": 3283, - "4603": 3283, - "4604": 3284, - "4605": 3285, - "4606": 3285, - "4607": 3286, - "4608": 3286, - "4609": 3286, - "4610": 3287, - "4611": 3287, - "4612": 3291, - "4613": 3291, - "4614": 3292, - "4615": 3293, - "4616": 3294, - "4617": 3294, - "4618": 3294, - "4619": 3295, - "4620": 3295, - "4621": 3295, - "4622": 3295, - "4623": 3295, - "4624": 3295, - "4625": 3295, - "4626": 3295, - "4627": 3296, - "4628": 3296, - "4629": 3297, - "4630": 3297, - "4631": 3298, - "4632": 3299, - "4633": 3300, - "4634": 3300, - "4635": 3301, - "4636": 3302, - "4637": 3302, - "4638": 3303, - "4639": 3303, - "4640": 3303, - "4641": 3304, - "4642": 3304, - "4643": 3308, - "4644": 3308, - "4645": 3309, - "4646": 3310, - "4647": 3310, - "4648": 3311, - "4649": 3311, - "4650": 3311, - "4651": 3312, - "4652": 3312, - "4653": 3312, - "4654": 3312, - "4655": 3312, - "4656": 3312, - "4657": 3312, - "4658": 3312, - "4659": 3313, - "4660": 3313, - "4661": 3314, - "4662": 3314, - "4663": 3315, - "4664": 3316, - "4665": 3317, - "4666": 3317, - "4667": 3318, - "4668": 3319, - "4669": 3319, - "4670": 3320, - "4671": 3320, - "4672": 3320, - "4673": 3321, - "4674": 3321, - "4675": 3325, - "4676": 3325, - "4677": 3326, - "4678": 3327, - "4679": 3328, - "4680": 3329, - "4681": 3330, - "4682": 3333, - "4683": 3333, - "4684": 3334, - "4685": 3335, - "4686": 3336, - "4687": 3336, - "4688": 3337, - "4689": 3338, - "4690": 3339, - "4691": 3340, - "4692": 3341, - "4693": 3342, - "4694": 3342, - "4695": 3342, - "4696": 3343, - "4697": 3344, - "4698": 3347, - "4699": 3347, - "4700": 3347, - "4701": 3351, - "4702": 3352, - "4703": 3352, - "4704": 3353, - "4705": 3353, - "4706": 3354, - "4707": 3354, - "4708": 3355, - "4709": 3355, - "4710": 3356, - "4711": 3356, - "4712": 3357, - "4713": 3358, - "4714": 3358, - "4715": 3359, - "4716": 3360, - "4717": 3361, - "4718": 3361, - "4719": 3361, - "4720": 3362, - "4721": 3363, - "4722": 3364, - "4723": 3364, - "4724": 3364, - "4725": 3365, - "4726": 3366, - "4727": 3367, - "4728": 3368, - "4729": 3369, - "4730": 3370, - "4731": 3371, - "4732": 3371, - "4733": 3372, - "4734": 3373, - "4735": 3374, - "4736": 3374, - "4737": 3375, - "4738": 3376, - "4739": 3376, - "4740": 3376, - "4741": 3377, - "4742": 3377, - "4743": 3378, - "4744": 3379, - "4745": 3380, - "4746": 3380, - "4747": 3381, - "4748": 3381, - "4749": 3382, - "4750": 3383, - "4751": 3384, - "4752": 3384, - "4753": 3385, - "4754": 3386, - "4755": 3387, - "4756": 3387, - "4757": 3387, - "4758": 3388, - "4759": 3388, - "4760": 3389, - "4761": 3390, - "4762": 3390, - "4763": 3390, - "4764": 3391, - "4765": 3392, - "4766": 3393, - "4767": 3394, - "4768": 3395, - "4769": 3396, - "4770": 3397, - "4771": 3397, - "4772": 3398, - "4773": 3399, - "4774": 3400, - "4775": 3400, - "4776": 3401, - "4777": 3402, - "4778": 3402, - "4779": 3402, - "4780": 3403, - "4781": 3403, - "4782": 3404, - "4783": 3405, - "4784": 3406, - "4785": 3406, - "4786": 3407, - "4787": 3407, - "4788": 3408, - "4789": 3409, - "4790": 3410, - "4791": 3410, - "4792": 3411, - "4793": 3411, - "4794": 3412, - "4795": 3413, - "4796": 3413, - "4797": 3413, - "4798": 3414, - "4799": 3414, - "4800": 3415, - "4801": 3416, - "4802": 3416, - "4803": 3416, - "4804": 3417, - "4805": 3418, - "4806": 3419, - "4807": 3420, - "4808": 3421, - "4809": 3421, - "4810": 3422, - "4811": 3423, - "4812": 3424, - "4813": 3424, - "4814": 3425, - "4815": 3425, - "4816": 3426, - "4817": 3426, - "4818": 3427, - "4819": 3427, - "4820": 3428, - "4821": 3429, - "4822": 3430, - "4823": 3430, - "4824": 3434, - "4825": 3434, - "4826": 3435, - "4827": 3436, - "4828": 3437, - "4829": 3437, - "4830": 3437, - "4831": 3438, - "4832": 3438, - "4833": 3438, - "4834": 3438, - "4835": 3438, - "4836": 3438, - "4837": 3439, - "4838": 3439, - "4839": 3440, - "4840": 3440, - "4841": 3441, - "4842": 3442, - "4843": 3443, - "4844": 3443, - "4845": 3444, - "4846": 3445, - "4847": 3445, - "4848": 3446, - "4849": 3446, - "4850": 3446, - "4851": 3447, - "4852": 3447, - "4853": 3451, - "4854": 3451, - "4855": 3452, - "4856": 3453, - "4857": 3454, - "4858": 3454, - "4859": 3454, - "4860": 3455, - "4861": 3455, - "4862": 3455, - "4863": 3455, - "4864": 3455, - "4865": 3455, - "4866": 3456, - "4867": 3456, - "4868": 3457, - "4869": 3457, - "4870": 3458, - "4871": 3459, - "4872": 3460, - "4873": 3460, - "4874": 3461, - "4875": 3462, - "4876": 3462, - "4877": 3463, - "4878": 3463, - "4879": 3463, - "4880": 3464, - "4881": 3464, - "4882": 3468, - "4883": 3468, - "4884": 3469, - "4885": 3470, - "4886": 3470, - "4887": 3471, - "4888": 3471, - "4889": 3471, - "4890": 3472, - "4891": 3472, - "4892": 3472, - "4893": 3472, - "4894": 3472, - "4895": 3472, - "4896": 3473, - "4897": 3473, - "4898": 3474, - "4899": 3474, - "4900": 3475, - "4901": 3476, - "4902": 3477, - "4903": 3477, - "4904": 3478, - "4905": 3479, - "4906": 3479, - "4907": 3480, - "4908": 3480, - "4909": 3480, - "4910": 3481, - "4911": 3481, - "4912": 3485, - "4913": 3485, - "4914": 3486, - "4915": 3487, - "4916": 3488, - "4917": 3489, - "4918": 3490, - "4919": 3493, - "4920": 3493, - "4921": 3494, - "4922": 3495, - "4923": 3496, - "4924": 3496, - "4925": 3497, - "4926": 3498, - "4927": 3499, - "4928": 3500, - "4929": 3501, - "4930": 3502, - "4931": 3502, - "4932": 3502, - "4933": 3503, - "4934": 3504, - "4935": 3507, - "4936": 3507, - "4937": 3507, - "4938": 3511, - "4939": 3512, - "4940": 3512, - "4941": 3513, - "4942": 3513, - "4943": 3514, - "4944": 3514, - "4945": 3515, - "4946": 3515, - "4947": 3516, - "4948": 3516, - "4949": 3517, - "4950": 3518, - "4951": 3518, - "4952": 3519, - "4953": 3519, - "4954": 3520, - "4955": 3520, - "4956": 3521, - "4957": 3522, - "4958": 3523, - "4959": 3523, - "4960": 3524, - "4961": 3524, - "4962": 3525, - "4963": 3525, - "4964": 3526, - "4965": 3526, - "4966": 3527, - "4967": 3528, - "4968": 3529, - "4969": 3529, - "4970": 3533, - "4971": 3533, - "4972": 3534, - "4973": 3535, - "4974": 3536, - "4975": 3536, - "4976": 3536, - "4977": 3537, - "4978": 3537, - "4979": 3538, - "4980": 3538, - "4981": 3539, - "4982": 3539, - "4983": 3540, - "4984": 3541, - "4985": 3541, - "4986": 3541, - "4987": 3542, - "4988": 3543, - "4989": 3544, - "4990": 3545, - "4991": 3545, - "4992": 3545, - "4993": 3546, - "4994": 3547, - "4995": 3548, - "4996": 3549, - "4997": 3550, - "4998": 3551, - "4999": 3552, - "5000": 3555, - "5001": 3555, - "5002": 3556, - "5003": 3557, - "5004": 3558, - "5005": 3558, - "5006": 3559, - "5007": 3560, - "5008": 3561, - "5009": 3562, - "5010": 3563, - "5011": 3564, - "5012": 3564, - "5013": 3564, - "5014": 3565, - "5015": 3566, - "5016": 3569, - "5017": 3569, - "5018": 3569, - "5019": 3573, - "5020": 3574, - "5021": 3574, - "5022": 3575, - "5023": 3575, - "5024": 3576, - "5025": 3576, - "5026": 3577, - "5027": 3577, - "5028": 3578, - "5029": 3578, - "5030": 3579, - "5031": 3580, - "5032": 3580, - "5033": 3581, - "5034": 3581, - "5035": 3582, - "5036": 3582, - "5037": 3583, - "5038": 3584, - "5039": 3585, - "5040": 3585, - "5041": 3586, - "5042": 3586, - "5043": 3587, - "5044": 3587, - "5045": 3588, - "5046": 3588, - "5047": 3589, - "5048": 3590, - "5049": 3591, - "5050": 3591, - "5051": 3595, - "5052": 3595, - "5053": 3596, - "5054": 3597, - "5055": 3598, - "5056": 3598, - "5057": 3598, - "5058": 3599, - "5059": 3599, - "5060": 3600, - "5061": 3600, - "5062": 3601, - "5063": 3601, - "5064": 3602, - "5065": 3603, - "5066": 3604, - "5067": 3605, - "5068": 3606, - "5069": 3606, - "5070": 3607, - "5071": 3607, - "5072": 3607, - "5073": 3608, - "5074": 3608, - "5075": 3612, - "5076": 3612, - "5077": 3613, - "5078": 3614, - "5079": 3615, - "5080": 3615, - "5081": 3615, - "5082": 3616, - "5083": 3616, - "5084": 3617, - "5085": 3617, - "5086": 3618, - "5087": 3618, - "5088": 3619, - "5089": 3620, - "5090": 3620, - "5091": 3620, - "5092": 3621, - "5093": 3622, - "5094": 3623, - "5095": 3624, - "5096": 3624, - "5097": 3624, - "5098": 3625, - "5099": 3626, - "5100": 3627, - "5101": 3628, - "5102": 3629, - "5103": 3630, - "5104": 3631, - "5105": 3634, - "5106": 3634, - "5107": 3635, - "5108": 3636, - "5109": 3637, - "5110": 3637, - "5111": 3638, - "5112": 3639, - "5113": 3640, - "5114": 3641, - "5115": 3642, - "5116": 3643, - "5117": 3643, - "5118": 3643, - "5119": 3644, - "5120": 3645, - "5121": 3648, - "5122": 3648, - "5123": 3648, - "5124": 3652, - "5125": 3653, - "5126": 3653, - "5127": 3654, - "5128": 3654, - "5129": 3655, - "5130": 3655, - "5131": 3656, - "5132": 3656, - "5133": 3657, - "5134": 3657, - "5135": 3658, - "5136": 3659, - "5137": 3659, - "5138": 3660, - "5139": 3660, - "5140": 3661, - "5141": 3661, - "5142": 3662, - "5143": 3663, - "5144": 3664, - "5145": 3664, - "5146": 3665, - "5147": 3665, - "5148": 3666, - "5149": 3666, - "5150": 3667, - "5151": 3667, - "5152": 3668, - "5153": 3669, - "5154": 3670, - "5155": 3670, - "5156": 3674, - "5157": 3674, - "5158": 3675, - "5159": 3676, - "5160": 3677, - "5161": 3677, - "5162": 3677, - "5163": 3678, - "5164": 3678, - "5165": 3679, - "5166": 3679, - "5167": 3680, - "5168": 3680, - "5169": 3681, - "5170": 3682, - "5171": 3683, - "5172": 3684, - "5173": 3685, - "5174": 3685, - "5175": 3686, - "5176": 3686, - "5177": 3686, - "5178": 3687, - "5179": 3687, - "5180": 3691, - "5181": 3691, - "5182": 3692, - "5183": 3693, - "5184": 3694, - "5185": 3694, - "5186": 3694, - "5187": 3695, - "5188": 3695, - "5189": 3696, - "5190": 3696, - "5191": 3697, - "5192": 3697, - "5193": 3698, - "5194": 3699, - "5195": 3699, - "5196": 3699, - "5197": 3700, - "5198": 3701, - "5199": 3702, - "5200": 3703, - "5201": 3703, - "5202": 3703, - "5203": 3704, - "5204": 3705, - "5205": 3706, - "5206": 3707, - "5207": 3708, - "5208": 3709, - "5209": 3710, - "5210": 3713, - "5211": 3713, - "5212": 3714, - "5213": 3715, - "5214": 3716, - "5215": 3716, - "5216": 3717, - "5217": 3718, - "5218": 3719, - "5219": 3720, - "5220": 3721, - "5221": 3721, - "5222": 3721, - "5223": 3722, - "5224": 3722, - "5225": 3722, - "5226": 3723, - "5227": 3724, - "5228": 3727, - "5229": 3727, - "5230": 3727, - "5231": 3731, - "5232": 3731, - "5233": 3732, - "5234": 3733, - "5235": 3734, - "5236": 3734, - "5237": 3734, - "5238": 3735, - "5239": 3735, - "5240": 3736, - "5241": 3736, - "5242": 3737, - "5243": 3737, - "5244": 3738, - "5245": 3739, - "5246": 3739, - "5247": 3739, - "5248": 3740, - "5249": 3741, - "5250": 3742, - "5251": 3743, - "5252": 3743, - "5253": 3743, - "5254": 3744, - "5255": 3745, - "5256": 3746, - "5257": 3747, - "5258": 3748, - "5259": 3749, - "5260": 3750, - "5261": 3753, - "5262": 3753, - "5263": 3754, - "5264": 3755, - "5265": 3756, - "5266": 3756, - "5267": 3757, - "5268": 3758, - "5269": 3759, - "5270": 3760, - "5271": 3761, - "5272": 3762, - "5273": 3762, - "5274": 3762, - "5275": 3763, - "5276": 3763, - "5277": 3763, - "5278": 3764, - "5279": 3765, - "5280": 3768, - "5281": 3768, - "5282": 3768, - "5283": 3772, - "5284": 3773, - "5285": 3773, - "5286": 3777, - "5287": 3777, - "5288": 3778, - "5289": 3779, - "5290": 3779, - "5291": 3780, - "5292": 3781, - "5293": 3782, - "5294": 3782, - "5295": 3782, - "5296": 3783, - "5297": 3783, - "5298": 3784, - "5299": 3784, - "5300": 3785, - "5301": 3785, - "5302": 3786, - "5303": 3787, - "5304": 3787, - "5305": 3787, - "5306": 3788, - "5307": 3789, - "5308": 3790, - "5309": 3791, - "5310": 3791, - "5311": 3791, - "5312": 3792, - "5313": 3793, - "5314": 3794, - "5315": 3795, - "5316": 3796, - "5317": 3797, - "5318": 3798, - "5319": 3801, - "5320": 3801, - "5321": 3802, - "5322": 3803, - "5323": 3804, - "5324": 3804, - "5325": 3805, - "5326": 3806, - "5327": 3807, - "5328": 3808, - "5329": 3809, - "5330": 3809, - "5331": 3810, - "5332": 3811, - "5333": 3812, - "5334": 3812, - "5335": 3813, - "5336": 3814, - "5337": 3815, - "5338": 3815, - "5339": 3816, - "5340": 3816, - "5341": 3817, - "5342": 3818, - "5343": 3818, - "5344": 3819, - "5345": 3819, - "5346": 3820, - "5347": 3821, - "5348": 3821, - "5349": 3822, - "5350": 3822, - "5351": 3823, - "5352": 3824, - "5353": 3824, - "5354": 3825, - "5355": 3825, - "5356": 3826, - "5357": 3827, - "5358": 3827, - "5359": 3828, - "5360": 3828, - "5361": 3829, - "5362": 3830, - "5363": 3830, - "5364": 3830, - "5365": 3831, - "5366": 3832, - "5367": 3835, - "5368": 3835, - "5369": 3835, - "5370": 3839, - "5371": 3839, - "5372": 3840, - "5373": 3840, - "5374": 3841, - "5375": 3841, - "5376": 3842, - "5377": 3842, - "5378": 3843, - "5379": 3844, - "5380": 3848, - "5381": 3848, - "5382": 3849, - "5383": 3849, - "5384": 3850, - "5385": 3850, - "5386": 3851, - "5387": 3851, - "5388": 3852, - "5389": 3853, - "5390": 3857, - "5391": 3857, - "5392": 3858, - "5393": 3858, - "5394": 3859, - "5395": 3859, - "5396": 3860, - "5397": 3860, - "5398": 3861, - "5399": 3862, - "5400": 3866, - "5401": 3866, - "5402": 3867, - "5403": 3867, - "5404": 3868, - "5405": 3868, - "5406": 3869, - "5407": 3869, - "5408": 3870, - "5409": 3871, - "5410": 3872, - "5411": 3875, - "5412": 3875, - "5413": 3876, - "5414": 3876, - "5415": 3876, - "5416": 3877, - "5417": 3877, - "5418": 3878, - "5419": 3879, - "5420": 3880, - "5421": 3880, - "5422": 3880, - "5423": 3881, - "5424": 3881, - "5425": 3882, - "5426": 3883, - "5427": 3884, - "5428": 3885, - "5429": 3885, - "5430": 3885, - "5431": 3885, - "5432": 3888, - "5433": 3888, - "5434": 3888, - "5435": 3888, - "5436": 3888, - "5437": 3888, - "5438": 3889, - "5439": 3889, - "5440": 3889, - "5441": 3889, - "5442": 3889, - "5443": 3889, - "5444": 3890, - "5445": 3890, - "5446": 3890, - "5447": 3890, - "5448": 3890, - "5449": 3890, - "5450": 3891, - "5451": 3891, - "5452": 3891, - "5453": 3891, - "5454": 3891, - "5455": 3891, - "5456": 3892, - "5457": 3892, - "5458": 3892, - "5459": 3892, - "5460": 3892, - "5461": 3892, - "5462": 3893, - "5463": 3893, - "5464": 3893, - "5465": 3893, - "5466": 3893, - "5467": 3893, - "5468": 3894, - "5469": 3894, - "5470": 3894, - "5471": 3894, - "5472": 3894, - "5473": 3894, - "5474": 3895, - "5475": 3895, - "5476": 3895, - "5477": 3895, - "5478": 3895, - "5479": 3895, - "5480": 3896, - "5481": 3896, - "5482": 3896, - "5483": 3896, - "5484": 3896, - "5485": 3896, - "5486": 3897, - "5487": 3897, - "5488": 3897, - "5489": 3897, - "5490": 3897, - "5491": 3897, - "5492": 3898, - "5493": 3898, - "5494": 3898, - "5495": 3898, - "5496": 3898, - "5497": 3898, - "5498": 3899, - "5499": 3899, - "5500": 3899, - "5501": 3899, - "5502": 3899, - "5503": 3899, - "5504": 3900, - "5505": 3900, - "5506": 3900, - "5507": 3900, - "5508": 3900, - "5509": 3900, - "5510": 3901, - "5511": 3901, - "5512": 3901, - "5513": 3901, - "5514": 3901, - "5515": 3901, - "5516": 3902, - "5517": 3902, - "5518": 3902, - "5519": 3902, - "5520": 3902, - "5521": 3902, - "5522": 3903, - "5523": 3903, - "5524": 3903, - "5525": 3903, - "5526": 3903, - "5527": 3903, - "5528": 3904, - "5529": 3904, - "5530": 3904, - "5531": 3904, - "5532": 3904, - "5533": 3904, - "5534": 3905, - "5535": 3905, - "5536": 3905, - "5537": 3905, - "5538": 3905, - "5539": 3905, - "5540": 3906, - "5541": 3906, - "5542": 3906, - "5543": 3906, - "5544": 3906, - "5545": 3906, - "5546": 3907, - "5547": 3907, - "5548": 3907, - "5549": 3907, - "5550": 3907, - "5551": 3907, - "5552": 3908, - "5553": 3908, - "5554": 3908, - "5555": 3908, - "5556": 3908, - "5557": 3908, - "5558": 3909, - "5559": 3909, - "5560": 3909, - "5561": 3909, - "5562": 3909, - "5563": 3909, - "5564": 3910, - "5565": 3910, - "5566": 3910, - "5567": 3910, - "5568": 3910, - "5569": 3910, - "5570": 3911, - "5571": 3911, - "5572": 3911, - "5573": 3911, - "5574": 3911, - "5575": 3911, - "5576": 3912, - "5577": 3912, - "5578": 3912, - "5579": 3912, - "5580": 3912, - "5581": 3912, - "5582": 3913, - "5583": 3913, - "5584": 3913, - "5585": 3913, - "5586": 3913, - "5587": 3913, - "5588": 3914, - "5589": 3914, - "5590": 3914, - "5591": 3914, - "5592": 3914, - "5593": 3914, - "5594": 3915, - "5595": 3915, - "5596": 3915, - "5597": 3915, - "5598": 3915, - "5599": 3915, - "5600": 3916, - "5601": 3916, - "5602": 3916, - "5603": 3916, - "5604": 3916, - "5605": 3916, - "5606": 3917, - "5607": 3917, - "5608": 3917, - "5609": 3917, - "5610": 3917, - "5611": 3917, - "5612": 3918, - "5613": 3918, - "5614": 3918, - "5615": 3918, - "5616": 3918, - "5617": 3918, - "5618": 3919, - "5619": 3919, - "5620": 3919, - "5621": 3919, - "5622": 3919, - "5623": 3919, - "5624": 3920, - "5625": 3920, - "5626": 3920, - "5627": 3920, - "5628": 3920, - "5629": 3920, - "5630": 3921, - "5631": 3921, - "5632": 3921, - "5633": 3921, - "5634": 3921, - "5635": 3921, - "5636": 3922, - "5637": 3922, - "5638": 3922, - "5639": 3922, - "5640": 3922, - "5641": 3922, - "5642": 3923, - "5643": 3923, - "5644": 3923, - "5645": 3923, - "5646": 3923, - "5647": 3923, - "5648": 3924, - "5649": 3924, - "5650": 3924, - "5651": 3924, - "5652": 3924, - "5653": 3924, - "5654": 3925, - "5655": 3925, - "5656": 3925, - "5657": 3925, - "5658": 3925, - "5659": 3925, - "5660": 3926, - "5661": 3926, - "5662": 3926, - "5663": 3926, - "5664": 3926, - "5665": 3926, - "5666": 3927, - "5667": 3927, - "5668": 3927, - "5669": 3927, - "5670": 3927, - "5671": 3927, - "5672": 3928, - "5673": 3928, - "5674": 3928, - "5675": 3928, - "5676": 3928, - "5677": 3928, - "5678": 3929, - "5679": 3929, - "5680": 3929, - "5681": 3929, - "5682": 3929, - "5683": 3929, - "5684": 3930, - "5685": 3930, - "5686": 3930, - "5687": 3930, - "5688": 3930, - "5689": 3930, - "5690": 3931, - "5691": 3931, - "5692": 3931, - "5693": 3931, - "5694": 3931, - "5695": 3931, - "5696": 3932, - "5697": 3932, - "5698": 3932, - "5699": 3932, - "5700": 3932, - "5701": 3932, - "5702": 3933, - "5703": 3933, - "5704": 3933, - "5705": 3933, - "5706": 3933, - "5707": 3933, - "5708": 3934, - "5709": 3934, - "5710": 3934, - "5711": 3934, - "5712": 3934, - "5713": 3934, - "5714": 3935, - "5715": 3935, - "5716": 3935, - "5717": 3935, - "5718": 3935, - "5719": 3935, - "5720": 3936, - "5721": 3936, - "5722": 3936, - "5723": 3936, - "5724": 3936, - "5725": 3936, - "5726": 3937, - "5727": 3937, - "5728": 3937, - "5729": 3937, - "5730": 3937, - "5731": 3937, - "5732": 3938, - "5733": 3938, - "5734": 3938, - "5735": 3938, - "5736": 3938, - "5737": 3938, - "5738": 3939, - "5739": 3939, - "5740": 3939, - "5741": 3939, - "5742": 3939, - "5743": 3939, - "5744": 3940, - "5745": 3940, - "5746": 3940, - "5747": 3940, - "5748": 3940, - "5749": 3940, - "5750": 3941, - "5751": 3941, - "5752": 3941, - "5753": 3941, - "5754": 3941, - "5755": 3941, - "5756": 3942, - "5757": 3942, - "5758": 3942, - "5759": 3942, - "5760": 3942, - "5761": 3942, - "5762": 3943, - "5763": 3943, - "5764": 3943, - "5765": 3944 + "132": 1, + "133": 1, + "134": 1, + "135": 4, + "136": 4, + "137": 4, + "138": 5, + "139": 5, + "140": 6, + "141": 6, + "142": 7, + "143": 7, + "144": 8, + "145": 9, + "146": 10, + "147": 11, + "148": 12, + "149": 12, + "150": 13, + "151": 14, + "152": 14, + "153": 15, + "154": 15, + "155": 16, + "156": 16, + "157": 17, + "158": 18, + "159": 18, + "160": 19, + "161": 20, + "162": 20, + "163": 21, + "164": 22, + "165": 23, + "166": 24, + "167": 24, + "168": 25, + "169": 25, + "170": 26, + "171": 27, + "172": 27, + "173": 28, + "174": 29, + "175": 29, + "176": 29, + "177": 30, + "178": 30, + "179": 31, + "180": 32, + "181": 32, + "182": 33, + "183": 34, + "184": 34, + "185": 35, + "186": 35, + "187": 35, + "188": 38, + "189": 38, + "190": 39, + "191": 39, + "192": 40, + "193": 41, + "194": 42, + "195": 42, + "196": 45, + "197": 46, + "198": 49, + "199": 49, + "200": 49, + "201": 50, + "202": 50, + "203": 51, + "204": 51, + "205": 52, + "206": 52, + "207": 53, + "208": 54, + "209": 54, + "210": 55, + "211": 55, + "212": 55, + "213": 56, + "214": 57, + "215": 57, + "216": 57, + "217": 60, + "218": 61, + "219": 64, + "220": 65, + "221": 65, + "222": 65, + "223": 66, + "224": 66, + "225": 67, + "226": 68, + "227": 68, + "228": 69, + "229": 70, + "230": 71, + "231": 71, + "232": 72, + "233": 75, + "234": 75, + "235": 76, + "236": 77, + "237": 78, + "238": 78, + "239": 79, + "240": 80, + "241": 81, + "242": 82, + "243": 83, + "244": 83, + "245": 83, + "246": 84, + "247": 85, + "248": 88, + "249": 88, + "250": 88, + "251": 89, + "252": 92, + "253": 92, + "254": 93, + "255": 94, + "256": 95, + "257": 95, + "258": 96, + "259": 97, + "260": 98, + "261": 99, + "262": 100, + "263": 100, + "264": 100, + "265": 101, + "266": 102, + "267": 105, + "268": 105, + "269": 105, + "270": 106, + "271": 109, + "272": 109, + "273": 110, + "274": 111, + "275": 112, + "276": 112, + "277": 113, + "278": 114, + "279": 115, + "280": 116, + "281": 117, + "282": 118, + "283": 118, + "284": 118, + "285": 119, + "286": 120, + "287": 123, + "288": 123, + "289": 123, + "290": 127, + "291": 127, + "292": 128, + "293": 129, + "294": 129, + "295": 130, + "296": 131, + "297": 132, + "298": 132, + "299": 133, + "300": 134, + "301": 135, + "302": 135, + "303": 139, + "304": 139, + "305": 140, + "306": 141, + "307": 142, + "308": 143, + "309": 144, + "310": 145, + "311": 146, + "312": 147, + "313": 148, + "314": 149, + "315": 150, + "316": 151, + "317": 154, + "318": 154, + "319": 155, + "320": 156, + "321": 157, + "322": 157, + "323": 158, + "324": 159, + "325": 160, + "326": 161, + "327": 162, + "328": 163, + "329": 163, + "330": 163, + "331": 164, + "332": 165, + "333": 168, + "334": 168, + "335": 168, + "336": 172, + "337": 172, + "338": 173, + "339": 174, + "340": 174, + "341": 175, + "342": 176, + "343": 177, + "344": 177, + "345": 178, + "346": 179, + "347": 180, + "348": 180, + "349": 184, + "350": 184, + "351": 185, + "352": 186, + "353": 187, + "354": 188, + "355": 189, + "356": 192, + "357": 192, + "358": 193, + "359": 194, + "360": 195, + "361": 195, + "362": 196, + "363": 197, + "364": 198, + "365": 199, + "366": 200, + "367": 200, + "368": 200, + "369": 201, + "370": 201, + "371": 201, + "372": 202, + "373": 203, + "374": 206, + "375": 206, + "376": 206, + "377": 210, + "378": 210, + "379": 211, + "380": 212, + "381": 213, + "382": 214, + "383": 215, + "384": 216, + "385": 217, + "386": 218, + "387": 219, + "388": 220, + "389": 221, + "390": 222, + "391": 225, + "392": 225, + "393": 226, + "394": 227, + "395": 228, + "396": 228, + "397": 229, + "398": 230, + "399": 231, + "400": 232, + "401": 233, + "402": 234, + "403": 234, + "404": 235, + "405": 235, + "406": 235, + "407": 236, + "408": 237, + "409": 240, + "410": 240, + "411": 240, + "412": 244, + "413": 244, + "414": 245, + "415": 245, + "416": 249, + "417": 249, + "418": 250, + "419": 250, + "420": 254, + "421": 254, + "422": 255, + "423": 255, + "424": 259, + "425": 259, + "426": 260, + "427": 261, + "428": 261, + "429": 262, + "430": 263, + "431": 264, + "432": 264, + "433": 265, + "434": 266, + "435": 267, + "436": 267, + "437": 271, + "438": 271, + "439": 272, + "440": 273, + "441": 274, + "442": 275, + "443": 276, + "444": 277, + "445": 278, + "446": 279, + "447": 280, + "448": 281, + "449": 282, + "450": 283, + "451": 286, + "452": 286, + "453": 287, + "454": 288, + "455": 289, + "456": 289, + "457": 290, + "458": 291, + "459": 292, + "460": 293, + "461": 294, + "462": 295, + "463": 295, + "464": 296, + "465": 296, + "466": 296, + "467": 297, + "468": 298, + "469": 301, + "470": 301, + "471": 301, + "472": 305, + "473": 305, + "474": 306, + "475": 306, + "476": 310, + "477": 310, + "478": 311, + "479": 311, + "480": 315, + "481": 315, + "482": 316, + "483": 316, + "484": 320, + "485": 321, + "486": 322, + "487": 323, + "488": 324, + "489": 325, + "490": 326, + "491": 327, + "492": 328, + "493": 328, + "494": 329, + "495": 330, + "496": 331, + "497": 331, + "498": 332, + "499": 333, + "500": 334, + "501": 334, + "502": 335, + "503": 336, + "504": 337, + "505": 337, + "506": 338, + "507": 339, + "508": 340, + "509": 340, + "510": 341, + "511": 342, + "512": 343, + "513": 344, + "514": 345, + "515": 346, + "516": 346, + "517": 350, + "518": 350, + "519": 351, + "520": 352, + "521": 353, + "522": 354, + "523": 355, + "524": 356, + "525": 357, + "526": 357, + "527": 358, + "528": 358, + "529": 359, + "530": 360, + "531": 361, + "532": 362, + "533": 363, + "534": 364, + "535": 365, + "536": 365, + "537": 366, + "538": 366, + "539": 367, + "540": 368, + "541": 369, + "542": 370, + "543": 371, + "544": 372, + "545": 373, + "546": 374, + "547": 375, + "548": 376, + "549": 377, + "550": 378, + "551": 381, + "552": 381, + "553": 382, + "554": 383, + "555": 384, + "556": 384, + "557": 385, + "558": 386, + "559": 387, + "560": 388, + "561": 389, + "562": 390, + "563": 391, + "564": 391, + "565": 391, + "566": 392, + "567": 393, + "568": 396, + "569": 396, + "570": 396, + "571": 400, + "572": 400, + "573": 401, + "574": 402, + "575": 402, + "576": 403, + "577": 404, + "578": 405, + "579": 405, + "580": 406, + "581": 407, + "582": 408, + "583": 408, + "584": 412, + "585": 413, + "586": 413, + "587": 417, + "588": 417, + "589": 418, + "590": 418, + "591": 419, + "592": 420, + "593": 421, + "594": 422, + "595": 423, + "596": 424, + "597": 425, + "598": 426, + "599": 427, + "600": 428, + "601": 429, + "602": 432, + "603": 432, + "604": 433, + "605": 434, + "606": 435, + "607": 435, + "608": 436, + "609": 437, + "610": 438, + "611": 439, + "612": 440, + "613": 441, + "614": 441, + "615": 441, + "616": 442, + "617": 443, + "618": 446, + "619": 446, + "620": 446, + "621": 450, + "622": 450, + "623": 451, + "624": 452, + "625": 452, + "626": 453, + "627": 454, + "628": 455, + "629": 455, + "630": 456, + "631": 457, + "632": 458, + "633": 458, + "634": 462, + "635": 462, + "636": 463, + "637": 464, + "638": 465, + "639": 466, + "640": 466, + "641": 467, + "642": 468, + "643": 469, + "644": 469, + "645": 473, + "646": 473, + "647": 474, + "648": 475, + "649": 476, + "650": 477, + "651": 478, + "652": 479, + "653": 480, + "654": 481, + "655": 482, + "656": 483, + "657": 484, + "658": 485, + "659": 488, + "660": 488, + "661": 489, + "662": 490, + "663": 491, + "664": 491, + "665": 492, + "666": 493, + "667": 494, + "668": 495, + "669": 496, + "670": 497, + "671": 498, + "672": 498, + "673": 498, + "674": 499, + "675": 500, + "676": 503, + "677": 503, + "678": 503, + "679": 507, + "680": 507, + "681": 508, + "682": 509, + "683": 509, + "684": 510, + "685": 511, + "686": 512, + "687": 512, + "688": 513, + "689": 514, + "690": 515, + "691": 515, + "692": 519, + "693": 519, + "694": 520, + "695": 520, + "696": 521, + "697": 525, + "698": 525, + "699": 526, + "700": 526, + "701": 527, + "702": 527, + "703": 528, + "704": 532, + "705": 532, + "706": 533, + "707": 533, + "708": 534, + "709": 538, + "710": 538, + "711": 539, + "712": 540, + "713": 541, + "714": 542, + "715": 543, + "716": 544, + "717": 545, + "718": 546, + "719": 547, + "720": 547, + "721": 548, + "722": 548, + "723": 549, + "724": 550, + "725": 551, + "726": 552, + "727": 553, + "728": 554, + "729": 555, + "730": 556, + "731": 557, + "732": 558, + "733": 558, + "734": 559, + "735": 560, + "736": 561, + "737": 562, + "738": 563, + "739": 564, + "740": 565, + "741": 566, + "742": 567, + "743": 568, + "744": 569, + "745": 569, + "746": 573, + "747": 573, + "748": 574, + "749": 575, + "750": 576, + "751": 577, + "752": 578, + "753": 581, + "754": 581, + "755": 582, + "756": 583, + "757": 584, + "758": 584, + "759": 585, + "760": 586, + "761": 587, + "762": 588, + "763": 589, + "764": 590, + "765": 591, + "766": 591, + "767": 591, + "768": 592, + "769": 593, + "770": 596, + "771": 596, + "772": 596, + "773": 600, + "774": 600, + "775": 601, + "776": 602, + "777": 602, + "778": 603, + "779": 604, + "780": 605, + "781": 605, + "782": 606, + "783": 607, + "784": 608, + "785": 608, + "786": 612, + "787": 612, + "788": 613, + "789": 613, + "790": 614, + "791": 618, + "792": 618, + "793": 619, + "794": 619, + "795": 620, + "796": 620, + "797": 621, + "798": 625, + "799": 625, + "800": 626, + "801": 626, + "802": 627, + "803": 631, + "804": 631, + "805": 632, + "806": 633, + "807": 634, + "808": 635, + "809": 636, + "810": 636, + "811": 637, + "812": 638, + "813": 639, + "814": 639, + "815": 640, + "816": 641, + "817": 645, + "818": 645, + "819": 646, + "820": 646, + "821": 647, + "822": 648, + "823": 649, + "824": 650, + "825": 651, + "826": 651, + "827": 652, + "828": 653, + "829": 654, + "830": 654, + "831": 655, + "832": 655, + "833": 656, + "834": 656, + "835": 657, + "836": 661, + "837": 661, + "838": 662, + "839": 663, + "840": 664, + "841": 665, + "842": 666, + "843": 667, + "844": 667, + "845": 668, + "846": 669, + "847": 670, + "848": 670, + "849": 671, + "850": 672, + "851": 676, + "852": 676, + "853": 677, + "854": 678, + "855": 679, + "856": 680, + "857": 681, + "858": 682, + "859": 683, + "860": 684, + "861": 685, + "862": 685, + "863": 686, + "864": 686, + "865": 687, + "866": 688, + "867": 689, + "868": 690, + "869": 691, + "870": 692, + "871": 693, + "872": 694, + "873": 695, + "874": 696, + "875": 696, + "876": 697, + "877": 698, + "878": 699, + "879": 700, + "880": 701, + "881": 702, + "882": 703, + "883": 704, + "884": 705, + "885": 706, + "886": 707, + "887": 707, + "888": 711, + "889": 711, + "890": 712, + "891": 713, + "892": 714, + "893": 715, + "894": 716, + "895": 719, + "896": 719, + "897": 720, + "898": 721, + "899": 722, + "900": 722, + "901": 723, + "902": 724, + "903": 725, + "904": 726, + "905": 727, + "906": 728, + "907": 729, + "908": 729, + "909": 729, + "910": 730, + "911": 731, + "912": 734, + "913": 734, + "914": 734, + "915": 738, + "916": 738, + "917": 739, + "918": 740, + "919": 740, + "920": 741, + "921": 742, + "922": 743, + "923": 743, + "924": 744, + "925": 745, + "926": 746, + "927": 746, + "928": 750, + "929": 750, + "930": 751, + "931": 751, + "932": 752, + "933": 756, + "934": 756, + "935": 757, + "936": 757, + "937": 758, + "938": 758, + "939": 759, + "940": 763, + "941": 763, + "942": 764, + "943": 764, + "944": 765, + "945": 769, + "946": 769, + "947": 770, + "948": 771, + "949": 772, + "950": 773, + "951": 774, + "952": 775, + "953": 776, + "954": 777, + "955": 778, + "956": 778, + "957": 779, + "958": 779, + "959": 780, + "960": 781, + "961": 782, + "962": 783, + "963": 784, + "964": 785, + "965": 786, + "966": 787, + "967": 788, + "968": 789, + "969": 789, + "970": 790, + "971": 791, + "972": 792, + "973": 793, + "974": 794, + "975": 795, + "976": 796, + "977": 797, + "978": 798, + "979": 799, + "980": 800, + "981": 800, + "982": 804, + "983": 804, + "984": 805, + "985": 806, + "986": 807, + "987": 808, + "988": 809, + "989": 812, + "990": 812, + "991": 813, + "992": 814, + "993": 815, + "994": 815, + "995": 816, + "996": 817, + "997": 818, + "998": 819, + "999": 820, + "1000": 821, + "1001": 822, + "1002": 822, + "1003": 822, + "1004": 823, + "1005": 824, + "1006": 827, + "1007": 827, + "1008": 827, + "1009": 831, + "1010": 831, + "1011": 832, + "1012": 833, + "1013": 833, + "1014": 834, + "1015": 835, + "1016": 836, + "1017": 836, + "1018": 837, + "1019": 838, + "1020": 839, + "1021": 839, + "1022": 843, + "1023": 843, + "1024": 844, + "1025": 844, + "1026": 845, + "1027": 849, + "1028": 849, + "1029": 850, + "1030": 850, + "1031": 851, + "1032": 851, + "1033": 852, + "1034": 856, + "1035": 856, + "1036": 857, + "1037": 857, + "1038": 858, + "1039": 862, + "1040": 862, + "1041": 863, + "1042": 864, + "1043": 865, + "1044": 866, + "1045": 867, + "1046": 867, + "1047": 867, + "1048": 868, + "1049": 869, + "1050": 870, + "1051": 870, + "1052": 871, + "1053": 872, + "1054": 876, + "1055": 876, + "1056": 877, + "1057": 877, + "1058": 878, + "1059": 879, + "1060": 880, + "1061": 881, + "1062": 882, + "1063": 882, + "1064": 882, + "1065": 883, + "1066": 884, + "1067": 885, + "1068": 885, + "1069": 886, + "1070": 886, + "1071": 887, + "1072": 887, + "1073": 888, + "1074": 892, + "1075": 892, + "1076": 893, + "1077": 894, + "1078": 895, + "1079": 896, + "1080": 897, + "1081": 898, + "1082": 898, + "1083": 898, + "1084": 899, + "1085": 900, + "1086": 901, + "1087": 901, + "1088": 902, + "1089": 903, + "1090": 907, + "1091": 907, + "1092": 908, + "1093": 909, + "1094": 910, + "1095": 911, + "1096": 912, + "1097": 913, + "1098": 914, + "1099": 915, + "1100": 916, + "1101": 916, + "1102": 917, + "1103": 917, + "1104": 918, + "1105": 919, + "1106": 920, + "1107": 921, + "1108": 922, + "1109": 923, + "1110": 924, + "1111": 925, + "1112": 926, + "1113": 927, + "1114": 927, + "1115": 928, + "1116": 929, + "1117": 930, + "1118": 931, + "1119": 932, + "1120": 933, + "1121": 934, + "1122": 935, + "1123": 936, + "1124": 937, + "1125": 938, + "1126": 938, + "1127": 942, + "1128": 942, + "1129": 943, + "1130": 944, + "1131": 945, + "1132": 946, + "1133": 947, + "1134": 950, + "1135": 950, + "1136": 951, + "1137": 952, + "1138": 953, + "1139": 953, + "1140": 954, + "1141": 955, + "1142": 956, + "1143": 957, + "1144": 958, + "1145": 959, + "1146": 959, + "1147": 959, + "1148": 960, + "1149": 961, + "1150": 964, + "1151": 964, + "1152": 964, + "1153": 968, + "1154": 968, + "1155": 969, + "1156": 970, + "1157": 970, + "1158": 971, + "1159": 972, + "1160": 973, + "1161": 973, + "1162": 974, + "1163": 975, + "1164": 976, + "1165": 976, + "1166": 977, + "1167": 978, + "1168": 978, + "1169": 979, + "1170": 980, + "1171": 981, + "1172": 981, + "1173": 982, + "1174": 983, + "1175": 984, + "1176": 985, + "1177": 985, + "1178": 986, + "1179": 987, + "1180": 987, + "1181": 988, + "1182": 989, + "1183": 990, + "1184": 990, + "1185": 991, + "1186": 992, + "1187": 993, + "1188": 994, + "1189": 994, + "1190": 998, + "1191": 998, + "1192": 999, + "1193": 1000, + "1194": 1000, + "1195": 1001, + "1196": 1002, + "1197": 1003, + "1198": 1004, + "1199": 1005, + "1200": 1006, + "1201": 1007, + "1202": 1008, + "1203": 1009, + "1204": 1010, + "1205": 1011, + "1206": 1012, + "1207": 1013, + "1208": 1014, + "1209": 1017, + "1210": 1017, + "1211": 1018, + "1212": 1019, + "1213": 1020, + "1214": 1020, + "1215": 1021, + "1216": 1022, + "1217": 1023, + "1218": 1024, + "1219": 1025, + "1220": 1026, + "1221": 1026, + "1222": 1026, + "1223": 1027, + "1224": 1028, + "1225": 1031, + "1226": 1031, + "1227": 1031, + "1228": 1035, + "1229": 1035, + "1230": 1036, + "1231": 1037, + "1232": 1037, + "1233": 1038, + "1234": 1039, + "1235": 1040, + "1236": 1040, + "1237": 1041, + "1238": 1042, + "1239": 1043, + "1240": 1043, + "1241": 1044, + "1242": 1045, + "1243": 1045, + "1244": 1046, + "1245": 1047, + "1246": 1048, + "1247": 1048, + "1248": 1049, + "1249": 1050, + "1250": 1051, + "1251": 1052, + "1252": 1052, + "1253": 1053, + "1254": 1054, + "1255": 1054, + "1256": 1055, + "1257": 1056, + "1258": 1057, + "1259": 1057, + "1260": 1058, + "1261": 1059, + "1262": 1060, + "1263": 1061, + "1264": 1061, + "1265": 1065, + "1266": 1065, + "1267": 1066, + "1268": 1067, + "1269": 1067, + "1270": 1068, + "1271": 1069, + "1272": 1070, + "1273": 1071, + "1274": 1072, + "1275": 1073, + "1276": 1073, + "1277": 1074, + "1278": 1075, + "1279": 1076, + "1280": 1076, + "1281": 1080, + "1282": 1080, + "1283": 1081, + "1284": 1082, + "1285": 1082, + "1286": 1083, + "1287": 1084, + "1288": 1085, + "1289": 1086, + "1290": 1087, + "1291": 1088, + "1292": 1089, + "1293": 1090, + "1294": 1091, + "1295": 1092, + "1296": 1093, + "1297": 1094, + "1298": 1095, + "1299": 1096, + "1300": 1099, + "1301": 1099, + "1302": 1100, + "1303": 1101, + "1304": 1102, + "1305": 1102, + "1306": 1103, + "1307": 1104, + "1308": 1105, + "1309": 1106, + "1310": 1107, + "1311": 1108, + "1312": 1108, + "1313": 1108, + "1314": 1109, + "1315": 1110, + "1316": 1113, + "1317": 1113, + "1318": 1113, + "1319": 1117, + "1320": 1117, + "1321": 1118, + "1322": 1119, + "1323": 1119, + "1324": 1120, + "1325": 1121, + "1326": 1122, + "1327": 1122, + "1328": 1123, + "1329": 1124, + "1330": 1125, + "1331": 1125, + "1332": 1126, + "1333": 1127, + "1334": 1127, + "1335": 1128, + "1336": 1129, + "1337": 1130, + "1338": 1130, + "1339": 1131, + "1340": 1132, + "1341": 1133, + "1342": 1134, + "1343": 1134, + "1344": 1135, + "1345": 1136, + "1346": 1136, + "1347": 1137, + "1348": 1138, + "1349": 1139, + "1350": 1139, + "1351": 1140, + "1352": 1141, + "1353": 1142, + "1354": 1143, + "1355": 1143, + "1356": 1147, + "1357": 1147, + "1358": 1148, + "1359": 1149, + "1360": 1149, + "1361": 1150, + "1362": 1151, + "1363": 1151, + "1364": 1152, + "1365": 1153, + "1366": 1153, + "1367": 1154, + "1368": 1155, + "1369": 1156, + "1370": 1156, + "1371": 1157, + "1372": 1158, + "1373": 1159, + "1374": 1160, + "1375": 1160, + "1376": 1164, + "1377": 1164, + "1378": 1165, + "1379": 1166, + "1380": 1166, + "1381": 1167, + "1382": 1168, + "1383": 1169, + "1384": 1170, + "1385": 1171, + "1386": 1172, + "1387": 1173, + "1388": 1174, + "1389": 1175, + "1390": 1176, + "1391": 1177, + "1392": 1178, + "1393": 1179, + "1394": 1180, + "1395": 1183, + "1396": 1183, + "1397": 1184, + "1398": 1185, + "1399": 1186, + "1400": 1186, + "1401": 1187, + "1402": 1188, + "1403": 1189, + "1404": 1190, + "1405": 1191, + "1406": 1192, + "1407": 1192, + "1408": 1192, + "1409": 1193, + "1410": 1194, + "1411": 1197, + "1412": 1197, + "1413": 1197, + "1414": 1201, + "1415": 1201, + "1416": 1202, + "1417": 1203, + "1418": 1203, + "1419": 1203, + "1420": 1204, + "1421": 1204, + "1422": 1205, + "1423": 1206, + "1424": 1206, + "1425": 1206, + "1426": 1207, + "1427": 1208, + "1428": 1208, + "1429": 1209, + "1430": 1210, + "1431": 1210, + "1432": 1210, + "1433": 1211, + "1434": 1211, + "1435": 1212, + "1436": 1213, + "1437": 1213, + "1438": 1213, + "1439": 1214, + "1440": 1215, + "1441": 1216, + "1442": 1216, + "1443": 1217, + "1444": 1218, + "1445": 1218, + "1446": 1218, + "1447": 1219, + "1448": 1219, + "1449": 1220, + "1450": 1221, + "1451": 1221, + "1452": 1221, + "1453": 1222, + "1454": 1223, + "1455": 1223, + "1456": 1224, + "1457": 1225, + "1458": 1225, + "1459": 1225, + "1460": 1226, + "1461": 1226, + "1462": 1227, + "1463": 1228, + "1464": 1228, + "1465": 1228, + "1466": 1229, + "1467": 1230, + "1468": 1231, + "1469": 1232, + "1470": 1232, + "1471": 1236, + "1472": 1236, + "1473": 1237, + "1474": 1238, + "1475": 1239, + "1476": 1240, + "1477": 1241, + "1478": 1241, + "1479": 1242, + "1480": 1243, + "1481": 1244, + "1482": 1244, + "1483": 1245, + "1484": 1246, + "1485": 1246, + "1486": 1246, + "1487": 1247, + "1488": 1247, + "1489": 1248, + "1490": 1249, + "1491": 1249, + "1492": 1249, + "1493": 1250, + "1494": 1251, + "1495": 1252, + "1496": 1252, + "1497": 1256, + "1498": 1256, + "1499": 1257, + "1500": 1258, + "1501": 1259, + "1502": 1260, + "1503": 1261, + "1504": 1261, + "1505": 1262, + "1506": 1263, + "1507": 1264, + "1508": 1265, + "1509": 1266, + "1510": 1267, + "1511": 1268, + "1512": 1269, + "1513": 1270, + "1514": 1270, + "1515": 1271, + "1516": 1272, + "1517": 1273, + "1518": 1274, + "1519": 1275, + "1520": 1276, + "1521": 1279, + "1522": 1279, + "1523": 1280, + "1524": 1281, + "1525": 1282, + "1526": 1282, + "1527": 1283, + "1528": 1284, + "1529": 1285, + "1530": 1286, + "1531": 1287, + "1532": 1288, + "1533": 1288, + "1534": 1288, + "1535": 1289, + "1536": 1290, + "1537": 1293, + "1538": 1293, + "1539": 1293, + "1540": 1297, + "1541": 1298, + "1542": 1299, + "1543": 1299, + "1544": 1300, + "1545": 1300, + "1546": 1301, + "1547": 1301, + "1548": 1301, + "1549": 1301, + "1550": 1302, + "1551": 1302, + "1552": 1303, + "1553": 1303, + "1554": 1304, + "1555": 1304, + "1556": 1305, + "1557": 1306, + "1558": 1307, + "1559": 1307, + "1560": 1308, + "1561": 1308, + "1562": 1309, + "1563": 1309, + "1564": 1310, + "1565": 1311, + "1566": 1311, + "1567": 1311, + "1568": 1312, + "1569": 1313, + "1570": 1313, + "1571": 1314, + "1572": 1314, + "1573": 1315, + "1574": 1315, + "1575": 1316, + "1576": 1317, + "1577": 1318, + "1578": 1318, + "1579": 1319, + "1580": 1319, + "1581": 1320, + "1582": 1320, + "1583": 1321, + "1584": 1322, + "1585": 1322, + "1586": 1322, + "1587": 1323, + "1588": 1324, + "1589": 1324, + "1590": 1325, + "1591": 1325, + "1592": 1326, + "1593": 1326, + "1594": 1327, + "1595": 1328, + "1596": 1328, + "1597": 1332, + "1598": 1332, + "1599": 1333, + "1600": 1334, + "1601": 1334, + "1602": 1335, + "1603": 1335, + "1604": 1336, + "1605": 1337, + "1606": 1338, + "1607": 1338, + "1608": 1339, + "1609": 1340, + "1610": 1341, + "1611": 1342, + "1612": 1343, + "1613": 1344, + "1614": 1347, + "1615": 1347, + "1616": 1348, + "1617": 1349, + "1618": 1350, + "1619": 1350, + "1620": 1351, + "1621": 1352, + "1622": 1353, + "1623": 1354, + "1624": 1355, + "1625": 1356, + "1626": 1356, + "1627": 1356, + "1628": 1357, + "1629": 1358, + "1630": 1361, + "1631": 1361, + "1632": 1361, + "1633": 1365, + "1634": 1366, + "1635": 1367, + "1636": 1367, + "1637": 1368, + "1638": 1368, + "1639": 1369, + "1640": 1369, + "1641": 1369, + "1642": 1369, + "1643": 1370, + "1644": 1370, + "1645": 1371, + "1646": 1371, + "1647": 1372, + "1648": 1372, + "1649": 1373, + "1650": 1374, + "1651": 1375, + "1652": 1375, + "1653": 1376, + "1654": 1376, + "1655": 1377, + "1656": 1377, + "1657": 1378, + "1658": 1379, + "1659": 1379, + "1660": 1379, + "1661": 1380, + "1662": 1381, + "1663": 1381, + "1664": 1382, + "1665": 1382, + "1666": 1383, + "1667": 1383, + "1668": 1384, + "1669": 1385, + "1670": 1385, + "1671": 1386, + "1672": 1387, + "1673": 1388, + "1674": 1389, + "1675": 1389, + "1676": 1390, + "1677": 1390, + "1678": 1391, + "1679": 1391, + "1680": 1392, + "1681": 1393, + "1682": 1393, + "1683": 1393, + "1684": 1394, + "1685": 1395, + "1686": 1395, + "1687": 1396, + "1688": 1396, + "1689": 1397, + "1690": 1397, + "1691": 1398, + "1692": 1399, + "1693": 1399, + "1694": 1403, + "1695": 1403, + "1696": 1404, + "1697": 1405, + "1698": 1405, + "1699": 1406, + "1700": 1406, + "1701": 1407, + "1702": 1408, + "1703": 1409, + "1704": 1410, + "1705": 1411, + "1706": 1412, + "1707": 1413, + "1708": 1414, + "1709": 1415, + "1710": 1416, + "1711": 1417, + "1712": 1418, + "1713": 1419, + "1714": 1422, + "1715": 1422, + "1716": 1423, + "1717": 1424, + "1718": 1425, + "1719": 1425, + "1720": 1426, + "1721": 1427, + "1722": 1428, + "1723": 1429, + "1724": 1430, + "1725": 1431, + "1726": 1431, + "1727": 1431, + "1728": 1432, + "1729": 1433, + "1730": 1436, + "1731": 1436, + "1732": 1436, + "1733": 1440, + "1734": 1441, + "1735": 1442, + "1736": 1442, + "1737": 1443, + "1738": 1443, + "1739": 1444, + "1740": 1444, + "1741": 1445, + "1742": 1445, + "1743": 1446, + "1744": 1446, + "1745": 1447, + "1746": 1447, + "1747": 1448, + "1748": 1449, + "1749": 1450, + "1750": 1450, + "1751": 1451, + "1752": 1451, + "1753": 1452, + "1754": 1452, + "1755": 1453, + "1756": 1454, + "1757": 1454, + "1758": 1454, + "1759": 1455, + "1760": 1456, + "1761": 1456, + "1762": 1457, + "1763": 1457, + "1764": 1458, + "1765": 1458, + "1766": 1459, + "1767": 1460, + "1768": 1461, + "1769": 1462, + "1770": 1462, + "1771": 1463, + "1772": 1463, + "1773": 1464, + "1774": 1464, + "1775": 1465, + "1776": 1465, + "1777": 1466, + "1778": 1466, + "1779": 1467, + "1780": 1467, + "1781": 1468, + "1782": 1469, + "1783": 1470, + "1784": 1470, + "1785": 1471, + "1786": 1471, + "1787": 1472, + "1788": 1472, + "1789": 1473, + "1790": 1474, + "1791": 1474, + "1792": 1474, + "1793": 1475, + "1794": 1476, + "1795": 1476, + "1796": 1477, + "1797": 1477, + "1798": 1478, + "1799": 1478, + "1800": 1479, + "1801": 1480, + "1802": 1481, + "1803": 1481, + "1804": 1485, + "1805": 1485, + "1806": 1486, + "1807": 1487, + "1808": 1487, + "1809": 1488, + "1810": 1489, + "1811": 1489, + "1812": 1490, + "1813": 1491, + "1814": 1492, + "1815": 1493, + "1816": 1494, + "1817": 1495, + "1818": 1495, + "1819": 1496, + "1820": 1497, + "1821": 1498, + "1822": 1499, + "1823": 1500, + "1824": 1501, + "1825": 1504, + "1826": 1504, + "1827": 1505, + "1828": 1506, + "1829": 1507, + "1830": 1507, + "1831": 1508, + "1832": 1509, + "1833": 1510, + "1834": 1511, + "1835": 1512, + "1836": 1513, + "1837": 1513, + "1838": 1513, + "1839": 1514, + "1840": 1515, + "1841": 1518, + "1842": 1518, + "1843": 1518, + "1844": 1522, + "1845": 1523, + "1846": 1524, + "1847": 1524, + "1848": 1525, + "1849": 1525, + "1850": 1526, + "1851": 1526, + "1852": 1527, + "1853": 1527, + "1854": 1528, + "1855": 1528, + "1856": 1529, + "1857": 1529, + "1858": 1530, + "1859": 1531, + "1860": 1531, + "1861": 1531, + "1862": 1532, + "1863": 1533, + "1864": 1533, + "1865": 1534, + "1866": 1534, + "1867": 1535, + "1868": 1535, + "1869": 1536, + "1870": 1537, + "1871": 1537, + "1872": 1537, + "1873": 1538, + "1874": 1539, + "1875": 1539, + "1876": 1540, + "1877": 1540, + "1878": 1541, + "1879": 1542, + "1880": 1543, + "1881": 1543, + "1882": 1544, + "1883": 1544, + "1884": 1545, + "1885": 1545, + "1886": 1546, + "1887": 1546, + "1888": 1547, + "1889": 1547, + "1890": 1548, + "1891": 1548, + "1892": 1549, + "1893": 1550, + "1894": 1551, + "1895": 1551, + "1896": 1552, + "1897": 1552, + "1898": 1553, + "1899": 1553, + "1900": 1554, + "1901": 1555, + "1902": 1555, + "1903": 1555, + "1904": 1556, + "1905": 1557, + "1906": 1557, + "1907": 1558, + "1908": 1558, + "1909": 1559, + "1910": 1559, + "1911": 1560, + "1912": 1561, + "1913": 1562, + "1914": 1562, + "1915": 1563, + "1916": 1563, + "1917": 1564, + "1918": 1565, + "1919": 1566, + "1920": 1566, + "1921": 1567, + "1922": 1567, + "1923": 1568, + "1924": 1568, + "1925": 1569, + "1926": 1569, + "1927": 1570, + "1928": 1570, + "1929": 1571, + "1930": 1571, + "1931": 1572, + "1932": 1573, + "1933": 1573, + "1934": 1573, + "1935": 1574, + "1936": 1575, + "1937": 1575, + "1938": 1576, + "1939": 1576, + "1940": 1577, + "1941": 1577, + "1942": 1578, + "1943": 1579, + "1944": 1580, + "1945": 1580, + "1946": 1581, + "1947": 1581, + "1948": 1582, + "1949": 1582, + "1950": 1583, + "1951": 1584, + "1952": 1585, + "1953": 1585, + "1954": 1586, + "1955": 1586, + "1956": 1587, + "1957": 1587, + "1958": 1588, + "1959": 1589, + "1960": 1589, + "1961": 1593, + "1962": 1593, + "1963": 1594, + "1964": 1595, + "1965": 1595, + "1966": 1596, + "1967": 1596, + "1968": 1597, + "1969": 1598, + "1970": 1599, + "1971": 1600, + "1972": 1601, + "1973": 1602, + "1974": 1603, + "1975": 1604, + "1976": 1605, + "1977": 1606, + "1978": 1607, + "1979": 1610, + "1980": 1610, + "1981": 1611, + "1982": 1612, + "1983": 1613, + "1984": 1613, + "1985": 1614, + "1986": 1615, + "1987": 1616, + "1988": 1617, + "1989": 1618, + "1990": 1619, + "1991": 1619, + "1992": 1619, + "1993": 1620, + "1994": 1621, + "1995": 1624, + "1996": 1624, + "1997": 1624, + "1998": 1628, + "1999": 1629, + "2000": 1630, + "2001": 1630, + "2002": 1631, + "2003": 1631, + "2004": 1632, + "2005": 1632, + "2006": 1633, + "2007": 1633, + "2008": 1634, + "2009": 1634, + "2010": 1635, + "2011": 1635, + "2012": 1636, + "2013": 1637, + "2014": 1637, + "2015": 1637, + "2016": 1638, + "2017": 1638, + "2018": 1639, + "2019": 1640, + "2020": 1640, + "2021": 1640, + "2022": 1641, + "2023": 1642, + "2024": 1643, + "2025": 1643, + "2026": 1644, + "2027": 1644, + "2028": 1645, + "2029": 1645, + "2030": 1646, + "2031": 1647, + "2032": 1647, + "2033": 1648, + "2034": 1649, + "2035": 1650, + "2036": 1651, + "2037": 1651, + "2038": 1652, + "2039": 1652, + "2040": 1653, + "2041": 1653, + "2042": 1654, + "2043": 1655, + "2044": 1655, + "2045": 1655, + "2046": 1656, + "2047": 1656, + "2048": 1657, + "2049": 1658, + "2050": 1658, + "2051": 1658, + "2052": 1659, + "2053": 1660, + "2054": 1661, + "2055": 1661, + "2056": 1662, + "2057": 1662, + "2058": 1663, + "2059": 1663, + "2060": 1664, + "2061": 1665, + "2062": 1665, + "2063": 1669, + "2064": 1669, + "2065": 1670, + "2066": 1671, + "2067": 1671, + "2068": 1672, + "2069": 1672, + "2070": 1673, + "2071": 1674, + "2072": 1675, + "2073": 1676, + "2074": 1677, + "2075": 1678, + "2076": 1679, + "2077": 1679, + "2078": 1680, + "2079": 1681, + "2080": 1682, + "2081": 1683, + "2082": 1684, + "2083": 1685, + "2084": 1688, + "2085": 1688, + "2086": 1689, + "2087": 1690, + "2088": 1691, + "2089": 1691, + "2090": 1692, + "2091": 1693, + "2092": 1694, + "2093": 1695, + "2094": 1696, + "2095": 1697, + "2096": 1697, + "2097": 1697, + "2098": 1698, + "2099": 1699, + "2100": 1702, + "2101": 1702, + "2102": 1702, + "2103": 1706, + "2104": 1707, + "2105": 1708, + "2106": 1708, + "2107": 1709, + "2108": 1709, + "2109": 1710, + "2110": 1710, + "2111": 1711, + "2112": 1711, + "2113": 1712, + "2114": 1712, + "2115": 1713, + "2116": 1713, + "2117": 1714, + "2118": 1715, + "2119": 1715, + "2120": 1715, + "2121": 1716, + "2122": 1716, + "2123": 1717, + "2124": 1718, + "2125": 1718, + "2126": 1718, + "2127": 1719, + "2128": 1720, + "2129": 1721, + "2130": 1721, + "2131": 1722, + "2132": 1722, + "2133": 1723, + "2134": 1723, + "2135": 1724, + "2136": 1725, + "2137": 1726, + "2138": 1726, + "2139": 1727, + "2140": 1727, + "2141": 1728, + "2142": 1729, + "2143": 1730, + "2144": 1730, + "2145": 1731, + "2146": 1731, + "2147": 1732, + "2148": 1732, + "2149": 1733, + "2150": 1733, + "2151": 1734, + "2152": 1734, + "2153": 1735, + "2154": 1735, + "2155": 1736, + "2156": 1737, + "2157": 1737, + "2158": 1737, + "2159": 1738, + "2160": 1739, + "2161": 1739, + "2162": 1740, + "2163": 1740, + "2164": 1741, + "2165": 1741, + "2166": 1742, + "2167": 1743, + "2168": 1744, + "2169": 1744, + "2170": 1745, + "2171": 1745, + "2172": 1746, + "2173": 1746, + "2174": 1747, + "2175": 1748, + "2176": 1749, + "2177": 1749, + "2178": 1750, + "2179": 1750, + "2180": 1751, + "2181": 1751, + "2182": 1752, + "2183": 1753, + "2184": 1753, + "2185": 1754, + "2186": 1755, + "2187": 1756, + "2188": 1756, + "2189": 1757, + "2190": 1758, + "2191": 1758, + "2192": 1759, + "2193": 1760, + "2194": 1761, + "2195": 1762, + "2196": 1763, + "2197": 1763, + "2198": 1764, + "2199": 1764, + "2200": 1765, + "2201": 1765, + "2202": 1766, + "2203": 1767, + "2204": 1768, + "2205": 1769, + "2206": 1769, + "2207": 1770, + "2208": 1770, + "2209": 1771, + "2210": 1771, + "2211": 1772, + "2212": 1772, + "2213": 1773, + "2214": 1773, + "2215": 1774, + "2216": 1774, + "2217": 1775, + "2218": 1776, + "2219": 1776, + "2220": 1776, + "2221": 1777, + "2222": 1777, + "2223": 1778, + "2224": 1779, + "2225": 1779, + "2226": 1779, + "2227": 1780, + "2228": 1781, + "2229": 1782, + "2230": 1782, + "2231": 1783, + "2232": 1783, + "2233": 1784, + "2234": 1784, + "2235": 1785, + "2236": 1786, + "2237": 1787, + "2238": 1787, + "2239": 1788, + "2240": 1788, + "2241": 1789, + "2242": 1790, + "2243": 1791, + "2244": 1791, + "2245": 1792, + "2246": 1792, + "2247": 1793, + "2248": 1793, + "2249": 1794, + "2250": 1794, + "2251": 1795, + "2252": 1795, + "2253": 1796, + "2254": 1796, + "2255": 1797, + "2256": 1798, + "2257": 1798, + "2258": 1798, + "2259": 1799, + "2260": 1800, + "2261": 1800, + "2262": 1801, + "2263": 1801, + "2264": 1802, + "2265": 1802, + "2266": 1803, + "2267": 1804, + "2268": 1805, + "2269": 1805, + "2270": 1806, + "2271": 1806, + "2272": 1807, + "2273": 1807, + "2274": 1808, + "2275": 1809, + "2276": 1810, + "2277": 1810, + "2278": 1811, + "2279": 1811, + "2280": 1812, + "2281": 1812, + "2282": 1813, + "2283": 1814, + "2284": 1814, + "2285": 1815, + "2286": 1816, + "2287": 1817, + "2288": 1817, + "2289": 1818, + "2290": 1819, + "2291": 1819, + "2292": 1819, + "2293": 1820, + "2294": 1821, + "2295": 1822, + "2296": 1823, + "2297": 1824, + "2298": 1824, + "2299": 1825, + "2300": 1825, + "2301": 1826, + "2302": 1826, + "2303": 1827, + "2304": 1828, + "2305": 1829, + "2306": 1829, + "2307": 1833, + "2308": 1833, + "2309": 1834, + "2310": 1835, + "2311": 1835, + "2312": 1836, + "2313": 1837, + "2314": 1837, + "2315": 1838, + "2316": 1839, + "2317": 1839, + "2318": 1840, + "2319": 1841, + "2320": 1842, + "2321": 1842, + "2322": 1843, + "2323": 1844, + "2324": 1845, + "2325": 1845, + "2326": 1845, + "2327": 1846, + "2328": 1847, + "2329": 1847, + "2330": 1847, + "2331": 1848, + "2332": 1849, + "2333": 1850, + "2334": 1851, + "2335": 1851, + "2336": 1855, + "2337": 1855, + "2338": 1856, + "2339": 1857, + "2340": 1857, + "2341": 1858, + "2342": 1859, + "2343": 1859, + "2344": 1860, + "2345": 1861, + "2346": 1861, + "2347": 1862, + "2348": 1863, + "2349": 1864, + "2350": 1864, + "2351": 1865, + "2352": 1866, + "2353": 1867, + "2354": 1868, + "2355": 1869, + "2356": 1870, + "2357": 1871, + "2358": 1872, + "2359": 1873, + "2360": 1874, + "2361": 1875, + "2362": 1876, + "2363": 1877, + "2364": 1878, + "2365": 1879, + "2366": 1882, + "2367": 1882, + "2368": 1883, + "2369": 1884, + "2370": 1885, + "2371": 1885, + "2372": 1886, + "2373": 1887, + "2374": 1888, + "2375": 1889, + "2376": 1890, + "2377": 1891, + "2378": 1891, + "2379": 1891, + "2380": 1892, + "2381": 1893, + "2382": 1896, + "2383": 1896, + "2384": 1896, + "2385": 1900, + "2386": 1901, + "2387": 1902, + "2388": 1902, + "2389": 1903, + "2390": 1903, + "2391": 1904, + "2392": 1904, + "2393": 1904, + "2394": 1904, + "2395": 1905, + "2396": 1905, + "2397": 1906, + "2398": 1906, + "2399": 1907, + "2400": 1907, + "2401": 1908, + "2402": 1909, + "2403": 1910, + "2404": 1910, + "2405": 1911, + "2406": 1911, + "2407": 1912, + "2408": 1912, + "2409": 1913, + "2410": 1914, + "2411": 1914, + "2412": 1914, + "2413": 1915, + "2414": 1916, + "2415": 1916, + "2416": 1917, + "2417": 1917, + "2418": 1918, + "2419": 1918, + "2420": 1919, + "2421": 1920, + "2422": 1921, + "2423": 1921, + "2424": 1922, + "2425": 1922, + "2426": 1923, + "2427": 1923, + "2428": 1924, + "2429": 1925, + "2430": 1925, + "2431": 1929, + "2432": 1929, + "2433": 1930, + "2434": 1931, + "2435": 1932, + "2436": 1933, + "2437": 1934, + "2438": 1937, + "2439": 1937, + "2440": 1938, + "2441": 1939, + "2442": 1940, + "2443": 1940, + "2444": 1941, + "2445": 1942, + "2446": 1943, + "2447": 1944, + "2448": 1945, + "2449": 1945, + "2450": 1945, + "2451": 1946, + "2452": 1946, + "2453": 1946, + "2454": 1947, + "2455": 1948, + "2456": 1951, + "2457": 1951, + "2458": 1951, + "2459": 1955, + "2460": 1955, + "2461": 1956, + "2462": 1957, + "2463": 1957, + "2464": 1958, + "2465": 1959, + "2466": 1960, + "2467": 1961, + "2468": 1961, + "2469": 1962, + "2470": 1963, + "2471": 1964, + "2472": 1965, + "2473": 1966, + "2474": 1967, + "2475": 1970, + "2476": 1970, + "2477": 1971, + "2478": 1972, + "2479": 1973, + "2480": 1973, + "2481": 1974, + "2482": 1975, + "2483": 1976, + "2484": 1977, + "2485": 1978, + "2486": 1979, + "2487": 1979, + "2488": 1979, + "2489": 1980, + "2490": 1981, + "2491": 1984, + "2492": 1984, + "2493": 1984, + "2494": 1988, + "2495": 1988, + "2496": 1989, + "2497": 1990, + "2498": 1990, + "2499": 1991, + "2500": 1992, + "2501": 1993, + "2502": 1993, + "2503": 1994, + "2504": 1995, + "2505": 1996, + "2506": 1996, + "2507": 1997, + "2508": 1998, + "2509": 1999, + "2510": 1999, + "2511": 2003, + "2512": 2003, + "2513": 2004, + "2514": 2005, + "2515": 2006, + "2516": 2007, + "2517": 2008, + "2518": 2009, + "2519": 2010, + "2520": 2011, + "2521": 2012, + "2522": 2013, + "2523": 2014, + "2524": 2015, + "2525": 2016, + "2526": 2017, + "2527": 2020, + "2528": 2020, + "2529": 2021, + "2530": 2022, + "2531": 2023, + "2532": 2023, + "2533": 2024, + "2534": 2025, + "2535": 2026, + "2536": 2027, + "2537": 2028, + "2538": 2029, + "2539": 2029, + "2540": 2029, + "2541": 2030, + "2542": 2031, + "2543": 2034, + "2544": 2034, + "2545": 2034, + "2546": 2038, + "2547": 2038, + "2548": 2039, + "2549": 2040, + "2550": 2040, + "2551": 2041, + "2552": 2042, + "2553": 2043, + "2554": 2043, + "2555": 2044, + "2556": 2045, + "2557": 2046, + "2558": 2046, + "2559": 2047, + "2560": 2048, + "2561": 2049, + "2562": 2049, + "2563": 2053, + "2564": 2053, + "2565": 2054, + "2566": 2055, + "2567": 2056, + "2568": 2057, + "2569": 2058, + "2570": 2061, + "2571": 2061, + "2572": 2062, + "2573": 2063, + "2574": 2064, + "2575": 2064, + "2576": 2065, + "2577": 2066, + "2578": 2067, + "2579": 2068, + "2580": 2069, + "2581": 2069, + "2582": 2069, + "2583": 2070, + "2584": 2070, + "2585": 2070, + "2586": 2071, + "2587": 2072, + "2588": 2075, + "2589": 2075, + "2590": 2075, + "2591": 2079, + "2592": 2079, + "2593": 2080, + "2594": 2081, + "2595": 2082, + "2596": 2083, + "2597": 2084, + "2598": 2085, + "2599": 2086, + "2600": 2087, + "2601": 2088, + "2602": 2089, + "2603": 2090, + "2604": 2091, + "2605": 2092, + "2606": 2093, + "2607": 2096, + "2608": 2096, + "2609": 2097, + "2610": 2098, + "2611": 2099, + "2612": 2099, + "2613": 2100, + "2614": 2101, + "2615": 2102, + "2616": 2103, + "2617": 2104, + "2618": 2105, + "2619": 2105, + "2620": 2105, + "2621": 2106, + "2622": 2107, + "2623": 2110, + "2624": 2110, + "2625": 2110, + "2626": 2114, + "2627": 2114, + "2628": 2115, + "2629": 2116, + "2630": 2116, + "2631": 2117, + "2632": 2118, + "2633": 2119, + "2634": 2119, + "2635": 2120, + "2636": 2121, + "2637": 2122, + "2638": 2122, + "2639": 2123, + "2640": 2124, + "2641": 2125, + "2642": 2125, + "2643": 2129, + "2644": 2129, + "2645": 2130, + "2646": 2131, + "2647": 2132, + "2648": 2133, + "2649": 2134, + "2650": 2135, + "2651": 2135, + "2652": 2136, + "2653": 2137, + "2654": 2138, + "2655": 2138, + "2656": 2142, + "2657": 2142, + "2658": 2143, + "2659": 2144, + "2660": 2145, + "2661": 2146, + "2662": 2147, + "2663": 2148, + "2664": 2149, + "2665": 2150, + "2666": 2151, + "2667": 2152, + "2668": 2153, + "2669": 2154, + "2670": 2155, + "2671": 2156, + "2672": 2159, + "2673": 2159, + "2674": 2160, + "2675": 2161, + "2676": 2162, + "2677": 2162, + "2678": 2163, + "2679": 2164, + "2680": 2165, + "2681": 2166, + "2682": 2167, + "2683": 2168, + "2684": 2168, + "2685": 2168, + "2686": 2169, + "2687": 2170, + "2688": 2173, + "2689": 2173, + "2690": 2173, + "2691": 2177, + "2692": 2178, + "2693": 2179, + "2694": 2179, + "2695": 2180, + "2696": 2180, + "2697": 2181, + "2698": 2181, + "2699": 2182, + "2700": 2182, + "2701": 2183, + "2702": 2183, + "2703": 2184, + "2704": 2184, + "2705": 2185, + "2706": 2186, + "2707": 2186, + "2708": 2186, + "2709": 2187, + "2710": 2188, + "2711": 2188, + "2712": 2189, + "2713": 2189, + "2714": 2190, + "2715": 2190, + "2716": 2191, + "2717": 2192, + "2718": 2193, + "2719": 2193, + "2720": 2194, + "2721": 2194, + "2722": 2195, + "2723": 2195, + "2724": 2196, + "2725": 2197, + "2726": 2198, + "2727": 2199, + "2728": 2199, + "2729": 2200, + "2730": 2200, + "2731": 2201, + "2732": 2201, + "2733": 2202, + "2734": 2202, + "2735": 2203, + "2736": 2203, + "2737": 2204, + "2738": 2204, + "2739": 2205, + "2740": 2206, + "2741": 2206, + "2742": 2206, + "2743": 2207, + "2744": 2208, + "2745": 2208, + "2746": 2209, + "2747": 2209, + "2748": 2210, + "2749": 2210, + "2750": 2211, + "2751": 2212, + "2752": 2213, + "2753": 2213, + "2754": 2214, + "2755": 2214, + "2756": 2215, + "2757": 2215, + "2758": 2216, + "2759": 2217, + "2760": 2218, + "2761": 2219, + "2762": 2220, + "2763": 2221, + "2764": 2221, + "2765": 2225, + "2766": 2225, + "2767": 2226, + "2768": 2227, + "2769": 2227, + "2770": 2228, + "2771": 2229, + "2772": 2229, + "2773": 2230, + "2774": 2231, + "2775": 2232, + "2776": 2233, + "2777": 2234, + "2778": 2235, + "2779": 2236, + "2780": 2237, + "2781": 2238, + "2782": 2239, + "2783": 2240, + "2784": 2241, + "2785": 2242, + "2786": 2243, + "2787": 2246, + "2788": 2246, + "2789": 2247, + "2790": 2248, + "2791": 2249, + "2792": 2249, + "2793": 2250, + "2794": 2251, + "2795": 2252, + "2796": 2253, + "2797": 2254, + "2798": 2255, + "2799": 2255, + "2800": 2255, + "2801": 2256, + "2802": 2257, + "2803": 2260, + "2804": 2260, + "2805": 2260, + "2806": 2264, + "2807": 2265, + "2808": 2266, + "2809": 2266, + "2810": 2267, + "2811": 2267, + "2812": 2268, + "2813": 2268, + "2814": 2268, + "2815": 2268, + "2816": 2269, + "2817": 2269, + "2818": 2270, + "2819": 2270, + "2820": 2271, + "2821": 2272, + "2822": 2273, + "2823": 2274, + "2824": 2274, + "2825": 2275, + "2826": 2275, + "2827": 2276, + "2828": 2277, + "2829": 2278, + "2830": 2278, + "2831": 2278, + "2832": 2279, + "2833": 2280, + "2834": 2280, + "2835": 2281, + "2836": 2281, + "2837": 2282, + "2838": 2282, + "2839": 2283, + "2840": 2284, + "2841": 2284, + "2842": 2285, + "2843": 2285, + "2844": 2286, + "2845": 2287, + "2846": 2287, + "2847": 2288, + "2848": 2289, + "2849": 2290, + "2850": 2291, + "2851": 2292, + "2852": 2293, + "2853": 2294, + "2854": 2295, + "2855": 2295, + "2856": 2296, + "2857": 2297, + "2858": 2298, + "2859": 2299, + "2860": 2299, + "2861": 2299, + "2862": 2300, + "2863": 2300, + "2864": 2301, + "2865": 2301, + "2866": 2302, + "2867": 2303, + "2868": 2304, + "2869": 2304, + "2870": 2305, + "2871": 2305, + "2872": 2306, + "2873": 2306, + "2874": 2307, + "2875": 2308, + "2876": 2308, + "2877": 2309, + "2878": 2309, + "2879": 2310, + "2880": 2311, + "2881": 2311, + "2882": 2311, + "2883": 2312, + "2884": 2312, + "2885": 2313, + "2886": 2314, + "2887": 2314, + "2888": 2314, + "2889": 2315, + "2890": 2316, + "2891": 2317, + "2892": 2318, + "2893": 2319, + "2894": 2320, + "2895": 2321, + "2896": 2321, + "2897": 2322, + "2898": 2323, + "2899": 2324, + "2900": 2325, + "2901": 2325, + "2902": 2325, + "2903": 2326, + "2904": 2326, + "2905": 2327, + "2906": 2327, + "2907": 2328, + "2908": 2329, + "2909": 2330, + "2910": 2330, + "2911": 2331, + "2912": 2331, + "2913": 2332, + "2914": 2332, + "2915": 2333, + "2916": 2334, + "2917": 2334, + "2918": 2338, + "2919": 2338, + "2920": 2339, + "2921": 2340, + "2922": 2341, + "2923": 2342, + "2924": 2343, + "2925": 2346, + "2926": 2346, + "2927": 2347, + "2928": 2348, + "2929": 2349, + "2930": 2349, + "2931": 2350, + "2932": 2351, + "2933": 2352, + "2934": 2353, + "2935": 2354, + "2936": 2355, + "2937": 2355, + "2938": 2355, + "2939": 2356, + "2940": 2357, + "2941": 2360, + "2942": 2360, + "2943": 2360, + "2944": 2364, + "2945": 2365, + "2946": 2366, + "2947": 2366, + "2948": 2367, + "2949": 2367, + "2950": 2368, + "2951": 2368, + "2952": 2369, + "2953": 2369, + "2954": 2370, + "2955": 2370, + "2956": 2371, + "2957": 2372, + "2958": 2373, + "2959": 2373, + "2960": 2373, + "2961": 2374, + "2962": 2375, + "2963": 2375, + "2964": 2376, + "2965": 2376, + "2966": 2377, + "2967": 2378, + "2968": 2379, + "2969": 2379, + "2970": 2379, + "2971": 2380, + "2972": 2381, + "2973": 2381, + "2974": 2382, + "2975": 2382, + "2976": 2383, + "2977": 2383, + "2978": 2384, + "2979": 2385, + "2980": 2385, + "2981": 2386, + "2982": 2386, + "2983": 2387, + "2984": 2388, + "2985": 2388, + "2986": 2388, + "2987": 2389, + "2988": 2389, + "2989": 2390, + "2990": 2391, + "2991": 2391, + "2992": 2391, + "2993": 2392, + "2994": 2393, + "2995": 2394, + "2996": 2395, + "2997": 2396, + "2998": 2397, + "2999": 2398, + "3000": 2398, + "3001": 2399, + "3002": 2400, + "3003": 2401, + "3004": 2402, + "3005": 2402, + "3006": 2402, + "3007": 2403, + "3008": 2403, + "3009": 2404, + "3010": 2404, + "3011": 2405, + "3012": 2406, + "3013": 2407, + "3014": 2407, + "3015": 2408, + "3016": 2408, + "3017": 2409, + "3018": 2409, + "3019": 2410, + "3020": 2411, + "3021": 2411, + "3022": 2412, + "3023": 2412, + "3024": 2413, + "3025": 2414, + "3026": 2414, + "3027": 2414, + "3028": 2415, + "3029": 2415, + "3030": 2416, + "3031": 2417, + "3032": 2417, + "3033": 2417, + "3034": 2418, + "3035": 2419, + "3036": 2420, + "3037": 2421, + "3038": 2422, + "3039": 2423, + "3040": 2424, + "3041": 2424, + "3042": 2425, + "3043": 2426, + "3044": 2427, + "3045": 2428, + "3046": 2428, + "3047": 2428, + "3048": 2429, + "3049": 2429, + "3050": 2430, + "3051": 2430, + "3052": 2431, + "3053": 2432, + "3054": 2433, + "3055": 2433, + "3056": 2434, + "3057": 2434, + "3058": 2435, + "3059": 2435, + "3060": 2436, + "3061": 2437, + "3062": 2437, + "3063": 2438, + "3064": 2438, + "3065": 2439, + "3066": 2440, + "3067": 2440, + "3068": 2440, + "3069": 2441, + "3070": 2442, + "3071": 2443, + "3072": 2443, + "3073": 2443, + "3074": 2444, + "3075": 2445, + "3076": 2446, + "3077": 2447, + "3078": 2448, + "3079": 2449, + "3080": 2450, + "3081": 2450, + "3082": 2451, + "3083": 2452, + "3084": 2453, + "3085": 2454, + "3086": 2454, + "3087": 2454, + "3088": 2455, + "3089": 2455, + "3090": 2456, + "3091": 2456, + "3092": 2457, + "3093": 2458, + "3094": 2459, + "3095": 2459, + "3096": 2460, + "3097": 2460, + "3098": 2461, + "3099": 2461, + "3100": 2462, + "3101": 2463, + "3102": 2463, + "3103": 2467, + "3104": 2467, + "3105": 2468, + "3106": 2469, + "3107": 2469, + "3108": 2470, + "3109": 2470, + "3110": 2471, + "3111": 2472, + "3112": 2472, + "3113": 2473, + "3114": 2473, + "3115": 2474, + "3116": 2475, + "3117": 2476, + "3118": 2477, + "3119": 2478, + "3120": 2478, + "3121": 2479, + "3122": 2480, + "3123": 2481, + "3124": 2482, + "3125": 2483, + "3126": 2484, + "3127": 2485, + "3128": 2486, + "3129": 2487, + "3130": 2488, + "3131": 2489, + "3132": 2490, + "3133": 2491, + "3134": 2494, + "3135": 2494, + "3136": 2495, + "3137": 2496, + "3138": 2497, + "3139": 2497, + "3140": 2498, + "3141": 2499, + "3142": 2500, + "3143": 2501, + "3144": 2502, + "3145": 2503, + "3146": 2503, + "3147": 2503, + "3148": 2504, + "3149": 2505, + "3150": 2508, + "3151": 2508, + "3152": 2508, + "3153": 2512, + "3154": 2513, + "3155": 2514, + "3156": 2514, + "3157": 2515, + "3158": 2515, + "3159": 2516, + "3160": 2516, + "3161": 2517, + "3162": 2517, + "3163": 2518, + "3164": 2518, + "3165": 2519, + "3166": 2519, + "3167": 2520, + "3168": 2521, + "3169": 2521, + "3170": 2521, + "3171": 2522, + "3172": 2523, + "3173": 2523, + "3174": 2524, + "3175": 2524, + "3176": 2525, + "3177": 2525, + "3178": 2526, + "3179": 2527, + "3180": 2527, + "3181": 2528, + "3182": 2529, + "3183": 2530, + "3184": 2530, + "3185": 2530, + "3186": 2531, + "3187": 2532, + "3188": 2533, + "3189": 2534, + "3190": 2535, + "3191": 2536, + "3192": 2536, + "3193": 2537, + "3194": 2538, + "3195": 2539, + "3196": 2540, + "3197": 2540, + "3198": 2540, + "3199": 2541, + "3200": 2541, + "3201": 2542, + "3202": 2542, + "3203": 2543, + "3204": 2544, + "3205": 2545, + "3206": 2545, + "3207": 2546, + "3208": 2546, + "3209": 2547, + "3210": 2547, + "3211": 2548, + "3212": 2549, + "3213": 2549, + "3214": 2550, + "3215": 2550, + "3216": 2551, + "3217": 2552, + "3218": 2552, + "3219": 2552, + "3220": 2553, + "3221": 2554, + "3222": 2555, + "3223": 2556, + "3224": 2557, + "3225": 2558, + "3226": 2558, + "3227": 2559, + "3228": 2560, + "3229": 2561, + "3230": 2562, + "3231": 2562, + "3232": 2562, + "3233": 2563, + "3234": 2563, + "3235": 2564, + "3236": 2564, + "3237": 2565, + "3238": 2566, + "3239": 2567, + "3240": 2567, + "3241": 2568, + "3242": 2568, + "3243": 2569, + "3244": 2569, + "3245": 2570, + "3246": 2571, + "3247": 2571, + "3248": 2572, + "3249": 2572, + "3250": 2573, + "3251": 2574, + "3252": 2574, + "3253": 2574, + "3254": 2575, + "3255": 2576, + "3256": 2577, + "3257": 2578, + "3258": 2579, + "3259": 2580, + "3260": 2580, + "3261": 2581, + "3262": 2582, + "3263": 2583, + "3264": 2584, + "3265": 2584, + "3266": 2584, + "3267": 2585, + "3268": 2585, + "3269": 2586, + "3270": 2586, + "3271": 2587, + "3272": 2588, + "3273": 2589, + "3274": 2589, + "3275": 2590, + "3276": 2590, + "3277": 2591, + "3278": 2591, + "3279": 2592, + "3280": 2593, + "3281": 2593, + "3282": 2594, + "3283": 2594, + "3284": 2595, + "3285": 2596, + "3286": 2596, + "3287": 2596, + "3288": 2597, + "3289": 2598, + "3290": 2599, + "3291": 2600, + "3292": 2601, + "3293": 2602, + "3294": 2602, + "3295": 2603, + "3296": 2604, + "3297": 2605, + "3298": 2606, + "3299": 2606, + "3300": 2606, + "3301": 2607, + "3302": 2607, + "3303": 2608, + "3304": 2608, + "3305": 2609, + "3306": 2610, + "3307": 2611, + "3308": 2611, + "3309": 2612, + "3310": 2612, + "3311": 2613, + "3312": 2613, + "3313": 2614, + "3314": 2615, + "3315": 2615, + "3316": 2619, + "3317": 2619, + "3318": 2620, + "3319": 2621, + "3320": 2621, + "3321": 2622, + "3322": 2623, + "3323": 2623, + "3324": 2624, + "3325": 2625, + "3326": 2625, + "3327": 2625, + "3328": 2626, + "3329": 2627, + "3330": 2627, + "3331": 2631, + "3332": 2631, + "3333": 2632, + "3334": 2633, + "3335": 2633, + "3336": 2634, + "3337": 2635, + "3338": 2636, + "3339": 2636, + "3340": 2637, + "3341": 2637, + "3342": 2638, + "3343": 2639, + "3344": 2640, + "3345": 2641, + "3346": 2642, + "3347": 2642, + "3348": 2643, + "3349": 2644, + "3350": 2645, + "3351": 2646, + "3352": 2647, + "3353": 2648, + "3354": 2649, + "3355": 2650, + "3356": 2651, + "3357": 2651, + "3358": 2652, + "3359": 2652, + "3360": 2653, + "3361": 2654, + "3362": 2654, + "3363": 2655, + "3364": 2656, + "3365": 2656, + "3366": 2656, + "3367": 2657, + "3368": 2657, + "3369": 2658, + "3370": 2659, + "3371": 2659, + "3372": 2659, + "3373": 2660, + "3374": 2661, + "3375": 2662, + "3376": 2663, + "3377": 2664, + "3378": 2665, + "3379": 2665, + "3380": 2665, + "3381": 2666, + "3382": 2667, + "3383": 2667, + "3384": 2668, + "3385": 2668, + "3386": 2668, + "3387": 2669, + "3388": 2670, + "3389": 2670, + "3390": 2671, + "3391": 2671, + "3392": 2671, + "3393": 2672, + "3394": 2673, + "3395": 2673, + "3396": 2674, + "3397": 2674, + "3398": 2674, + "3399": 2675, + "3400": 2676, + "3401": 2676, + "3402": 2677, + "3403": 2677, + "3404": 2681, + "3405": 2681, + "3406": 2682, + "3407": 2683, + "3408": 2683, + "3409": 2684, + "3410": 2684, + "3411": 2685, + "3412": 2686, + "3413": 2686, + "3414": 2687, + "3415": 2687, + "3416": 2688, + "3417": 2689, + "3418": 2690, + "3419": 2691, + "3420": 2692, + "3421": 2692, + "3422": 2693, + "3423": 2694, + "3424": 2695, + "3425": 2696, + "3426": 2697, + "3427": 2698, + "3428": 2699, + "3429": 2700, + "3430": 2701, + "3431": 2701, + "3432": 2702, + "3433": 2702, + "3434": 2703, + "3435": 2704, + "3436": 2704, + "3437": 2705, + "3438": 2706, + "3439": 2706, + "3440": 2706, + "3441": 2707, + "3442": 2707, + "3443": 2708, + "3444": 2709, + "3445": 2709, + "3446": 2709, + "3447": 2710, + "3448": 2711, + "3449": 2712, + "3450": 2713, + "3451": 2714, + "3452": 2714, + "3453": 2715, + "3454": 2715, + "3455": 2715, + "3456": 2716, + "3457": 2717, + "3458": 2717, + "3459": 2718, + "3460": 2718, + "3461": 2718, + "3462": 2719, + "3463": 2720, + "3464": 2720, + "3465": 2721, + "3466": 2721, + "3467": 2721, + "3468": 2722, + "3469": 2723, + "3470": 2723, + "3471": 2724, + "3472": 2724, + "3473": 2728, + "3474": 2728, + "3475": 2729, + "3476": 2730, + "3477": 2730, + "3478": 2731, + "3479": 2731, + "3480": 2732, + "3481": 2733, + "3482": 2733, + "3483": 2734, + "3484": 2734, + "3485": 2735, + "3486": 2736, + "3487": 2737, + "3488": 2738, + "3489": 2739, + "3490": 2739, + "3491": 2740, + "3492": 2741, + "3493": 2742, + "3494": 2743, + "3495": 2744, + "3496": 2745, + "3497": 2746, + "3498": 2747, + "3499": 2748, + "3500": 2748, + "3501": 2749, + "3502": 2749, + "3503": 2750, + "3504": 2751, + "3505": 2751, + "3506": 2752, + "3507": 2753, + "3508": 2753, + "3509": 2753, + "3510": 2754, + "3511": 2754, + "3512": 2755, + "3513": 2756, + "3514": 2756, + "3515": 2756, + "3516": 2757, + "3517": 2758, + "3518": 2759, + "3519": 2760, + "3520": 2761, + "3521": 2761, + "3522": 2762, + "3523": 2762, + "3524": 2762, + "3525": 2763, + "3526": 2764, + "3527": 2764, + "3528": 2765, + "3529": 2765, + "3530": 2765, + "3531": 2766, + "3532": 2767, + "3533": 2767, + "3534": 2768, + "3535": 2768, + "3536": 2772, + "3537": 2772, + "3538": 2773, + "3539": 2774, + "3540": 2774, + "3541": 2775, + "3542": 2775, + "3543": 2776, + "3544": 2777, + "3545": 2777, + "3546": 2778, + "3547": 2778, + "3548": 2779, + "3549": 2780, + "3550": 2781, + "3551": 2782, + "3552": 2783, + "3553": 2783, + "3554": 2784, + "3555": 2785, + "3556": 2786, + "3557": 2787, + "3558": 2788, + "3559": 2789, + "3560": 2790, + "3561": 2791, + "3562": 2792, + "3563": 2792, + "3564": 2793, + "3565": 2793, + "3566": 2794, + "3567": 2795, + "3568": 2795, + "3569": 2796, + "3570": 2797, + "3571": 2797, + "3572": 2797, + "3573": 2798, + "3574": 2798, + "3575": 2799, + "3576": 2800, + "3577": 2800, + "3578": 2800, + "3579": 2801, + "3580": 2802, + "3581": 2803, + "3582": 2804, + "3583": 2805, + "3584": 2805, + "3585": 2806, + "3586": 2806, + "3587": 2806, + "3588": 2807, + "3589": 2808, + "3590": 2808, + "3591": 2809, + "3592": 2809, + "3593": 2813, + "3594": 2813, + "3595": 2814, + "3596": 2815, + "3597": 2816, + "3598": 2817, + "3599": 2818, + "3600": 2821, + "3601": 2821, + "3602": 2822, + "3603": 2823, + "3604": 2824, + "3605": 2824, + "3606": 2825, + "3607": 2826, + "3608": 2827, + "3609": 2828, + "3610": 2829, + "3611": 2830, + "3612": 2831, + "3613": 2831, + "3614": 2831, + "3615": 2832, + "3616": 2833, + "3617": 2836, + "3618": 2836, + "3619": 2836, + "3620": 2840, + "3621": 2840, + "3622": 2841, + "3623": 2842, + "3624": 2842, + "3625": 2842, + "3626": 2843, + "3627": 2843, + "3628": 2844, + "3629": 2845, + "3630": 2845, + "3631": 2845, + "3632": 2846, + "3633": 2847, + "3634": 2848, + "3635": 2849, + "3636": 2850, + "3637": 2850, + "3638": 2854, + "3639": 2855, + "3640": 2856, + "3641": 2856, + "3642": 2857, + "3643": 2857, + "3644": 2858, + "3645": 2858, + "3646": 2859, + "3647": 2859, + "3648": 2860, + "3649": 2860, + "3650": 2861, + "3651": 2862, + "3652": 2863, + "3653": 2863, + "3654": 2863, + "3655": 2864, + "3656": 2865, + "3657": 2865, + "3658": 2866, + "3659": 2866, + "3660": 2867, + "3661": 2868, + "3662": 2869, + "3663": 2869, + "3664": 2869, + "3665": 2870, + "3666": 2871, + "3667": 2871, + "3668": 2872, + "3669": 2872, + "3670": 2873, + "3671": 2873, + "3672": 2874, + "3673": 2875, + "3674": 2875, + "3675": 2876, + "3676": 2876, + "3677": 2877, + "3678": 2878, + "3679": 2878, + "3680": 2878, + "3681": 2879, + "3682": 2879, + "3683": 2880, + "3684": 2881, + "3685": 2881, + "3686": 2881, + "3687": 2882, + "3688": 2883, + "3689": 2884, + "3690": 2885, + "3691": 2886, + "3692": 2887, + "3693": 2888, + "3694": 2888, + "3695": 2889, + "3696": 2890, + "3697": 2891, + "3698": 2892, + "3699": 2892, + "3700": 2892, + "3701": 2893, + "3702": 2893, + "3703": 2894, + "3704": 2894, + "3705": 2895, + "3706": 2896, + "3707": 2897, + "3708": 2897, + "3709": 2898, + "3710": 2898, + "3711": 2899, + "3712": 2899, + "3713": 2900, + "3714": 2901, + "3715": 2901, + "3716": 2902, + "3717": 2902, + "3718": 2903, + "3719": 2904, + "3720": 2905, + "3721": 2905, + "3722": 2906, + "3723": 2907, + "3724": 2908, + "3725": 2909, + "3726": 2909, + "3727": 2909, + "3728": 2910, + "3729": 2910, + "3730": 2911, + "3731": 2911, + "3732": 2912, + "3733": 2913, + "3734": 2914, + "3735": 2914, + "3736": 2915, + "3737": 2915, + "3738": 2916, + "3739": 2916, + "3740": 2917, + "3741": 2918, + "3742": 2918, + "3743": 2919, + "3744": 2919, + "3745": 2920, + "3746": 2921, + "3747": 2921, + "3748": 2921, + "3749": 2922, + "3750": 2923, + "3751": 2924, + "3752": 2924, + "3753": 2924, + "3754": 2925, + "3755": 2926, + "3756": 2927, + "3757": 2928, + "3758": 2929, + "3759": 2930, + "3760": 2931, + "3761": 2931, + "3762": 2932, + "3763": 2933, + "3764": 2934, + "3765": 2935, + "3766": 2935, + "3767": 2935, + "3768": 2936, + "3769": 2936, + "3770": 2937, + "3771": 2937, + "3772": 2938, + "3773": 2939, + "3774": 2940, + "3775": 2940, + "3776": 2941, + "3777": 2941, + "3778": 2942, + "3779": 2942, + "3780": 2943, + "3781": 2944, + "3782": 2944, + "3783": 2948, + "3784": 2948, + "3785": 2949, + "3786": 2950, + "3787": 2951, + "3788": 2952, + "3789": 2953, + "3790": 2956, + "3791": 2956, + "3792": 2957, + "3793": 2958, + "3794": 2959, + "3795": 2959, + "3796": 2960, + "3797": 2961, + "3798": 2962, + "3799": 2963, + "3800": 2964, + "3801": 2965, + "3802": 2965, + "3803": 2965, + "3804": 2966, + "3805": 2967, + "3806": 2970, + "3807": 2970, + "3808": 2970, + "3809": 2974, + "3810": 2975, + "3811": 2976, + "3812": 2976, + "3813": 2976, + "3814": 2977, + "3815": 2978, + "3816": 2979, + "3817": 2979, + "3818": 2979, + "3819": 2980, + "3820": 2981, + "3821": 2982, + "3822": 2983, + "3823": 2984, + "3824": 2984, + "3825": 2988, + "3826": 2988, + "3827": 2989, + "3828": 2990, + "3829": 2991, + "3830": 2992, + "3831": 2993, + "3832": 2994, + "3833": 2995, + "3834": 2995, + "3835": 2995, + "3836": 2996, + "3837": 2997, + "3838": 2997, + "3839": 2997, + "3840": 2998, + "3841": 2999, + "3842": 2999, + "3843": 3000, + "3844": 3001, + "3845": 3001, + "3846": 3001, + "3847": 3002, + "3848": 3003, + "3849": 3003, + "3850": 3007, + "3851": 3007, + "3852": 3008, + "3853": 3009, + "3854": 3010, + "3855": 3011, + "3856": 3012, + "3857": 3015, + "3858": 3015, + "3859": 3016, + "3860": 3017, + "3861": 3018, + "3862": 3018, + "3863": 3019, + "3864": 3020, + "3865": 3021, + "3866": 3022, + "3867": 3023, + "3868": 3024, + "3869": 3024, + "3870": 3024, + "3871": 3025, + "3872": 3026, + "3873": 3029, + "3874": 3029, + "3875": 3029, + "3876": 3033, + "3877": 3034, + "3878": 3035, + "3879": 3035, + "3880": 3035, + "3881": 3036, + "3882": 3037, + "3883": 3038, + "3884": 3038, + "3885": 3038, + "3886": 3039, + "3887": 3040, + "3888": 3040, + "3889": 3041, + "3890": 3042, + "3891": 3042, + "3892": 3042, + "3893": 3043, + "3894": 3044, + "3895": 3044, + "3896": 3045, + "3897": 3046, + "3898": 3047, + "3899": 3047, + "3900": 3051, + "3901": 3051, + "3902": 3052, + "3903": 3053, + "3904": 3054, + "3905": 3055, + "3906": 3056, + "3907": 3057, + "3908": 3058, + "3909": 3058, + "3910": 3058, + "3911": 3059, + "3912": 3060, + "3913": 3060, + "3914": 3060, + "3915": 3061, + "3916": 3062, + "3917": 3063, + "3918": 3064, + "3919": 3065, + "3920": 3066, + "3921": 3067, + "3922": 3068, + "3923": 3069, + "3924": 3069, + "3925": 3073, + "3926": 3073, + "3927": 3074, + "3928": 3075, + "3929": 3076, + "3930": 3077, + "3931": 3078, + "3932": 3081, + "3933": 3081, + "3934": 3082, + "3935": 3083, + "3936": 3084, + "3937": 3084, + "3938": 3085, + "3939": 3086, + "3940": 3087, + "3941": 3088, + "3942": 3089, + "3943": 3090, + "3944": 3091, + "3945": 3091, + "3946": 3091, + "3947": 3092, + "3948": 3093, + "3949": 3096, + "3950": 3096, + "3951": 3096, + "3952": 3100, + "3953": 3101, + "3954": 3102, + "3955": 3102, + "3956": 3102, + "3957": 3103, + "3958": 3104, + "3959": 3105, + "3960": 3105, + "3961": 3105, + "3962": 3106, + "3963": 3107, + "3964": 3107, + "3965": 3108, + "3966": 3109, + "3967": 3109, + "3968": 3109, + "3969": 3110, + "3970": 3111, + "3971": 3111, + "3972": 3112, + "3973": 3113, + "3974": 3114, + "3975": 3114, + "3976": 3118, + "3977": 3118, + "3978": 3119, + "3979": 3120, + "3980": 3121, + "3981": 3122, + "3982": 3123, + "3983": 3124, + "3984": 3125, + "3985": 3125, + "3986": 3125, + "3987": 3126, + "3988": 3127, + "3989": 3127, + "3990": 3127, + "3991": 3128, + "3992": 3129, + "3993": 3130, + "3994": 3131, + "3995": 3132, + "3996": 3133, + "3997": 3134, + "3998": 3135, + "3999": 3136, + "4000": 3137, + "4001": 3138, + "4002": 3139, + "4003": 3139, + "4004": 3140, + "4005": 3140, + "4006": 3141, + "4007": 3142, + "4008": 3143, + "4009": 3143, + "4010": 3144, + "4011": 3144, + "4012": 3148, + "4013": 3148, + "4014": 3149, + "4015": 3149, + "4016": 3150, + "4017": 3151, + "4018": 3152, + "4019": 3153, + "4020": 3154, + "4021": 3155, + "4022": 3158, + "4023": 3158, + "4024": 3159, + "4025": 3160, + "4026": 3161, + "4027": 3161, + "4028": 3162, + "4029": 3163, + "4030": 3164, + "4031": 3165, + "4032": 3166, + "4033": 3167, + "4034": 3167, + "4035": 3167, + "4036": 3168, + "4037": 3169, + "4038": 3172, + "4039": 3172, + "4040": 3172, + "4041": 3176, + "4042": 3177, + "4043": 3178, + "4044": 3179, + "4045": 3180, + "4046": 3181, + "4047": 3181, + "4048": 3182, + "4049": 3183, + "4050": 3184, + "4051": 3184, + "4052": 3185, + "4053": 3186, + "4054": 3187, + "4055": 3187, + "4056": 3191, + "4057": 3191, + "4058": 3192, + "4059": 3193, + "4060": 3194, + "4061": 3195, + "4062": 3196, + "4063": 3197, + "4064": 3197, + "4065": 3197, + "4066": 3198, + "4067": 3199, + "4068": 3200, + "4069": 3201, + "4070": 3202, + "4071": 3203, + "4072": 3203, + "4073": 3204, + "4074": 3205, + "4075": 3206, + "4076": 3207, + "4077": 3208, + "4078": 3209, + "4079": 3209, + "4080": 3210, + "4081": 3210, + "4082": 3211, + "4083": 3212, + "4084": 3212, + "4085": 3213, + "4086": 3214, + "4087": 3214, + "4088": 3215, + "4089": 3216, + "4090": 3217, + "4091": 3217, + "4092": 3218, + "4093": 3218, + "4094": 3219, + "4095": 3220, + "4096": 3221, + "4097": 3222, + "4098": 3223, + "4099": 3224, + "4100": 3225, + "4101": 3226, + "4102": 3226, + "4103": 3230, + "4104": 3230, + "4105": 3231, + "4106": 3232, + "4107": 3233, + "4108": 3234, + "4109": 3235, + "4110": 3238, + "4111": 3238, + "4112": 3239, + "4113": 3240, + "4114": 3241, + "4115": 3241, + "4116": 3242, + "4117": 3243, + "4118": 3244, + "4119": 3245, + "4120": 3246, + "4121": 3247, + "4122": 3247, + "4123": 3248, + "4124": 3248, + "4125": 3248, + "4126": 3249, + "4127": 3250, + "4128": 3253, + "4129": 3253, + "4130": 3253, + "4131": 3257, + "4132": 3258, + "4133": 3259, + "4134": 3259, + "4135": 3259, + "4136": 3260, + "4137": 3261, + "4138": 3262, + "4139": 3262, + "4140": 3262, + "4141": 3263, + "4142": 3264, + "4143": 3264, + "4144": 3265, + "4145": 3266, + "4146": 3266, + "4147": 3266, + "4148": 3267, + "4149": 3268, + "4150": 3268, + "4151": 3269, + "4152": 3270, + "4153": 3270, + "4154": 3270, + "4155": 3271, + "4156": 3272, + "4157": 3272, + "4158": 3273, + "4159": 3274, + "4160": 3274, + "4161": 3274, + "4162": 3275, + "4163": 3276, + "4164": 3276, + "4165": 3277, + "4166": 3278, + "4167": 3278, + "4168": 3278, + "4169": 3279, + "4170": 3280, + "4171": 3280, + "4172": 3281, + "4173": 3282, + "4174": 3282, + "4175": 3282, + "4176": 3283, + "4177": 3284, + "4178": 3285, + "4179": 3286, + "4180": 3286, + "4181": 3286, + "4182": 3287, + "4183": 3288, + "4184": 3288, + "4185": 3289, + "4186": 3290, + "4187": 3290, + "4188": 3290, + "4189": 3291, + "4190": 3292, + "4191": 3292, + "4192": 3293, + "4193": 3294, + "4194": 3294, + "4195": 3294, + "4196": 3295, + "4197": 3296, + "4198": 3296, + "4199": 3297, + "4200": 3298, + "4201": 3299, + "4202": 3299, + "4203": 3303, + "4204": 3304, + "4205": 3304, + "4206": 3308, + "4207": 3308, + "4208": 3309, + "4209": 3309, + "4210": 3313, + "4211": 3313, + "4212": 3314, + "4213": 3315, + "4214": 3316, + "4215": 3316, + "4216": 3317, + "4217": 3318, + "4218": 3319, + "4219": 3319, + "4220": 3319, + "4221": 3320, + "4222": 3320, + "4223": 3321, + "4224": 3322, + "4225": 3323, + "4226": 3324, + "4227": 3325, + "4228": 3325, + "4229": 3326, + "4230": 3326, + "4231": 3327, + "4232": 3328, + "4233": 3329, + "4234": 3330, + "4235": 3331, + "4236": 3331, + "4237": 3332, + "4238": 3332, + "4239": 3333, + "4240": 3334, + "4241": 3334, + "4242": 3335, + "4243": 3336, + "4244": 3336, + "4245": 3337, + "4246": 3338, + "4247": 3339, + "4248": 3339, + "4249": 3340, + "4250": 3340, + "4251": 3341, + "4252": 3342, + "4253": 3343, + "4254": 3344, + "4255": 3345, + "4256": 3346, + "4257": 3347, + "4258": 3348, + "4259": 3348, + "4260": 3349, + "4261": 3350, + "4262": 3350, + "4263": 3350, + "4264": 3351, + "4265": 3351, + "4266": 3352, + "4267": 3352, + "4268": 3353, + "4269": 3353, + "4270": 3354, + "4271": 3355, + "4272": 3356, + "4273": 3357, + "4274": 3358, + "4275": 3359, + "4276": 3359, + "4277": 3360, + "4278": 3360, + "4279": 3364, + "4280": 3364, + "4281": 3365, + "4282": 3366, + "4283": 3367, + "4284": 3368, + "4285": 3369, + "4286": 3372, + "4287": 3372, + "4288": 3373, + "4289": 3374, + "4290": 3375, + "4291": 3375, + "4292": 3376, + "4293": 3377, + "4294": 3378, + "4295": 3379, + "4296": 3380, + "4297": 3381, + "4298": 3382, + "4299": 3382, + "4300": 3382, + "4301": 3383, + "4302": 3384, + "4303": 3387, + "4304": 3387, + "4305": 3387, + "4306": 3391, + "4307": 3392, + "4308": 3393, + "4309": 3393, + "4310": 3393, + "4311": 3394, + "4312": 3395, + "4313": 3396, + "4314": 3396, + "4315": 3396, + "4316": 3397, + "4317": 3398, + "4318": 3398, + "4319": 3399, + "4320": 3400, + "4321": 3400, + "4322": 3400, + "4323": 3401, + "4324": 3402, + "4325": 3402, + "4326": 3403, + "4327": 3404, + "4328": 3405, + "4329": 3405, + "4330": 3409, + "4331": 3409, + "4332": 3410, + "4333": 3411, + "4334": 3412, + "4335": 3413, + "4336": 3414, + "4337": 3415, + "4338": 3416, + "4339": 3417, + "4340": 3417, + "4341": 3418, + "4342": 3419, + "4343": 3420, + "4344": 3421, + "4345": 3422, + "4346": 3423, + "4347": 3424, + "4348": 3425, + "4349": 3426, + "4350": 3426, + "4351": 3427, + "4352": 3428, + "4353": 3429, + "4354": 3430, + "4355": 3431, + "4356": 3432, + "4357": 3433, + "4358": 3434, + "4359": 3435, + "4360": 3435, + "4361": 3436, + "4362": 3437, + "4363": 3438, + "4364": 3438, + "4365": 3442, + "4366": 3442, + "4367": 3443, + "4368": 3444, + "4369": 3445, + "4370": 3446, + "4371": 3447, + "4372": 3450, + "4373": 3450, + "4374": 3451, + "4375": 3452, + "4376": 3453, + "4377": 3453, + "4378": 3454, + "4379": 3455, + "4380": 3456, + "4381": 3457, + "4382": 3458, + "4383": 3459, + "4384": 3459, + "4385": 3459, + "4386": 3460, + "4387": 3461, + "4388": 3464, + "4389": 3464, + "4390": 3464, + "4391": 3468, + "4392": 3469, + "4393": 3470, + "4394": 3470, + "4395": 3470, + "4396": 3471, + "4397": 3472, + "4398": 3473, + "4399": 3473, + "4400": 3473, + "4401": 3474, + "4402": 3475, + "4403": 3475, + "4404": 3476, + "4405": 3477, + "4406": 3477, + "4407": 3477, + "4408": 3478, + "4409": 3479, + "4410": 3479, + "4411": 3480, + "4412": 3481, + "4413": 3482, + "4414": 3482, + "4415": 3486, + "4416": 3486, + "4417": 3487, + "4418": 3488, + "4419": 3489, + "4420": 3490, + "4421": 3491, + "4422": 3492, + "4423": 3492, + "4424": 3492, + "4425": 3493, + "4426": 3494, + "4427": 3495, + "4428": 3496, + "4429": 3497, + "4430": 3498, + "4431": 3498, + "4432": 3499, + "4433": 3500, + "4434": 3501, + "4435": 3502, + "4436": 3503, + "4437": 3504, + "4438": 3504, + "4439": 3505, + "4440": 3505, + "4441": 3506, + "4442": 3507, + "4443": 3507, + "4444": 3508, + "4445": 3509, + "4446": 3509, + "4447": 3510, + "4448": 3511, + "4449": 3512, + "4450": 3512, + "4451": 3513, + "4452": 3513, + "4453": 3514, + "4454": 3515, + "4455": 3516, + "4456": 3517, + "4457": 3518, + "4458": 3519, + "4459": 3520, + "4460": 3521, + "4461": 3521, + "4462": 3525, + "4463": 3525, + "4464": 3526, + "4465": 3527, + "4466": 3528, + "4467": 3529, + "4468": 3530, + "4469": 3533, + "4470": 3533, + "4471": 3534, + "4472": 3535, + "4473": 3536, + "4474": 3536, + "4475": 3537, + "4476": 3538, + "4477": 3539, + "4478": 3540, + "4479": 3541, + "4480": 3542, + "4481": 3543, + "4482": 3543, + "4483": 3543, + "4484": 3544, + "4485": 3545, + "4486": 3548, + "4487": 3548, + "4488": 3548, + "4489": 3552, + "4490": 3553, + "4491": 3554, + "4492": 3554, + "4493": 3554, + "4494": 3555, + "4495": 3556, + "4496": 3557, + "4497": 3557, + "4498": 3557, + "4499": 3558, + "4500": 3559, + "4501": 3559, + "4502": 3560, + "4503": 3561, + "4504": 3561, + "4505": 3561, + "4506": 3562, + "4507": 3563, + "4508": 3563, + "4509": 3564, + "4510": 3565, + "4511": 3566, + "4512": 3566, + "4513": 3570, + "4514": 3570, + "4515": 3571, + "4516": 3572, + "4517": 3573, + "4518": 3574, + "4519": 3575, + "4520": 3576, + "4521": 3576, + "4522": 3576, + "4523": 3577, + "4524": 3578, + "4525": 3579, + "4526": 3580, + "4527": 3581, + "4528": 3582, + "4529": 3582, + "4530": 3583, + "4531": 3584, + "4532": 3585, + "4533": 3586, + "4534": 3587, + "4535": 3588, + "4536": 3588, + "4537": 3589, + "4538": 3589, + "4539": 3590, + "4540": 3591, + "4541": 3591, + "4542": 3592, + "4543": 3593, + "4544": 3593, + "4545": 3594, + "4546": 3595, + "4547": 3596, + "4548": 3596, + "4549": 3597, + "4550": 3597, + "4551": 3598, + "4552": 3599, + "4553": 3600, + "4554": 3601, + "4555": 3602, + "4556": 3603, + "4557": 3604, + "4558": 3605, + "4559": 3606, + "4560": 3607, + "4561": 3607, + "4562": 3607, + "4563": 3608, + "4564": 3608, + "4565": 3609, + "4566": 3609, + "4567": 3610, + "4568": 3610, + "4569": 3611, + "4570": 3612, + "4571": 3613, + "4572": 3614, + "4573": 3615, + "4574": 3616, + "4575": 3616, + "4576": 3617, + "4577": 3617, + "4578": 3621, + "4579": 3621, + "4580": 3622, + "4581": 3623, + "4582": 3624, + "4583": 3625, + "4584": 3626, + "4585": 3629, + "4586": 3629, + "4587": 3630, + "4588": 3631, + "4589": 3632, + "4590": 3632, + "4591": 3633, + "4592": 3634, + "4593": 3635, + "4594": 3636, + "4595": 3637, + "4596": 3638, + "4597": 3638, + "4598": 3638, + "4599": 3639, + "4600": 3640, + "4601": 3643, + "4602": 3643, + "4603": 3643, + "4604": 3647, + "4605": 3648, + "4606": 3649, + "4607": 3649, + "4608": 3649, + "4609": 3650, + "4610": 3651, + "4611": 3652, + "4612": 3652, + "4613": 3652, + "4614": 3653, + "4615": 3654, + "4616": 3654, + "4617": 3655, + "4618": 3656, + "4619": 3656, + "4620": 3656, + "4621": 3657, + "4622": 3658, + "4623": 3658, + "4624": 3659, + "4625": 3660, + "4626": 3661, + "4627": 3661, + "4628": 3665, + "4629": 3665, + "4630": 3666, + "4631": 3667, + "4632": 3668, + "4633": 3669, + "4634": 3670, + "4635": 3671, + "4636": 3671, + "4637": 3671, + "4638": 3672, + "4639": 3673, + "4640": 3674, + "4641": 3675, + "4642": 3676, + "4643": 3677, + "4644": 3677, + "4645": 3678, + "4646": 3679, + "4647": 3680, + "4648": 3681, + "4649": 3682, + "4650": 3683, + "4651": 3683, + "4652": 3684, + "4653": 3684, + "4654": 3685, + "4655": 3686, + "4656": 3686, + "4657": 3687, + "4658": 3688, + "4659": 3688, + "4660": 3689, + "4661": 3690, + "4662": 3691, + "4663": 3691, + "4664": 3692, + "4665": 3692, + "4666": 3693, + "4667": 3694, + "4668": 3695, + "4669": 3696, + "4670": 3697, + "4671": 3698, + "4672": 3699, + "4673": 3700, + "4674": 3700, + "4675": 3704, + "4676": 3704, + "4677": 3705, + "4678": 3706, + "4679": 3707, + "4680": 3708, + "4681": 3709, + "4682": 3712, + "4683": 3712, + "4684": 3713, + "4685": 3714, + "4686": 3715, + "4687": 3715, + "4688": 3716, + "4689": 3717, + "4690": 3718, + "4691": 3719, + "4692": 3720, + "4693": 3721, + "4694": 3722, + "4695": 3722, + "4696": 3722, + "4697": 3723, + "4698": 3724, + "4699": 3727, + "4700": 3727, + "4701": 3727, + "4702": 3731, + "4703": 3732, + "4704": 3733, + "4705": 3733, + "4706": 3733, + "4707": 3734, + "4708": 3735, + "4709": 3736, + "4710": 3736, + "4711": 3736, + "4712": 3737, + "4713": 3738, + "4714": 3738, + "4715": 3739, + "4716": 3740, + "4717": 3740, + "4718": 3740, + "4719": 3741, + "4720": 3742, + "4721": 3742, + "4722": 3743, + "4723": 3744, + "4724": 3745, + "4725": 3745, + "4726": 3749, + "4727": 3749, + "4728": 3750, + "4729": 3751, + "4730": 3752, + "4731": 3753, + "4732": 3754, + "4733": 3755, + "4734": 3755, + "4735": 3755, + "4736": 3756, + "4737": 3757, + "4738": 3758, + "4739": 3759, + "4740": 3760, + "4741": 3761, + "4742": 3761, + "4743": 3762, + "4744": 3763, + "4745": 3764, + "4746": 3765, + "4747": 3766, + "4748": 3767, + "4749": 3767, + "4750": 3768, + "4751": 3768, + "4752": 3769, + "4753": 3770, + "4754": 3770, + "4755": 3771, + "4756": 3772, + "4757": 3772, + "4758": 3773, + "4759": 3774, + "4760": 3775, + "4761": 3775, + "4762": 3776, + "4763": 3776, + "4764": 3777, + "4765": 3778, + "4766": 3779, + "4767": 3780, + "4768": 3781, + "4769": 3782, + "4770": 3783, + "4771": 3784, + "4772": 3785, + "4773": 3786, + "4774": 3786, + "4775": 3786, + "4776": 3787, + "4777": 3787, + "4778": 3788, + "4779": 3788, + "4780": 3789, + "4781": 3789, + "4782": 3790, + "4783": 3791, + "4784": 3792, + "4785": 3793, + "4786": 3794, + "4787": 3795, + "4788": 3795, + "4789": 3796, + "4790": 3796, + "4791": 3800, + "4792": 3800, + "4793": 3801, + "4794": 3802, + "4795": 3803, + "4796": 3804, + "4797": 3805, + "4798": 3808, + "4799": 3808, + "4800": 3809, + "4801": 3810, + "4802": 3811, + "4803": 3811, + "4804": 3812, + "4805": 3813, + "4806": 3814, + "4807": 3815, + "4808": 3816, + "4809": 3816, + "4810": 3816, + "4811": 3817, + "4812": 3818, + "4813": 3821, + "4814": 3821, + "4815": 3821, + "4816": 3825, + "4817": 3825, + "4818": 3826, + "4819": 3827, + "4820": 3828, + "4821": 3829, + "4822": 3829, + "4823": 3829, + "4824": 3830, + "4825": 3831, + "4826": 3832, + "4827": 3833, + "4828": 3834, + "4829": 3835, + "4830": 3836, + "4831": 3839, + "4832": 3839, + "4833": 3840, + "4834": 3841, + "4835": 3842, + "4836": 3842, + "4837": 3843, + "4838": 3844, + "4839": 3845, + "4840": 3846, + "4841": 3847, + "4842": 3847, + "4843": 3847, + "4844": 3848, + "4845": 3848, + "4846": 3848, + "4847": 3849, + "4848": 3849, + "4849": 3849, + "4850": 3850, + "4851": 3851, + "4852": 3854, + "4853": 3854, + "4854": 3854, + "4855": 3858, + "4856": 3858, + "4857": 3859, + "4858": 3859, + "4859": 3860, + "4860": 3861, + "4861": 3862, + "4862": 3865, + "4863": 3865, + "4864": 3866, + "4865": 3867, + "4866": 3868, + "4867": 3868, + "4868": 3869, + "4869": 3870, + "4870": 3871, + "4871": 3872, + "4872": 3873, + "4873": 3874, + "4874": 3874, + "4875": 3874, + "4876": 3875, + "4877": 3876, + "4878": 3879, + "4879": 3879, + "4880": 3879, + "4881": 3883, + "4882": 3884, + "4883": 3885, + "4884": 3885, + "4885": 3886, + "4886": 3886, + "4887": 3887, + "4888": 3887, + "4889": 3888, + "4890": 3888, + "4891": 3889, + "4892": 3889, + "4893": 3890, + "4894": 3891, + "4895": 3892, + "4896": 3892, + "4897": 3892, + "4898": 3893, + "4899": 3894, + "4900": 3894, + "4901": 3895, + "4902": 3895, + "4903": 3896, + "4904": 3896, + "4905": 3897, + "4906": 3898, + "4907": 3898, + "4908": 3899, + "4909": 3900, + "4910": 3901, + "4911": 3901, + "4912": 3901, + "4913": 3902, + "4914": 3903, + "4915": 3904, + "4916": 3905, + "4917": 3906, + "4918": 3907, + "4919": 3907, + "4920": 3908, + "4921": 3909, + "4922": 3910, + "4923": 3911, + "4924": 3911, + "4925": 3911, + "4926": 3912, + "4927": 3912, + "4928": 3913, + "4929": 3913, + "4930": 3914, + "4931": 3915, + "4932": 3916, + "4933": 3916, + "4934": 3917, + "4935": 3917, + "4936": 3918, + "4937": 3918, + "4938": 3919, + "4939": 3920, + "4940": 3920, + "4941": 3921, + "4942": 3921, + "4943": 3922, + "4944": 3923, + "4945": 3924, + "4946": 3925, + "4947": 3925, + "4948": 3925, + "4949": 3926, + "4950": 3927, + "4951": 3928, + "4952": 3929, + "4953": 3930, + "4954": 3930, + "4955": 3931, + "4956": 3932, + "4957": 3933, + "4958": 3934, + "4959": 3934, + "4960": 3934, + "4961": 3935, + "4962": 3935, + "4963": 3936, + "4964": 3936, + "4965": 3937, + "4966": 3938, + "4967": 3939, + "4968": 3939, + "4969": 3940, + "4970": 3940, + "4971": 3941, + "4972": 3941, + "4973": 3942, + "4974": 3943, + "4975": 3943, + "4976": 3944, + "4977": 3944, + "4978": 3945, + "4979": 3946, + "4980": 3946, + "4981": 3946, + "4982": 3947, + "4983": 3948, + "4984": 3949, + "4985": 3950, + "4986": 3951, + "4987": 3952, + "4988": 3952, + "4989": 3953, + "4990": 3954, + "4991": 3955, + "4992": 3956, + "4993": 3956, + "4994": 3956, + "4995": 3957, + "4996": 3957, + "4997": 3958, + "4998": 3958, + "4999": 3959, + "5000": 3960, + "5001": 3961, + "5002": 3961, + "5003": 3962, + "5004": 3962, + "5005": 3963, + "5006": 3963, + "5007": 3964, + "5008": 3965, + "5009": 3965, + "5010": 3969, + "5011": 3969, + "5012": 3970, + "5013": 3971, + "5014": 3972, + "5015": 3973, + "5016": 3974, + "5017": 3977, + "5018": 3977, + "5019": 3978, + "5020": 3979, + "5021": 3980, + "5022": 3980, + "5023": 3981, + "5024": 3982, + "5025": 3983, + "5026": 3984, + "5027": 3985, + "5028": 3986, + "5029": 3986, + "5030": 3986, + "5031": 3987, + "5032": 3988, + "5033": 3991, + "5034": 3991, + "5035": 3991, + "5036": 3995, + "5037": 3996, + "5038": 3997, + "5039": 3997, + "5040": 3998, + "5041": 3998, + "5042": 3999, + "5043": 3999, + "5044": 4000, + "5045": 4000, + "5046": 4001, + "5047": 4001, + "5048": 4002, + "5049": 4003, + "5050": 4004, + "5051": 4004, + "5052": 4004, + "5053": 4005, + "5054": 4006, + "5055": 4006, + "5056": 4007, + "5057": 4007, + "5058": 4008, + "5059": 4008, + "5060": 4009, + "5061": 4010, + "5062": 4010, + "5063": 4011, + "5064": 4012, + "5065": 4013, + "5066": 4013, + "5067": 4013, + "5068": 4014, + "5069": 4015, + "5070": 4016, + "5071": 4017, + "5072": 4018, + "5073": 4019, + "5074": 4019, + "5075": 4020, + "5076": 4021, + "5077": 4022, + "5078": 4023, + "5079": 4023, + "5080": 4023, + "5081": 4024, + "5082": 4024, + "5083": 4025, + "5084": 4025, + "5085": 4026, + "5086": 4027, + "5087": 4028, + "5088": 4028, + "5089": 4029, + "5090": 4029, + "5091": 4030, + "5092": 4030, + "5093": 4031, + "5094": 4032, + "5095": 4032, + "5096": 4033, + "5097": 4033, + "5098": 4034, + "5099": 4035, + "5100": 4036, + "5101": 4037, + "5102": 4037, + "5103": 4037, + "5104": 4038, + "5105": 4039, + "5106": 4040, + "5107": 4041, + "5108": 4042, + "5109": 4042, + "5110": 4043, + "5111": 4044, + "5112": 4045, + "5113": 4046, + "5114": 4046, + "5115": 4046, + "5116": 4047, + "5117": 4047, + "5118": 4048, + "5119": 4048, + "5120": 4049, + "5121": 4050, + "5122": 4051, + "5123": 4051, + "5124": 4052, + "5125": 4052, + "5126": 4053, + "5127": 4053, + "5128": 4054, + "5129": 4055, + "5130": 4055, + "5131": 4056, + "5132": 4056, + "5133": 4057, + "5134": 4058, + "5135": 4058, + "5136": 4058, + "5137": 4059, + "5138": 4060, + "5139": 4061, + "5140": 4062, + "5141": 4063, + "5142": 4064, + "5143": 4064, + "5144": 4065, + "5145": 4066, + "5146": 4067, + "5147": 4068, + "5148": 4068, + "5149": 4068, + "5150": 4069, + "5151": 4069, + "5152": 4070, + "5153": 4070, + "5154": 4071, + "5155": 4072, + "5156": 4073, + "5157": 4073, + "5158": 4074, + "5159": 4074, + "5160": 4075, + "5161": 4075, + "5162": 4076, + "5163": 4077, + "5164": 4077, + "5165": 4081, + "5166": 4081, + "5167": 4082, + "5168": 4083, + "5169": 4083, + "5170": 4084, + "5171": 4084, + "5172": 4085, + "5173": 4086, + "5174": 4086, + "5175": 4087, + "5176": 4087, + "5177": 4088, + "5178": 4089, + "5179": 4090, + "5180": 4091, + "5181": 4092, + "5182": 4092, + "5183": 4093, + "5184": 4094, + "5185": 4095, + "5186": 4096, + "5187": 4097, + "5188": 4098, + "5189": 4099, + "5190": 4100, + "5191": 4101, + "5192": 4101, + "5193": 4101, + "5194": 4102, + "5195": 4102, + "5196": 4103, + "5197": 4104, + "5198": 4108, + "5199": 4108, + "5200": 4109, + "5201": 4110, + "5202": 4110, + "5203": 4111, + "5204": 4111, + "5205": 4112, + "5206": 4113, + "5207": 4113, + "5208": 4114, + "5209": 4114, + "5210": 4115, + "5211": 4116, + "5212": 4117, + "5213": 4118, + "5214": 4119, + "5215": 4119, + "5216": 4120, + "5217": 4121, + "5218": 4122, + "5219": 4123, + "5220": 4124, + "5221": 4125, + "5222": 4126, + "5223": 4127, + "5224": 4128, + "5225": 4128, + "5226": 4128, + "5227": 4129, + "5228": 4130, + "5229": 4131, + "5230": 4132, + "5231": 4132, + "5232": 4132, + "5233": 4133, + "5234": 4134, + "5235": 4135, + "5236": 4136, + "5237": 4137, + "5238": 4138, + "5239": 4139, + "5240": 4142, + "5241": 4142, + "5242": 4143, + "5243": 4144, + "5244": 4145, + "5245": 4145, + "5246": 4146, + "5247": 4147, + "5248": 4148, + "5249": 4149, + "5250": 4150, + "5251": 4151, + "5252": 4151, + "5253": 4151, + "5254": 4152, + "5255": 4153, + "5256": 4156, + "5257": 4156, + "5258": 4156, + "5259": 4160, + "5260": 4161, + "5261": 4162, + "5262": 4162, + "5263": 4163, + "5264": 4163, + "5265": 4164, + "5266": 4164, + "5267": 4165, + "5268": 4165, + "5269": 4166, + "5270": 4166, + "5271": 4167, + "5272": 4167, + "5273": 4168, + "5274": 4169, + "5275": 4169, + "5276": 4169, + "5277": 4170, + "5278": 4171, + "5279": 4171, + "5280": 4172, + "5281": 4172, + "5282": 4173, + "5283": 4173, + "5284": 4174, + "5285": 4175, + "5286": 4175, + "5287": 4176, + "5288": 4177, + "5289": 4178, + "5290": 4178, + "5291": 4178, + "5292": 4179, + "5293": 4180, + "5294": 4181, + "5295": 4182, + "5296": 4183, + "5297": 4184, + "5298": 4184, + "5299": 4185, + "5300": 4186, + "5301": 4187, + "5302": 4188, + "5303": 4188, + "5304": 4188, + "5305": 4189, + "5306": 4189, + "5307": 4190, + "5308": 4190, + "5309": 4191, + "5310": 4192, + "5311": 4193, + "5312": 4193, + "5313": 4194, + "5314": 4194, + "5315": 4195, + "5316": 4195, + "5317": 4196, + "5318": 4197, + "5319": 4197, + "5320": 4198, + "5321": 4198, + "5322": 4199, + "5323": 4200, + "5324": 4201, + "5325": 4202, + "5326": 4202, + "5327": 4202, + "5328": 4203, + "5329": 4204, + "5330": 4205, + "5331": 4206, + "5332": 4207, + "5333": 4207, + "5334": 4208, + "5335": 4209, + "5336": 4210, + "5337": 4211, + "5338": 4211, + "5339": 4211, + "5340": 4212, + "5341": 4212, + "5342": 4213, + "5343": 4213, + "5344": 4214, + "5345": 4215, + "5346": 4216, + "5347": 4216, + "5348": 4217, + "5349": 4217, + "5350": 4218, + "5351": 4218, + "5352": 4219, + "5353": 4220, + "5354": 4220, + "5355": 4221, + "5356": 4221, + "5357": 4222, + "5358": 4223, + "5359": 4223, + "5360": 4223, + "5361": 4224, + "5362": 4225, + "5363": 4226, + "5364": 4227, + "5365": 4228, + "5366": 4229, + "5367": 4229, + "5368": 4230, + "5369": 4231, + "5370": 4232, + "5371": 4233, + "5372": 4233, + "5373": 4233, + "5374": 4234, + "5375": 4234, + "5376": 4235, + "5377": 4235, + "5378": 4236, + "5379": 4237, + "5380": 4238, + "5381": 4238, + "5382": 4239, + "5383": 4239, + "5384": 4240, + "5385": 4240, + "5386": 4241, + "5387": 4242, + "5388": 4242, + "5389": 4243, + "5390": 4243, + "5391": 4244, + "5392": 4245, + "5393": 4245, + "5394": 4245, + "5395": 4246, + "5396": 4247, + "5397": 4248, + "5398": 4249, + "5399": 4250, + "5400": 4251, + "5401": 4251, + "5402": 4252, + "5403": 4253, + "5404": 4254, + "5405": 4255, + "5406": 4255, + "5407": 4255, + "5408": 4256, + "5409": 4256, + "5410": 4257, + "5411": 4257, + "5412": 4258, + "5413": 4259, + "5414": 4260, + "5415": 4260, + "5416": 4261, + "5417": 4261, + "5418": 4262, + "5419": 4262, + "5420": 4263, + "5421": 4264, + "5422": 4264, + "5423": 4268, + "5424": 4268, + "5425": 4269, + "5426": 4270, + "5427": 4270, + "5428": 4271, + "5429": 4272, + "5430": 4272, + "5431": 4273, + "5432": 4274, + "5433": 4274, + "5434": 4274, + "5435": 4275, + "5436": 4276, + "5437": 4276, + "5438": 4280, + "5439": 4280, + "5440": 4281, + "5441": 4282, + "5442": 4282, + "5443": 4283, + "5444": 4284, + "5445": 4285, + "5446": 4285, + "5447": 4286, + "5448": 4286, + "5449": 4287, + "5450": 4288, + "5451": 4289, + "5452": 4290, + "5453": 4291, + "5454": 4291, + "5455": 4292, + "5456": 4293, + "5457": 4294, + "5458": 4295, + "5459": 4296, + "5460": 4297, + "5461": 4298, + "5462": 4299, + "5463": 4300, + "5464": 4300, + "5465": 4301, + "5466": 4301, + "5467": 4302, + "5468": 4303, + "5469": 4303, + "5470": 4304, + "5471": 4305, + "5472": 4305, + "5473": 4305, + "5474": 4306, + "5475": 4306, + "5476": 4307, + "5477": 4308, + "5478": 4308, + "5479": 4308, + "5480": 4309, + "5481": 4310, + "5482": 4311, + "5483": 4312, + "5484": 4313, + "5485": 4314, + "5486": 4314, + "5487": 4314, + "5488": 4315, + "5489": 4316, + "5490": 4316, + "5491": 4317, + "5492": 4317, + "5493": 4317, + "5494": 4318, + "5495": 4319, + "5496": 4319, + "5497": 4320, + "5498": 4320, + "5499": 4320, + "5500": 4321, + "5501": 4322, + "5502": 4322, + "5503": 4323, + "5504": 4323, + "5505": 4323, + "5506": 4324, + "5507": 4325, + "5508": 4325, + "5509": 4326, + "5510": 4326, + "5511": 4330, + "5512": 4330, + "5513": 4331, + "5514": 4332, + "5515": 4332, + "5516": 4333, + "5517": 4333, + "5518": 4334, + "5519": 4335, + "5520": 4335, + "5521": 4336, + "5522": 4336, + "5523": 4337, + "5524": 4338, + "5525": 4339, + "5526": 4340, + "5527": 4341, + "5528": 4341, + "5529": 4342, + "5530": 4343, + "5531": 4344, + "5532": 4345, + "5533": 4346, + "5534": 4347, + "5535": 4348, + "5536": 4349, + "5537": 4350, + "5538": 4350, + "5539": 4351, + "5540": 4351, + "5541": 4352, + "5542": 4353, + "5543": 4353, + "5544": 4354, + "5545": 4355, + "5546": 4356, + "5547": 4357, + "5548": 4357, + "5549": 4357, + "5550": 4358, + "5551": 4359, + "5552": 4360, + "5553": 4360, + "5554": 4361, + "5555": 4361, + "5556": 4361, + "5557": 4362, + "5558": 4363, + "5559": 4363, + "5560": 4364, + "5561": 4364, + "5562": 4364, + "5563": 4365, + "5564": 4366, + "5565": 4366, + "5566": 4367, + "5567": 4367, + "5568": 4367, + "5569": 4368, + "5570": 4369, + "5571": 4369, + "5572": 4370, + "5573": 4370, + "5574": 4374, + "5575": 4374, + "5576": 4375, + "5577": 4376, + "5578": 4376, + "5579": 4377, + "5580": 4377, + "5581": 4378, + "5582": 4379, + "5583": 4379, + "5584": 4380, + "5585": 4380, + "5586": 4381, + "5587": 4382, + "5588": 4383, + "5589": 4384, + "5590": 4385, + "5591": 4385, + "5592": 4386, + "5593": 4387, + "5594": 4388, + "5595": 4389, + "5596": 4390, + "5597": 4391, + "5598": 4392, + "5599": 4393, + "5600": 4394, + "5601": 4394, + "5602": 4395, + "5603": 4395, + "5604": 4396, + "5605": 4397, + "5606": 4397, + "5607": 4398, + "5608": 4399, + "5609": 4399, + "5610": 4399, + "5611": 4400, + "5612": 4400, + "5613": 4401, + "5614": 4402, + "5615": 4402, + "5616": 4402, + "5617": 4403, + "5618": 4404, + "5619": 4405, + "5620": 4406, + "5621": 4407, + "5622": 4407, + "5623": 4408, + "5624": 4408, + "5625": 4408, + "5626": 4409, + "5627": 4410, + "5628": 4410, + "5629": 4411, + "5630": 4411, + "5631": 4411, + "5632": 4412, + "5633": 4413, + "5634": 4413, + "5635": 4414, + "5636": 4414, + "5637": 4418, + "5638": 4418, + "5639": 4419, + "5640": 4420, + "5641": 4420, + "5642": 4421, + "5643": 4421, + "5644": 4422, + "5645": 4423, + "5646": 4423, + "5647": 4424, + "5648": 4424, + "5649": 4425, + "5650": 4426, + "5651": 4427, + "5652": 4428, + "5653": 4429, + "5654": 4429, + "5655": 4430, + "5656": 4431, + "5657": 4432, + "5658": 4433, + "5659": 4434, + "5660": 4435, + "5661": 4436, + "5662": 4437, + "5663": 4438, + "5664": 4438, + "5665": 4439, + "5666": 4439, + "5667": 4440, + "5668": 4441, + "5669": 4441, + "5670": 4442, + "5671": 4443, + "5672": 4443, + "5673": 4443, + "5674": 4444, + "5675": 4444, + "5676": 4445, + "5677": 4446, + "5678": 4446, + "5679": 4446, + "5680": 4447, + "5681": 4448, + "5682": 4449, + "5683": 4450, + "5684": 4451, + "5685": 4451, + "5686": 4452, + "5687": 4452, + "5688": 4452, + "5689": 4453, + "5690": 4454, + "5691": 4454, + "5692": 4455, + "5693": 4455, + "5694": 4459, + "5695": 4459, + "5696": 4460, + "5697": 4461, + "5698": 4462, + "5699": 4463, + "5700": 4464, + "5701": 4467, + "5702": 4467, + "5703": 4468, + "5704": 4469, + "5705": 4470, + "5706": 4470, + "5707": 4471, + "5708": 4472, + "5709": 4473, + "5710": 4474, + "5711": 4475, + "5712": 4476, + "5713": 4476, + "5714": 4476, + "5715": 4477, + "5716": 4478, + "5717": 4481, + "5718": 4481, + "5719": 4481, + "5720": 4485, + "5721": 4486, + "5722": 4487, + "5723": 4487, + "5724": 4488, + "5725": 4488, + "5726": 4489, + "5727": 4489, + "5728": 4490, + "5729": 4490, + "5730": 4491, + "5731": 4491, + "5732": 4492, + "5733": 4492, + "5734": 4493, + "5735": 4494, + "5736": 4494, + "5737": 4495, + "5738": 4496, + "5739": 4497, + "5740": 4497, + "5741": 4497, + "5742": 4498, + "5743": 4499, + "5744": 4500, + "5745": 4501, + "5746": 4502, + "5747": 4503, + "5748": 4503, + "5749": 4504, + "5750": 4505, + "5751": 4506, + "5752": 4507, + "5753": 4507, + "5754": 4507, + "5755": 4508, + "5756": 4508, + "5757": 4509, + "5758": 4509, + "5759": 4510, + "5760": 4511, + "5761": 4512, + "5762": 4512, + "5763": 4513, + "5764": 4513, + "5765": 4514, + "5766": 4514, + "5767": 4515, + "5768": 4516, + "5769": 4516, + "5770": 4517, + "5771": 4518, + "5772": 4519, + "5773": 4519, + "5774": 4519, + "5775": 4520, + "5776": 4521, + "5777": 4522, + "5778": 4523, + "5779": 4524, + "5780": 4525, + "5781": 4525, + "5782": 4526, + "5783": 4527, + "5784": 4528, + "5785": 4529, + "5786": 4529, + "5787": 4529, + "5788": 4530, + "5789": 4530, + "5790": 4531, + "5791": 4531, + "5792": 4532, + "5793": 4533, + "5794": 4534, + "5795": 4534, + "5796": 4535, + "5797": 4535, + "5798": 4536, + "5799": 4536, + "5800": 4537, + "5801": 4538, + "5802": 4538, + "5803": 4539, + "5804": 4539, + "5805": 4540, + "5806": 4541, + "5807": 4541, + "5808": 4541, + "5809": 4542, + "5810": 4543, + "5811": 4544, + "5812": 4545, + "5813": 4546, + "5814": 4547, + "5815": 4547, + "5816": 4548, + "5817": 4549, + "5818": 4550, + "5819": 4551, + "5820": 4551, + "5821": 4551, + "5822": 4552, + "5823": 4552, + "5824": 4553, + "5825": 4553, + "5826": 4554, + "5827": 4555, + "5828": 4556, + "5829": 4556, + "5830": 4557, + "5831": 4557, + "5832": 4558, + "5833": 4558, + "5834": 4559, + "5835": 4560, + "5836": 4560, + "5837": 4564, + "5838": 4564, + "5839": 4565, + "5840": 4566, + "5841": 4566, + "5842": 4567, + "5843": 4568, + "5844": 4569, + "5845": 4569, + "5846": 4570, + "5847": 4570, + "5848": 4571, + "5849": 4572, + "5850": 4573, + "5851": 4574, + "5852": 4575, + "5853": 4575, + "5854": 4576, + "5855": 4577, + "5856": 4578, + "5857": 4579, + "5858": 4580, + "5859": 4581, + "5860": 4582, + "5861": 4583, + "5862": 4584, + "5863": 4584, + "5864": 4585, + "5865": 4585, + "5866": 4586, + "5867": 4587, + "5868": 4587, + "5869": 4588, + "5870": 4589, + "5871": 4589, + "5872": 4589, + "5873": 4590, + "5874": 4590, + "5875": 4591, + "5876": 4592, + "5877": 4592, + "5878": 4592, + "5879": 4593, + "5880": 4594, + "5881": 4595, + "5882": 4596, + "5883": 4597, + "5884": 4598, + "5885": 4598, + "5886": 4598, + "5887": 4599, + "5888": 4600, + "5889": 4601, + "5890": 4601, + "5891": 4601, + "5892": 4602, + "5893": 4603, + "5894": 4603, + "5895": 4604, + "5896": 4604, + "5897": 4604, + "5898": 4605, + "5899": 4606, + "5900": 4606, + "5901": 4607, + "5902": 4607, + "5903": 4611, + "5904": 4611, + "5905": 4612, + "5906": 4613, + "5907": 4613, + "5908": 4614, + "5909": 4615, + "5910": 4616, + "5911": 4616, + "5912": 4617, + "5913": 4617, + "5914": 4618, + "5915": 4619, + "5916": 4620, + "5917": 4621, + "5918": 4622, + "5919": 4622, + "5920": 4623, + "5921": 4624, + "5922": 4625, + "5923": 4626, + "5924": 4627, + "5925": 4628, + "5926": 4629, + "5927": 4630, + "5928": 4631, + "5929": 4631, + "5930": 4632, + "5931": 4632, + "5932": 4633, + "5933": 4634, + "5934": 4634, + "5935": 4635, + "5936": 4636, + "5937": 4636, + "5938": 4636, + "5939": 4637, + "5940": 4637, + "5941": 4638, + "5942": 4639, + "5943": 4639, + "5944": 4639, + "5945": 4640, + "5946": 4641, + "5947": 4642, + "5948": 4643, + "5949": 4644, + "5950": 4645, + "5951": 4645, + "5952": 4645, + "5953": 4646, + "5954": 4647, + "5955": 4647, + "5956": 4648, + "5957": 4648, + "5958": 4648, + "5959": 4649, + "5960": 4650, + "5961": 4650, + "5962": 4651, + "5963": 4651, + "5964": 4655, + "5965": 4655, + "5966": 4656, + "5967": 4657, + "5968": 4657, + "5969": 4658, + "5970": 4658, + "5971": 4659, + "5972": 4660, + "5973": 4660, + "5974": 4661, + "5975": 4661, + "5976": 4662, + "5977": 4663, + "5978": 4664, + "5979": 4665, + "5980": 4666, + "5981": 4666, + "5982": 4667, + "5983": 4668, + "5984": 4669, + "5985": 4670, + "5986": 4671, + "5987": 4672, + "5988": 4673, + "5989": 4674, + "5990": 4675, + "5991": 4675, + "5992": 4676, + "5993": 4676, + "5994": 4677, + "5995": 4678, + "5996": 4679, + "5997": 4680, + "5998": 4680, + "5999": 4680, + "6000": 4681, + "6001": 4681, + "6002": 4682, + "6003": 4683, + "6004": 4683, + "6005": 4683, + "6006": 4684, + "6007": 4685, + "6008": 4686, + "6009": 4687, + "6010": 4688, + "6011": 4688, + "6012": 4689, + "6013": 4689, + "6014": 4689, + "6015": 4690, + "6016": 4691, + "6017": 4691, + "6018": 4692, + "6019": 4692, + "6020": 4696, + "6021": 4696, + "6022": 4697, + "6023": 4698, + "6024": 4699, + "6025": 4700, + "6026": 4701, + "6027": 4704, + "6028": 4704, + "6029": 4705, + "6030": 4706, + "6031": 4707, + "6032": 4707, + "6033": 4708, + "6034": 4709, + "6035": 4710, + "6036": 4711, + "6037": 4712, + "6038": 4713, + "6039": 4713, + "6040": 4713, + "6041": 4714, + "6042": 4715, + "6043": 4718, + "6044": 4718, + "6045": 4718, + "6046": 4722, + "6047": 4723, + "6048": 4724, + "6049": 4724, + "6050": 4725, + "6051": 4725, + "6052": 4726, + "6053": 4726, + "6054": 4727, + "6055": 4727, + "6056": 4728, + "6057": 4728, + "6058": 4729, + "6059": 4729, + "6060": 4730, + "6061": 4731, + "6062": 4731, + "6063": 4732, + "6064": 4733, + "6065": 4734, + "6066": 4734, + "6067": 4734, + "6068": 4735, + "6069": 4736, + "6070": 4737, + "6071": 4737, + "6072": 4737, + "6073": 4738, + "6074": 4739, + "6075": 4740, + "6076": 4741, + "6077": 4742, + "6078": 4743, + "6079": 4744, + "6080": 4744, + "6081": 4745, + "6082": 4746, + "6083": 4747, + "6084": 4748, + "6085": 4748, + "6086": 4748, + "6087": 4749, + "6088": 4749, + "6089": 4750, + "6090": 4750, + "6091": 4751, + "6092": 4752, + "6093": 4753, + "6094": 4753, + "6095": 4754, + "6096": 4754, + "6097": 4755, + "6098": 4755, + "6099": 4756, + "6100": 4757, + "6101": 4757, + "6102": 4758, + "6103": 4759, + "6104": 4760, + "6105": 4760, + "6106": 4760, + "6107": 4761, + "6108": 4761, + "6109": 4762, + "6110": 4763, + "6111": 4763, + "6112": 4763, + "6113": 4764, + "6114": 4765, + "6115": 4766, + "6116": 4767, + "6117": 4768, + "6118": 4769, + "6119": 4770, + "6120": 4770, + "6121": 4771, + "6122": 4772, + "6123": 4773, + "6124": 4774, + "6125": 4774, + "6126": 4774, + "6127": 4775, + "6128": 4775, + "6129": 4776, + "6130": 4776, + "6131": 4777, + "6132": 4778, + "6133": 4779, + "6134": 4779, + "6135": 4780, + "6136": 4780, + "6137": 4781, + "6138": 4781, + "6139": 4782, + "6140": 4783, + "6141": 4783, + "6142": 4784, + "6143": 4784, + "6144": 4785, + "6145": 4786, + "6146": 4786, + "6147": 4786, + "6148": 4787, + "6149": 4787, + "6150": 4788, + "6151": 4789, + "6152": 4789, + "6153": 4789, + "6154": 4790, + "6155": 4791, + "6156": 4792, + "6157": 4793, + "6158": 4794, + "6159": 4795, + "6160": 4796, + "6161": 4796, + "6162": 4797, + "6163": 4798, + "6164": 4799, + "6165": 4800, + "6166": 4800, + "6167": 4800, + "6168": 4801, + "6169": 4801, + "6170": 4802, + "6171": 4802, + "6172": 4803, + "6173": 4804, + "6174": 4805, + "6175": 4805, + "6176": 4806, + "6177": 4806, + "6178": 4807, + "6179": 4807, + "6180": 4808, + "6181": 4809, + "6182": 4809, + "6183": 4813, + "6184": 4813, + "6185": 4814, + "6186": 4815, + "6187": 4815, + "6188": 4816, + "6189": 4817, + "6190": 4818, + "6191": 4818, + "6192": 4819, + "6193": 4819, + "6194": 4820, + "6195": 4821, + "6196": 4822, + "6197": 4823, + "6198": 4824, + "6199": 4824, + "6200": 4825, + "6201": 4826, + "6202": 4827, + "6203": 4828, + "6204": 4829, + "6205": 4830, + "6206": 4831, + "6207": 4832, + "6208": 4833, + "6209": 4833, + "6210": 4834, + "6211": 4834, + "6212": 4835, + "6213": 4836, + "6214": 4836, + "6215": 4837, + "6216": 4838, + "6217": 4838, + "6218": 4838, + "6219": 4839, + "6220": 4840, + "6221": 4841, + "6222": 4842, + "6223": 4843, + "6224": 4843, + "6225": 4843, + "6226": 4844, + "6227": 4845, + "6228": 4846, + "6229": 4846, + "6230": 4846, + "6231": 4847, + "6232": 4848, + "6233": 4848, + "6234": 4849, + "6235": 4849, + "6236": 4849, + "6237": 4850, + "6238": 4851, + "6239": 4851, + "6240": 4852, + "6241": 4852, + "6242": 4856, + "6243": 4856, + "6244": 4857, + "6245": 4858, + "6246": 4858, + "6247": 4859, + "6248": 4860, + "6249": 4861, + "6250": 4861, + "6251": 4862, + "6252": 4862, + "6253": 4863, + "6254": 4864, + "6255": 4865, + "6256": 4866, + "6257": 4867, + "6258": 4867, + "6259": 4868, + "6260": 4869, + "6261": 4870, + "6262": 4871, + "6263": 4872, + "6264": 4873, + "6265": 4874, + "6266": 4875, + "6267": 4876, + "6268": 4876, + "6269": 4877, + "6270": 4877, + "6271": 4878, + "6272": 4879, + "6273": 4879, + "6274": 4880, + "6275": 4881, + "6276": 4881, + "6277": 4881, + "6278": 4882, + "6279": 4883, + "6280": 4884, + "6281": 4885, + "6282": 4886, + "6283": 4886, + "6284": 4886, + "6285": 4887, + "6286": 4888, + "6287": 4888, + "6288": 4889, + "6289": 4889, + "6290": 4889, + "6291": 4890, + "6292": 4891, + "6293": 4891, + "6294": 4892, + "6295": 4892, + "6296": 4896, + "6297": 4896, + "6298": 4897, + "6299": 4898, + "6300": 4898, + "6301": 4899, + "6302": 4899, + "6303": 4900, + "6304": 4901, + "6305": 4901, + "6306": 4902, + "6307": 4902, + "6308": 4903, + "6309": 4904, + "6310": 4905, + "6311": 4906, + "6312": 4907, + "6313": 4907, + "6314": 4908, + "6315": 4909, + "6316": 4910, + "6317": 4911, + "6318": 4912, + "6319": 4913, + "6320": 4914, + "6321": 4915, + "6322": 4916, + "6323": 4916, + "6324": 4917, + "6325": 4917, + "6326": 4918, + "6327": 4919, + "6328": 4919, + "6329": 4920, + "6330": 4921, + "6331": 4921, + "6332": 4921, + "6333": 4922, + "6334": 4923, + "6335": 4924, + "6336": 4925, + "6337": 4925, + "6338": 4926, + "6339": 4926, + "6340": 4926, + "6341": 4927, + "6342": 4928, + "6343": 4928, + "6344": 4929, + "6345": 4929, + "6346": 4933, + "6347": 4933, + "6348": 4934, + "6349": 4935, + "6350": 4936, + "6351": 4937, + "6352": 4938, + "6353": 4941, + "6354": 4941, + "6355": 4942, + "6356": 4943, + "6357": 4944, + "6358": 4944, + "6359": 4945, + "6360": 4946, + "6361": 4947, + "6362": 4948, + "6363": 4949, + "6364": 4950, + "6365": 4950, + "6366": 4950, + "6367": 4951, + "6368": 4952, + "6369": 4955, + "6370": 4955, + "6371": 4955, + "6372": 4959, + "6373": 4960, + "6374": 4961, + "6375": 4961, + "6376": 4962, + "6377": 4962, + "6378": 4963, + "6379": 4963, + "6380": 4964, + "6381": 4964, + "6382": 4965, + "6383": 4965, + "6384": 4966, + "6385": 4967, + "6386": 4968, + "6387": 4968, + "6388": 4968, + "6389": 4969, + "6390": 4970, + "6391": 4970, + "6392": 4971, + "6393": 4971, + "6394": 4972, + "6395": 4972, + "6396": 4973, + "6397": 4974, + "6398": 4974, + "6399": 4975, + "6400": 4975, + "6401": 4976, + "6402": 4977, + "6403": 4978, + "6404": 4979, + "6405": 4979, + "6406": 4979, + "6407": 4980, + "6408": 4981, + "6409": 4982, + "6410": 4983, + "6411": 4984, + "6412": 4984, + "6413": 4985, + "6414": 4986, + "6415": 4987, + "6416": 4988, + "6417": 4988, + "6418": 4988, + "6419": 4989, + "6420": 4989, + "6421": 4990, + "6422": 4990, + "6423": 4991, + "6424": 4992, + "6425": 4993, + "6426": 4993, + "6427": 4994, + "6428": 4994, + "6429": 4995, + "6430": 4995, + "6431": 4996, + "6432": 4997, + "6433": 4997, + "6434": 5001, + "6435": 5001, + "6436": 5002, + "6437": 5003, + "6438": 5003, + "6439": 5004, + "6440": 5005, + "6441": 5006, + "6442": 5006, + "6443": 5007, + "6444": 5007, + "6445": 5008, + "6446": 5009, + "6447": 5010, + "6448": 5011, + "6449": 5012, + "6450": 5012, + "6451": 5013, + "6452": 5014, + "6453": 5015, + "6454": 5016, + "6455": 5017, + "6456": 5018, + "6457": 5019, + "6458": 5020, + "6459": 5021, + "6460": 5021, + "6461": 5021, + "6462": 5022, + "6463": 5023, + "6464": 5024, + "6465": 5025, + "6466": 5025, + "6467": 5025, + "6468": 5026, + "6469": 5027, + "6470": 5028, + "6471": 5029, + "6472": 5030, + "6473": 5031, + "6474": 5032, + "6475": 5035, + "6476": 5035, + "6477": 5036, + "6478": 5037, + "6479": 5038, + "6480": 5038, + "6481": 5039, + "6482": 5040, + "6483": 5041, + "6484": 5042, + "6485": 5043, + "6486": 5044, + "6487": 5044, + "6488": 5044, + "6489": 5045, + "6490": 5046, + "6491": 5049, + "6492": 5049, + "6493": 5049, + "6494": 5053, + "6495": 5054, + "6496": 5055, + "6497": 5055, + "6498": 5056, + "6499": 5056, + "6500": 5057, + "6501": 5057, + "6502": 5058, + "6503": 5058, + "6504": 5059, + "6505": 5059, + "6506": 5060, + "6507": 5061, + "6508": 5062, + "6509": 5062, + "6510": 5062, + "6511": 5063, + "6512": 5064, + "6513": 5064, + "6514": 5065, + "6515": 5065, + "6516": 5066, + "6517": 5066, + "6518": 5067, + "6519": 5068, + "6520": 5068, + "6521": 5069, + "6522": 5069, + "6523": 5070, + "6524": 5071, + "6525": 5072, + "6526": 5073, + "6527": 5073, + "6528": 5073, + "6529": 5074, + "6530": 5075, + "6531": 5076, + "6532": 5077, + "6533": 5078, + "6534": 5078, + "6535": 5079, + "6536": 5080, + "6537": 5081, + "6538": 5082, + "6539": 5082, + "6540": 5082, + "6541": 5083, + "6542": 5083, + "6543": 5084, + "6544": 5084, + "6545": 5085, + "6546": 5086, + "6547": 5087, + "6548": 5087, + "6549": 5088, + "6550": 5088, + "6551": 5089, + "6552": 5089, + "6553": 5090, + "6554": 5091, + "6555": 5091, + "6556": 5095, + "6557": 5095, + "6558": 5096, + "6559": 5097, + "6560": 5097, + "6561": 5098, + "6562": 5099, + "6563": 5100, + "6564": 5100, + "6565": 5101, + "6566": 5101, + "6567": 5102, + "6568": 5103, + "6569": 5104, + "6570": 5105, + "6571": 5106, + "6572": 5106, + "6573": 5107, + "6574": 5108, + "6575": 5109, + "6576": 5110, + "6577": 5111, + "6578": 5112, + "6579": 5113, + "6580": 5114, + "6581": 5115, + "6582": 5115, + "6583": 5116, + "6584": 5116, + "6585": 5117, + "6586": 5118, + "6587": 5118, + "6588": 5119, + "6589": 5120, + "6590": 5121, + "6591": 5122, + "6592": 5122, + "6593": 5122, + "6594": 5123, + "6595": 5124, + "6596": 5125, + "6597": 5126, + "6598": 5126, + "6599": 5126, + "6600": 5127, + "6601": 5128, + "6602": 5128, + "6603": 5129, + "6604": 5129, + "6605": 5133, + "6606": 5133, + "6607": 5134, + "6608": 5135, + "6609": 5135, + "6610": 5136, + "6611": 5137, + "6612": 5138, + "6613": 5138, + "6614": 5139, + "6615": 5139, + "6616": 5140, + "6617": 5141, + "6618": 5142, + "6619": 5143, + "6620": 5144, + "6621": 5144, + "6622": 5145, + "6623": 5146, + "6624": 5147, + "6625": 5148, + "6626": 5149, + "6627": 5150, + "6628": 5151, + "6629": 5152, + "6630": 5153, + "6631": 5153, + "6632": 5153, + "6633": 5154, + "6634": 5155, + "6635": 5156, + "6636": 5157, + "6637": 5157, + "6638": 5157, + "6639": 5158, + "6640": 5159, + "6641": 5160, + "6642": 5161, + "6643": 5162, + "6644": 5163, + "6645": 5164, + "6646": 5167, + "6647": 5167, + "6648": 5168, + "6649": 5169, + "6650": 5170, + "6651": 5170, + "6652": 5171, + "6653": 5172, + "6654": 5173, + "6655": 5174, + "6656": 5175, + "6657": 5176, + "6658": 5176, + "6659": 5176, + "6660": 5177, + "6661": 5178, + "6662": 5181, + "6663": 5181, + "6664": 5181, + "6665": 5185, + "6666": 5186, + "6667": 5187, + "6668": 5187, + "6669": 5188, + "6670": 5188, + "6671": 5189, + "6672": 5189, + "6673": 5190, + "6674": 5190, + "6675": 5191, + "6676": 5191, + "6677": 5192, + "6678": 5193, + "6679": 5194, + "6680": 5194, + "6681": 5194, + "6682": 5195, + "6683": 5196, + "6684": 5196, + "6685": 5197, + "6686": 5197, + "6687": 5198, + "6688": 5198, + "6689": 5199, + "6690": 5200, + "6691": 5200, + "6692": 5201, + "6693": 5201, + "6694": 5202, + "6695": 5203, + "6696": 5204, + "6697": 5205, + "6698": 5205, + "6699": 5205, + "6700": 5206, + "6701": 5207, + "6702": 5208, + "6703": 5209, + "6704": 5210, + "6705": 5210, + "6706": 5211, + "6707": 5212, + "6708": 5213, + "6709": 5214, + "6710": 5214, + "6711": 5214, + "6712": 5215, + "6713": 5215, + "6714": 5216, + "6715": 5216, + "6716": 5217, + "6717": 5218, + "6718": 5219, + "6719": 5219, + "6720": 5220, + "6721": 5220, + "6722": 5221, + "6723": 5221, + "6724": 5222, + "6725": 5223, + "6726": 5223, + "6727": 5227, + "6728": 5227, + "6729": 5228, + "6730": 5229, + "6731": 5229, + "6732": 5230, + "6733": 5231, + "6734": 5232, + "6735": 5232, + "6736": 5233, + "6737": 5233, + "6738": 5234, + "6739": 5235, + "6740": 5236, + "6741": 5237, + "6742": 5238, + "6743": 5238, + "6744": 5239, + "6745": 5240, + "6746": 5241, + "6747": 5242, + "6748": 5243, + "6749": 5244, + "6750": 5245, + "6751": 5246, + "6752": 5247, + "6753": 5247, + "6754": 5248, + "6755": 5248, + "6756": 5249, + "6757": 5250, + "6758": 5250, + "6759": 5251, + "6760": 5252, + "6761": 5253, + "6762": 5254, + "6763": 5254, + "6764": 5254, + "6765": 5255, + "6766": 5256, + "6767": 5257, + "6768": 5258, + "6769": 5258, + "6770": 5258, + "6771": 5259, + "6772": 5260, + "6773": 5260, + "6774": 5261, + "6775": 5261, + "6776": 5265, + "6777": 5265, + "6778": 5266, + "6779": 5267, + "6780": 5267, + "6781": 5268, + "6782": 5269, + "6783": 5270, + "6784": 5270, + "6785": 5271, + "6786": 5271, + "6787": 5272, + "6788": 5273, + "6789": 5274, + "6790": 5275, + "6791": 5276, + "6792": 5276, + "6793": 5277, + "6794": 5278, + "6795": 5279, + "6796": 5280, + "6797": 5281, + "6798": 5282, + "6799": 5283, + "6800": 5284, + "6801": 5285, + "6802": 5285, + "6803": 5285, + "6804": 5286, + "6805": 5287, + "6806": 5288, + "6807": 5289, + "6808": 5289, + "6809": 5289, + "6810": 5290, + "6811": 5291, + "6812": 5292, + "6813": 5293, + "6814": 5294, + "6815": 5295, + "6816": 5296, + "6817": 5299, + "6818": 5299, + "6819": 5300, + "6820": 5301, + "6821": 5302, + "6822": 5302, + "6823": 5303, + "6824": 5304, + "6825": 5305, + "6826": 5306, + "6827": 5307, + "6828": 5307, + "6829": 5307, + "6830": 5308, + "6831": 5308, + "6832": 5308, + "6833": 5309, + "6834": 5310, + "6835": 5313, + "6836": 5313, + "6837": 5313, + "6838": 5317, + "6839": 5317, + "6840": 5318, + "6841": 5319, + "6842": 5319, + "6843": 5320, + "6844": 5321, + "6845": 5322, + "6846": 5323, + "6847": 5324, + "6848": 5324, + "6849": 5325, + "6850": 5325, + "6851": 5326, + "6852": 5327, + "6853": 5328, + "6854": 5329, + "6855": 5330, + "6856": 5330, + "6857": 5331, + "6858": 5332, + "6859": 5333, + "6860": 5334, + "6861": 5335, + "6862": 5336, + "6863": 5337, + "6864": 5338, + "6865": 5339, + "6866": 5339, + "6867": 5339, + "6868": 5340, + "6869": 5341, + "6870": 5342, + "6871": 5343, + "6872": 5343, + "6873": 5343, + "6874": 5344, + "6875": 5345, + "6876": 5346, + "6877": 5347, + "6878": 5348, + "6879": 5349, + "6880": 5350, + "6881": 5353, + "6882": 5353, + "6883": 5354, + "6884": 5355, + "6885": 5356, + "6886": 5356, + "6887": 5357, + "6888": 5358, + "6889": 5359, + "6890": 5360, + "6891": 5361, + "6892": 5362, + "6893": 5362, + "6894": 5362, + "6895": 5363, + "6896": 5363, + "6897": 5363, + "6898": 5364, + "6899": 5365, + "6900": 5368, + "6901": 5368, + "6902": 5368, + "6903": 5372, + "6904": 5373, + "6905": 5373, + "6906": 5377, + "6907": 5377, + "6908": 5378, + "6909": 5379, + "6910": 5379, + "6911": 5380, + "6912": 5380, + "6913": 5381, + "6914": 5382, + "6915": 5383, + "6916": 5384, + "6917": 5384, + "6918": 5385, + "6919": 5385, + "6920": 5386, + "6921": 5387, + "6922": 5388, + "6923": 5389, + "6924": 5390, + "6925": 5390, + "6926": 5391, + "6927": 5392, + "6928": 5393, + "6929": 5394, + "6930": 5395, + "6931": 5396, + "6932": 5397, + "6933": 5398, + "6934": 5399, + "6935": 5399, + "6936": 5399, + "6937": 5400, + "6938": 5401, + "6939": 5402, + "6940": 5403, + "6941": 5403, + "6942": 5403, + "6943": 5404, + "6944": 5405, + "6945": 5406, + "6946": 5407, + "6947": 5408, + "6948": 5409, + "6949": 5410, + "6950": 5413, + "6951": 5413, + "6952": 5414, + "6953": 5415, + "6954": 5416, + "6955": 5416, + "6956": 5417, + "6957": 5418, + "6958": 5419, + "6959": 5420, + "6960": 5421, + "6961": 5422, + "6962": 5422, + "6963": 5422, + "6964": 5423, + "6965": 5424, + "6966": 5427, + "6967": 5427, + "6968": 5427, + "6969": 5431, + "6970": 5432, + "6971": 5433, + "6972": 5433, + "6973": 5434, + "6974": 5434, + "6975": 5435, + "6976": 5435, + "6977": 5436, + "6978": 5436, + "6979": 5437, + "6980": 5437, + "6981": 5438, + "6982": 5439, + "6983": 5440, + "6984": 5440, + "6985": 5440, + "6986": 5441, + "6987": 5442, + "6988": 5442, + "6989": 5443, + "6990": 5443, + "6991": 5444, + "6992": 5444, + "6993": 5445, + "6994": 5446, + "6995": 5446, + "6996": 5447, + "6997": 5448, + "6998": 5449, + "6999": 5449, + "7000": 5449, + "7001": 5450, + "7002": 5451, + "7003": 5452, + "7004": 5453, + "7005": 5454, + "7006": 5455, + "7007": 5455, + "7008": 5456, + "7009": 5457, + "7010": 5458, + "7011": 5459, + "7012": 5459, + "7013": 5459, + "7014": 5460, + "7015": 5460, + "7016": 5461, + "7017": 5461, + "7018": 5462, + "7019": 5463, + "7020": 5464, + "7021": 5464, + "7022": 5465, + "7023": 5465, + "7024": 5466, + "7025": 5466, + "7026": 5467, + "7027": 5468, + "7028": 5468, + "7029": 5468, + "7030": 5469, + "7031": 5470, + "7032": 5470, + "7033": 5471, + "7034": 5471, + "7035": 5472, + "7036": 5472, + "7037": 5473, + "7038": 5474, + "7039": 5474, + "7040": 5478, + "7041": 5478, + "7042": 5479, + "7043": 5480, + "7044": 5481, + "7045": 5482, + "7046": 5483, + "7047": 5486, + "7048": 5486, + "7049": 5487, + "7050": 5488, + "7051": 5489, + "7052": 5489, + "7053": 5490, + "7054": 5491, + "7055": 5492, + "7056": 5493, + "7057": 5494, + "7058": 5495, + "7059": 5495, + "7060": 5495, + "7061": 5496, + "7062": 5497, + "7063": 5500, + "7064": 5500, + "7065": 5500, + "7066": 5504, + "7067": 5505, + "7068": 5506, + "7069": 5506, + "7070": 5507, + "7071": 5507, + "7072": 5508, + "7073": 5508, + "7074": 5509, + "7075": 5509, + "7076": 5510, + "7077": 5510, + "7078": 5511, + "7079": 5512, + "7080": 5513, + "7081": 5513, + "7082": 5513, + "7083": 5514, + "7084": 5515, + "7085": 5515, + "7086": 5516, + "7087": 5516, + "7088": 5517, + "7089": 5517, + "7090": 5518, + "7091": 5519, + "7092": 5519, + "7093": 5520, + "7094": 5521, + "7095": 5522, + "7096": 5522, + "7097": 5522, + "7098": 5523, + "7099": 5524, + "7100": 5525, + "7101": 5526, + "7102": 5527, + "7103": 5528, + "7104": 5528, + "7105": 5529, + "7106": 5530, + "7107": 5531, + "7108": 5532, + "7109": 5532, + "7110": 5532, + "7111": 5533, + "7112": 5533, + "7113": 5534, + "7114": 5534, + "7115": 5535, + "7116": 5536, + "7117": 5537, + "7118": 5537, + "7119": 5538, + "7120": 5538, + "7121": 5539, + "7122": 5539, + "7123": 5540, + "7124": 5541, + "7125": 5541, + "7126": 5541, + "7127": 5542, + "7128": 5543, + "7129": 5543, + "7130": 5544, + "7131": 5544, + "7132": 5545, + "7133": 5545, + "7134": 5546, + "7135": 5547, + "7136": 5547, + "7137": 5551, + "7138": 5551, + "7139": 5552, + "7140": 5553, + "7141": 5553, + "7142": 5554, + "7143": 5555, + "7144": 5556, + "7145": 5556, + "7146": 5557, + "7147": 5557, + "7148": 5558, + "7149": 5559, + "7150": 5560, + "7151": 5561, + "7152": 5562, + "7153": 5562, + "7154": 5563, + "7155": 5564, + "7156": 5565, + "7157": 5566, + "7158": 5567, + "7159": 5568, + "7160": 5569, + "7161": 5570, + "7162": 5571, + "7163": 5572, + "7164": 5573, + "7165": 5574, + "7166": 5575, + "7167": 5578, + "7168": 5578, + "7169": 5579, + "7170": 5580, + "7171": 5581, + "7172": 5581, + "7173": 5582, + "7174": 5583, + "7175": 5584, + "7176": 5585, + "7177": 5586, + "7178": 5587, + "7179": 5587, + "7180": 5587, + "7181": 5588, + "7182": 5589, + "7183": 5592, + "7184": 5592, + "7185": 5592, + "7186": 5596, + "7187": 5597, + "7188": 5598, + "7189": 5598, + "7190": 5599, + "7191": 5599, + "7192": 5600, + "7193": 5600, + "7194": 5601, + "7195": 5601, + "7196": 5602, + "7197": 5602, + "7198": 5603, + "7199": 5603, + "7200": 5604, + "7201": 5605, + "7202": 5605, + "7203": 5605, + "7204": 5606, + "7205": 5607, + "7206": 5607, + "7207": 5608, + "7208": 5608, + "7209": 5609, + "7210": 5609, + "7211": 5610, + "7212": 5611, + "7213": 5611, + "7214": 5612, + "7215": 5612, + "7216": 5613, + "7217": 5614, + "7218": 5614, + "7219": 5614, + "7220": 5615, + "7221": 5615, + "7222": 5616, + "7223": 5617, + "7224": 5617, + "7225": 5617, + "7226": 5618, + "7227": 5619, + "7228": 5619, + "7229": 5620, + "7230": 5621, + "7231": 5621, + "7232": 5621, + "7233": 5622, + "7234": 5623, + "7235": 5623, + "7236": 5624, + "7237": 5625, + "7238": 5626, + "7239": 5627, + "7240": 5628, + "7241": 5628, + "7242": 5629, + "7243": 5630, + "7244": 5631, + "7245": 5632, + "7246": 5632, + "7247": 5632, + "7248": 5633, + "7249": 5633, + "7250": 5634, + "7251": 5634, + "7252": 5635, + "7253": 5636, + "7254": 5637, + "7255": 5637, + "7256": 5638, + "7257": 5638, + "7258": 5639, + "7259": 5639, + "7260": 5640, + "7261": 5641, + "7262": 5641, + "7263": 5645, + "7264": 5645, + "7265": 5646, + "7266": 5647, + "7267": 5647, + "7268": 5648, + "7269": 5649, + "7270": 5650, + "7271": 5650, + "7272": 5651, + "7273": 5651, + "7274": 5652, + "7275": 5653, + "7276": 5654, + "7277": 5655, + "7278": 5656, + "7279": 5657, + "7280": 5658, + "7281": 5659, + "7282": 5660, + "7283": 5661, + "7284": 5662, + "7285": 5663, + "7286": 5663, + "7287": 5663, + "7288": 5663, + "7289": 5663, + "7290": 5663, + "7291": 5664, + "7292": 5665, + "7293": 5666, + "7294": 5667, + "7295": 5668, + "7296": 5669, + "7297": 5672, + "7298": 5672, + "7299": 5673, + "7300": 5674, + "7301": 5675, + "7302": 5675, + "7303": 5676, + "7304": 5677, + "7305": 5678, + "7306": 5679, + "7307": 5680, + "7308": 5681, + "7309": 5681, + "7310": 5681, + "7311": 5682, + "7312": 5683, + "7313": 5686, + "7314": 5686, + "7315": 5686, + "7316": 5690, + "7317": 5691, + "7318": 5692, + "7319": 5692, + "7320": 5693, + "7321": 5693, + "7322": 5694, + "7323": 5694, + "7324": 5695, + "7325": 5695, + "7326": 5696, + "7327": 5696, + "7328": 5697, + "7329": 5698, + "7330": 5699, + "7331": 5699, + "7332": 5699, + "7333": 5700, + "7334": 5701, + "7335": 5701, + "7336": 5702, + "7337": 5702, + "7338": 5703, + "7339": 5703, + "7340": 5704, + "7341": 5705, + "7342": 5705, + "7343": 5706, + "7344": 5707, + "7345": 5708, + "7346": 5708, + "7347": 5708, + "7348": 5709, + "7349": 5710, + "7350": 5711, + "7351": 5712, + "7352": 5713, + "7353": 5714, + "7354": 5714, + "7355": 5715, + "7356": 5716, + "7357": 5717, + "7358": 5718, + "7359": 5718, + "7360": 5718, + "7361": 5719, + "7362": 5719, + "7363": 5720, + "7364": 5720, + "7365": 5721, + "7366": 5722, + "7367": 5723, + "7368": 5723, + "7369": 5724, + "7370": 5724, + "7371": 5725, + "7372": 5725, + "7373": 5726, + "7374": 5727, + "7375": 5727, + "7376": 5727, + "7377": 5728, + "7378": 5729, + "7379": 5729, + "7380": 5730, + "7381": 5730, + "7382": 5731, + "7383": 5731, + "7384": 5732, + "7385": 5733, + "7386": 5733, + "7387": 5737, + "7388": 5737, + "7389": 5738, + "7390": 5739, + "7391": 5739, + "7392": 5740, + "7393": 5741, + "7394": 5742, + "7395": 5742, + "7396": 5743, + "7397": 5743, + "7398": 5744, + "7399": 5745, + "7400": 5746, + "7401": 5747, + "7402": 5748, + "7403": 5748, + "7404": 5749, + "7405": 5750, + "7406": 5751, + "7407": 5752, + "7408": 5753, + "7409": 5754, + "7410": 5755, + "7411": 5756, + "7412": 5757, + "7413": 5757, + "7414": 5758, + "7415": 5758, + "7416": 5759, + "7417": 5760, + "7418": 5760, + "7419": 5761, + "7420": 5762, + "7421": 5762, + "7422": 5762, + "7423": 5763, + "7424": 5763, + "7425": 5764, + "7426": 5765, + "7427": 5765, + "7428": 5765, + "7429": 5766, + "7430": 5767, + "7431": 5768, + "7432": 5769, + "7433": 5770, + "7434": 5771, + "7435": 5771, + "7436": 5771, + "7437": 5772, + "7438": 5773, + "7439": 5773, + "7440": 5774, + "7441": 5774, + "7442": 5778, + "7443": 5778, + "7444": 5779, + "7445": 5780, + "7446": 5781, + "7447": 5782, + "7448": 5783, + "7449": 5786, + "7450": 5786, + "7451": 5787, + "7452": 5787, + "7453": 5787, + "7454": 5788, + "7455": 5788, + "7456": 5789, + "7457": 5790, + "7458": 5791, + "7459": 5791, + "7460": 5791, + "7461": 5792, + "7462": 5792, + "7463": 5793, + "7464": 5794, + "7465": 5795, + "7466": 5796, + "7467": 5796, + "7468": 5796, + "7469": 5796, + "7470": 5799, + "7471": 5799, + "7472": 5799, + "7473": 5799, + "7474": 5799, + "7475": 5799, + "7476": 5800, + "7477": 5800, + "7478": 5800, + "7479": 5800, + "7480": 5800, + "7481": 5800, + "7482": 5801, + "7483": 5801, + "7484": 5801, + "7485": 5801, + "7486": 5801, + "7487": 5801, + "7488": 5802, + "7489": 5802, + "7490": 5802, + "7491": 5802, + "7492": 5802, + "7493": 5802, + "7494": 5803, + "7495": 5803, + "7496": 5803, + "7497": 5803, + "7498": 5803, + "7499": 5803, + "7500": 5804, + "7501": 5804, + "7502": 5804, + "7503": 5804, + "7504": 5804, + "7505": 5804, + "7506": 5805, + "7507": 5805, + "7508": 5805, + "7509": 5805, + "7510": 5805, + "7511": 5805, + "7512": 5806, + "7513": 5806, + "7514": 5806, + "7515": 5806, + "7516": 5806, + "7517": 5806, + "7518": 5807, + "7519": 5807, + "7520": 5807, + "7521": 5807, + "7522": 5807, + "7523": 5807, + "7524": 5808, + "7525": 5808, + "7526": 5808, + "7527": 5808, + "7528": 5808, + "7529": 5808, + "7530": 5809, + "7531": 5809, + "7532": 5809, + "7533": 5809, + "7534": 5809, + "7535": 5809, + "7536": 5810, + "7537": 5810, + "7538": 5810, + "7539": 5810, + "7540": 5810, + "7541": 5810, + "7542": 5811, + "7543": 5811, + "7544": 5811, + "7545": 5811, + "7546": 5811, + "7547": 5811, + "7548": 5812, + "7549": 5812, + "7550": 5812, + "7551": 5812, + "7552": 5812, + "7553": 5812, + "7554": 5813, + "7555": 5813, + "7556": 5813, + "7557": 5813, + "7558": 5813, + "7559": 5813, + "7560": 5814, + "7561": 5814, + "7562": 5814, + "7563": 5814, + "7564": 5814, + "7565": 5814, + "7566": 5815, + "7567": 5815, + "7568": 5815, + "7569": 5815, + "7570": 5815, + "7571": 5815, + "7572": 5816, + "7573": 5816, + "7574": 5816, + "7575": 5816, + "7576": 5816, + "7577": 5816, + "7578": 5817, + "7579": 5817, + "7580": 5817, + "7581": 5817, + "7582": 5817, + "7583": 5817, + "7584": 5818, + "7585": 5818, + "7586": 5818, + "7587": 5818, + "7588": 5818, + "7589": 5818, + "7590": 5819, + "7591": 5819, + "7592": 5819, + "7593": 5819, + "7594": 5819, + "7595": 5819, + "7596": 5820, + "7597": 5820, + "7598": 5820, + "7599": 5820, + "7600": 5820, + "7601": 5820, + "7602": 5821, + "7603": 5821, + "7604": 5821, + "7605": 5821, + "7606": 5821, + "7607": 5821, + "7608": 5822, + "7609": 5822, + "7610": 5822, + "7611": 5822, + "7612": 5822, + "7613": 5822, + "7614": 5823, + "7615": 5823, + "7616": 5823, + "7617": 5823, + "7618": 5823, + "7619": 5823, + "7620": 5824, + "7621": 5824, + "7622": 5824, + "7623": 5824, + "7624": 5824, + "7625": 5824, + "7626": 5825, + "7627": 5825, + "7628": 5825, + "7629": 5825, + "7630": 5825, + "7631": 5825, + "7632": 5826, + "7633": 5826, + "7634": 5826, + "7635": 5826, + "7636": 5826, + "7637": 5826, + "7638": 5827, + "7639": 5827, + "7640": 5827, + "7641": 5827, + "7642": 5827, + "7643": 5827, + "7644": 5828, + "7645": 5828, + "7646": 5828, + "7647": 5828, + "7648": 5828, + "7649": 5828, + "7650": 5829, + "7651": 5829, + "7652": 5829, + "7653": 5829, + "7654": 5829, + "7655": 5829, + "7656": 5830, + "7657": 5830, + "7658": 5830, + "7659": 5830, + "7660": 5830, + "7661": 5830, + "7662": 5831, + "7663": 5831, + "7664": 5831, + "7665": 5831, + "7666": 5831, + "7667": 5831, + "7668": 5832, + "7669": 5832, + "7670": 5832, + "7671": 5832, + "7672": 5832, + "7673": 5832, + "7674": 5833, + "7675": 5833, + "7676": 5833, + "7677": 5833, + "7678": 5833, + "7679": 5833, + "7680": 5834, + "7681": 5834, + "7682": 5834, + "7683": 5834, + "7684": 5834, + "7685": 5834, + "7686": 5835, + "7687": 5835, + "7688": 5835, + "7689": 5835, + "7690": 5835, + "7691": 5835, + "7692": 5836, + "7693": 5836, + "7694": 5836, + "7695": 5836, + "7696": 5836, + "7697": 5836, + "7698": 5837, + "7699": 5837, + "7700": 5837, + "7701": 5837, + "7702": 5837, + "7703": 5837, + "7704": 5838, + "7705": 5838, + "7706": 5838, + "7707": 5838, + "7708": 5838, + "7709": 5838, + "7710": 5839, + "7711": 5839, + "7712": 5839, + "7713": 5839, + "7714": 5839, + "7715": 5839, + "7716": 5840, + "7717": 5840, + "7718": 5840, + "7719": 5840, + "7720": 5840, + "7721": 5840, + "7722": 5841, + "7723": 5841, + "7724": 5841, + "7725": 5841, + "7726": 5841, + "7727": 5841, + "7728": 5842, + "7729": 5842, + "7730": 5842, + "7731": 5842, + "7732": 5842, + "7733": 5842, + "7734": 5843, + "7735": 5843, + "7736": 5843, + "7737": 5843, + "7738": 5843, + "7739": 5843, + "7740": 5844, + "7741": 5844, + "7742": 5844, + "7743": 5844, + "7744": 5844, + "7745": 5844, + "7746": 5845, + "7747": 5845, + "7748": 5845, + "7749": 5845, + "7750": 5845, + "7751": 5845, + "7752": 5846, + "7753": 5846, + "7754": 5846, + "7755": 5846, + "7756": 5846, + "7757": 5846, + "7758": 5847, + "7759": 5847, + "7760": 5847, + "7761": 5847, + "7762": 5847, + "7763": 5847, + "7764": 5848, + "7765": 5848, + "7766": 5848, + "7767": 5848, + "7768": 5848, + "7769": 5848, + "7770": 5849, + "7771": 5849, + "7772": 5849, + "7773": 5849, + "7774": 5849, + "7775": 5849, + "7776": 5850, + "7777": 5850, + "7778": 5850, + "7779": 5850, + "7780": 5850, + "7781": 5850, + "7782": 5851, + "7783": 5851, + "7784": 5851, + "7785": 5851, + "7786": 5851, + "7787": 5851, + "7788": 5852, + "7789": 5852, + "7790": 5852, + "7791": 5852, + "7792": 5852, + "7793": 5852, + "7794": 5853, + "7795": 5853, + "7796": 5853, + "7797": 5853, + "7798": 5853, + "7799": 5853, + "7800": 5854, + "7801": 5854, + "7802": 5854, + "7803": 5854, + "7804": 5854, + "7805": 5854, + "7806": 5855, + "7807": 5855, + "7808": 5855, + "7809": 5855, + "7810": 5855, + "7811": 5855, + "7812": 5856, + "7813": 5856, + "7814": 5856, + "7815": 5856, + "7816": 5856, + "7817": 5856, + "7818": 5857, + "7819": 5857, + "7820": 5857, + "7821": 5858 } \ No newline at end of file diff --git a/tests/contracts/abi.algo.ts b/tests/contracts/abi.algo.ts index 7ec2ec67d..3aec01613 100644 --- a/tests/contracts/abi.algo.ts +++ b/tests/contracts/abi.algo.ts @@ -1,9 +1,3 @@ -/* eslint-disable import/extensions */ -/* eslint-disable import/no-unresolved */ -/* eslint-disable class-methods-use-this */ -/* eslint-disable no-unused-expressions */ -/* eslint-disable no-undef */ - import { Contract } from '../../src/lib/index'; type CustomType = { @@ -482,18 +476,33 @@ class AbiTest extends Contract { return a[i]; } - /* - // const txnTypes: Record = { - Transaction: 'txn', - AppCallTxn: 'appl', - AssetConfigTxn: 'acfg', - AssetFreezeTxn: 'afrz', - AssetTransferTxn: 'axfer', - KeyRegistrationTxn: 'keyreg', - PaymentTxn: 'pay', - }; - */ + dynamicArrayInMiddleOfTuple(): [uint16, uint8[], uint16] { + const a: [uint16, uint8[], uint16] = [1, [2], 3]; + + return a; + } + + accessDynamicArrayInMiddleOfTuple(): uint8[] { + const a: [uint16, uint8[], uint16] = [1, [2], 3]; + + return a[1]; + } + + accessDynamicArrayElementInTuple(): uint32 { + const a: [uint16, uint8[]] = [11, [22, 33, 44]]; + return a[1][1]; + } + + updateDynamicArrayInMiddleOfTuple(): [uint16, uint8[], uint16] { + const a: [uint16, uint8[], uint16] = [1, [2], 3]; + + a[1] = [4, 5]; + + return a; + } + + /* txnTypes( t: Txn, a: AppCallTxn, @@ -508,4 +517,5 @@ class AbiTest extends Contract { assert(at.sender === kr.sender); assert(p.sender === t.sender); } + */ } diff --git a/tests/contracts/clients/abitest_client.ts b/tests/contracts/clients/abitest_client.ts index 3aa340ab4..4f4cbf07f 100644 --- a/tests/contracts/clients/abitest_client.ts +++ b/tests/contracts/clients/abitest_client.ts @@ -4,7 +4,7 @@ export class AbiTest extends bkr.ApplicationClient { desc: string = ""; override appSchema: bkr.Schema = { declared: { gRef: { type: bkr.AVMType.bytes, key: "gRef", desc: "", static: false }, gMap: { type: bkr.AVMType.bytes, key: "gMap", desc: "", static: false } }, reserved: {} }; override acctSchema: bkr.Schema = { declared: { lRef: { type: bkr.AVMType.bytes, key: "lRef", desc: "", static: false }, lMap: { type: bkr.AVMType.bytes, key: "lMap", desc: "", static: false } }, reserved: {} }; - override approvalProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKcHJlQXJyYXlBY2Nlc3M6Cglwcm90byAzIDAKCWZyYW1lX2RpZyAtMyAvLyBmdWxsIHR1cGxlCglzdG9yZSAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZCBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgYXJyYXkgb2Zmc2V0CglzdG9yZSAxIC8vIGFycmF5IG9mZnNldAoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgYXJyYXkgbGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gdHlwZSBsZW5ndGgKCSogLy8gYXJyYXkgc2l6ZQoJaW50IDIKCSsgLy8gYXJyYXkgc2l6ZSArIGxlbgoJc3RvcmUgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJcmV0c3ViCgp1cGRhdGVEeW5hbWljRWxlbWVudDoKCXByb3RvIDggMQoJZnJhbWVfZGlnIC04IC8vIG5ld0FycmF5CglzdG9yZSA2IC8vIG5ldyBhcnJheQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWludCAwCglmcmFtZV9kaWcgLTIgLy8gc3RhcnRPZkhlYWRzCglleHRyYWN0MwoJc3RvcmUgMyAvLyBzdGF0aWMgcGFydCBvZiB0dXBsZQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2RpZyAtMiAvLyBzdGFydE9mSGVhZHMKCWZyYW1lX2RpZyAtMyAvLyB0b3RhbEhlYWRMZW5ndGgKCWV4dHJhY3QzIAoJc3RvcmUgNCAvLyBkeW5hbWljIGhlYWRzCglieXRlIDB4CglkdXAKCXN0b3JlIDUgLy8gdmFsdWVzIGFmdGVyIGFycmF5CglzdG9yZSA3IC8vIHZhbHVlcyBiZWZvcmUgYXJyYXkKCWZyYW1lX2RpZyAtNCAvLyBsYXN0RHluYW1pY0VsZW1lbnQKCWJueiBza2lwX3ZhbHVlc19hZnRlcl9hcnJheQoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJKwoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxlbgoJc3Vic3RyaW5nMwoJc3RvcmUgNSAvLyB2YWx1ZXMgYWZ0ZXIgYXJyYXkKCnNraXBfdmFsdWVzX2FmdGVyX2FycmF5OgoJZnJhbWVfZGlnIC01IC8vIGZpcnN0RHluYW1pY0VsZW1lbnQKCWJueiBza2lwX3ZhbHVlc19iZWZvcmVfYXJyYXkKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZEVuZAoJbG9hZCAxIC8vIGFycmF5IG9mZnNldAoJc3Vic3RyaW5nMwoJc3RvcmUgNyAvLyB2YWx1ZXMgYmVmb3JlIGFycmF5Cgpza2lwX3ZhbHVlc19iZWZvcmVfYXJyYXk6Cglsb2FkIDQgLy8gZHluYW1pYyBoZWFkcwoJZnJhbWVfZGlnIC02IC8vIGhlYWRVcGRhdGVCaXRtYXNrCglsb2FkIDYgLy8gbmV3IGFycmF5CglsZW4KCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJbG9hZCA2IC8vIG5ldyBhcnJheQoJbGVuCglsb2FkIDIgLy8gZnVsbCBhcnJheSBsZW5ndGgKCT49Cglibnogc2tpcF9sZW5fc3dhcAoJc3dhcAoKc2tpcF9sZW5fc3dhcDoKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglkdXAKCWNvbmNhdAoJZHVwCgljb25jYXQKCWR1cAoJY29uY2F0CglkdXAKCWNvbmNhdAoJZHVwCgljb25jYXQKCWImCglsb2FkIDYgLy8gbmV3IGFycmF5CglsZW4KCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJPj0KCWJueiBhZGRfaGVhZAoJYi0KCWIgc3ViX29yX2FkZF9oZWFkX2VuZAoKYWRkX2hlYWQ6CgliKwoKc3ViX29yX2FkZF9oZWFkX2VuZDoKCWZyYW1lX2RpZyAtNyAvLyBmdWxsSGVhZEJpdG1hc2sKCWImCglzdG9yZSA0IC8vIGR5bmFtaWMgaGVhZHMKCWxvYWQgMyAvLyBzdGF0aWMgcGFydCBvZiB0dXBsZQoJbG9hZCA0IC8vIGR5bmFtaWMgaGVhZHMKCWxvYWQgNyAvLyB2YWx1ZXMgYmVmb3JlIGFycmF5Cglsb2FkIDYgLy8gbmV3IGFycmF5Cglsb2FkIDUgLy8gdmFsdWVzIGFmdGVyIGFycmF5Cgljb25jYXQKCWNvbmNhdAoJY29uY2F0Cgljb25jYXQKCXJldHN1YgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCXBvcAoJY2FsbHN1YiBjcmVhdGUKCWludCAxCglyZXR1cm4KCmNyZWF0ZToKCXByb3RvIDAgMAoJcmV0c3ViCgpiYXJlX3JvdXRlX09wdEluOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE9wdEluCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJcG9wCgljYWxsc3ViIG9wdEluCglpbnQgMQoJcmV0dXJuCgpvcHRJbjoKCXByb3RvIDAgMAoJcmV0c3ViCgphYmlfcm91dGVfc3RhdGljQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMAoJY2FsbHN1YiBzdGF0aWNBcnJheQoJaW50IDEKCXJldHVybgoKc3RhdGljQXJyYXk6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzUKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDBiMDAwMDAwMDAwMDAwMDAxNjAwMDAwMDAwMDAwMDAwMjEKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM3CgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWludCA4IC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9yZXR1cm5TdGF0aWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIHJldHVyblN0YXRpY0FycmF5CglpbnQgMQoJcmV0dXJuCgpyZXR1cm5TdGF0aWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MQoJLy8gYTogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsxMSwgMjIsIDMzXQoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDE2MDAwMDAwMDAwMDAwMDAyMQoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDMKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3RhdGljQXJyYXlBcmc6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCXBvcAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJY2FsbHN1YiBzdGF0aWNBcnJheUFyZwoJaW50IDEKCXJldHVybgoKc3RhdGljQXJyYXlBcmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDcKCS8vIHJldHVybiBhWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJaW50IDggLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX25vbkxpdGVyYWxTdGF0aWNBcnJheUVsZW1lbnRzOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDMKCWNhbGxzdWIgbm9uTGl0ZXJhbFN0YXRpY0FycmF5RWxlbWVudHMKCWludCAxCglyZXR1cm4KCm5vbkxpdGVyYWxTdGF0aWNBcnJheUVsZW1lbnRzOgoJcHJvdG8gNCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjUxCgkvLyBuMSA9IDExCglpbnQgMTEKCWZyYW1lX2J1cnkgLTEgLy8gbjE6IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo1MgoJLy8gbjIgPSAyMgoJaW50IDIyCglmcmFtZV9idXJ5IC0yIC8vIG4yOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NTMKCS8vIG4zID0gMzMKCWludCAzMwoJZnJhbWVfYnVyeSAtMyAvLyBuMzogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjU0CgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gW24xLCBuMiwgbjNdCglmcmFtZV9kaWcgLTEgLy8gbjE6IHVpbnQ2NAoJaXRvYgoJZnJhbWVfZGlnIC0yIC8vIG4yOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfZGlnIC0zIC8vIG4zOiB1aW50NjQKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAtNCAvLyBhOiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NTYKCS8vIHJldHVybiBhWzFdOwoJZnJhbWVfZGlnIC00IC8vIGE6IHVpbnQ2NFszXQoJaW50IDggLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX21peGVkU3RhdGljQXJyYXlFbGVtZW50czoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAzCgljYWxsc3ViIG1peGVkU3RhdGljQXJyYXlFbGVtZW50cwoJaW50IDEKCXJldHVybgoKbWl4ZWRTdGF0aWNBcnJheUVsZW1lbnRzOgoJcHJvdG8gNCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjYwCgkvLyBuMSA9IDMKCWludCAzCglmcmFtZV9idXJ5IC0xIC8vIG4xOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NjEKCS8vIG4yID0gNAoJaW50IDQKCWZyYW1lX2J1cnkgLTIgLy8gbjI6IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo2MgoJLy8gbjMgPSA1CglpbnQgNQoJZnJhbWVfYnVyeSAtMyAvLyBuMzogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjYzCgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDk+ID0gWzAsIDEsIDIsIG4xLCBuMiwgbjMsIDYsIDcsIDhdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyCglmcmFtZV9kaWcgLTEgLy8gbjE6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTIgLy8gbjI6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglmcmFtZV9kaWcgLTMgLy8gbjM6IHVpbnQ2NAoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAwMDAwMDAwMDAwMDAwNjAwMDAwMDAwMDAwMDAwMDcwMDAwMDAwMDAwMDAwMDA4Cgljb25jYXQKCWZyYW1lX2J1cnkgLTQgLy8gYTogdWludDY0WzldCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjY1CgkvLyByZXR1cm4gYVsxXSArIGFbNF0gKyBhWzddOwoJZnJhbWVfZGlnIC00IC8vIGE6IHVpbnQ2NFs5XQoJaW50IDggLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyBhOiB1aW50NjRbOV0KCWludCAzMiAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJKwoJZnJhbWVfZGlnIC00IC8vIGE6IHVpbnQ2NFs5XQoJaW50IDU2IC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCgkrCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9ub25MaXRlcmFsU3RhdGljQXJyYXlBY2Nlc3M6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMQoJY2FsbHN1YiBub25MaXRlcmFsU3RhdGljQXJyYXlBY2Nlc3MKCWludCAxCglyZXR1cm4KCm5vbkxpdGVyYWxTdGF0aWNBcnJheUFjY2VzczoKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo2OQoJLy8gYTogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsxMSwgMjIsIDMzXQoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDE2MDAwMDAwMDAwMDAwMDAyMQoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NzAKCS8vIG4gPSAyCglpbnQgMgoJZnJhbWVfYnVyeSAtMiAvLyBuOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NzIKCS8vIHJldHVybiBhW25dOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJZnJhbWVfZGlnIC0yIC8vIG46IHVpbnQ2NAoJaW50IDgKCSoKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc2V0U3RhdGljQXJyYXlFbGVtZW50OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCWNhbGxzdWIgc2V0U3RhdGljQXJyYXlFbGVtZW50CglpbnQgMQoJcmV0dXJuCgpzZXRTdGF0aWNBcnJheUVsZW1lbnQ6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NzYKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDBiMDAwMDAwMDAwMDAwMDAxNjAwMDAwMDAwMDAwMDAwMjEKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjc4CgkvLyBhWzFdID0gMjIyCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglpbnQgOCAvLyBvZmZzZXQKCWludCAyMjIKCWl0b2IKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo4MAoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3RhdGljQXJyYXlJblN0b3JhZ2VSZWY6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMQoJY2FsbHN1YiBzdGF0aWNBcnJheUluU3RvcmFnZVJlZgoJaW50IDEKCXJldHVybgoKc3RhdGljQXJyYXlJblN0b3JhZ2VSZWY6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6ODQKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDBiMDAwMDAwMDAwMDAwMDAxNjAwMDAwMDAwMDAwMDAwMjEKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjg2CgkvLyB0aGlzLmdSZWYucHV0KGEpCglieXRlICJnUmVmIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYXBwX2dsb2JhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6ODcKCS8vIHRoaXMubFJlZi5wdXQodGhpcy50eG4uc2VuZGVyLCBhKQoJdHhuIFNlbmRlcgoJYnl0ZSAibFJlZiIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9sb2NhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6ODgKCS8vIHRoaXMuYlJlZi5wdXQoYSkKCWJ5dGUgImJSZWYiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglib3hfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjkwCgkvLyByZXQ6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbCglieXRlICJnUmVmIgoJYXBwX2dsb2JhbF9nZXQKCWludCA4IC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCgl0eG4gU2VuZGVyCglieXRlICJsUmVmIgoJYXBwX2xvY2FsX2dldAoJaW50IDggLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJYnl0ZSAiYlJlZiIKCWJveF9nZXQKCWFzc2VydAoJaW50IDggLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMiAvLyByZXQ6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo5NgoJLy8gcmV0dXJuIHJldDsKCWZyYW1lX2RpZyAtMiAvLyByZXQ6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VSZWY6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMQoJY2FsbHN1YiB1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZVJlZgoJaW50IDEKCXJldHVybgoKdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VSZWY6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTAwCgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMDIKCS8vIHRoaXMuZ1JlZi5wdXQoYSkKCWJ5dGUgImdSZWYiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfZ2xvYmFsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMDMKCS8vIHRoaXMubFJlZi5wdXQodGhpcy50eG4uc2VuZGVyLCBhKQoJdHhuIFNlbmRlcgoJYnl0ZSAibFJlZiIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9sb2NhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTA0CgkvLyB0aGlzLmJSZWYucHV0KGEpCglieXRlICJiUmVmIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMDYKCS8vIHRoaXMuZ1JlZi5nZXQoKVsxXSA9IDExMQoJYnl0ZSAiZ1JlZiIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgOCAvLyBvZmZzZXQKCWludCAxMTEKCWl0b2IKCXJlcGxhY2UzCglieXRlICJnUmVmIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTA3CgkvLyB0aGlzLmxSZWYuZ2V0KHRoaXMudHhuLnNlbmRlcilbMV0gPSAyMjIKCXR4biBTZW5kZXIKCWJ5dGUgImxSZWYiCglhcHBfbG9jYWxfZ2V0CglpbnQgOCAvLyBvZmZzZXQKCWludCAyMjIKCWl0b2IKCXJlcGxhY2UzCgl0eG4gU2VuZGVyCglieXRlICJsUmVmIgoJdW5jb3ZlciAyCglhcHBfbG9jYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEwOAoJLy8gdGhpcy5iUmVmLmdldCgpWzFdID0gMzMzCglieXRlICJiUmVmIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgOCAvLyBvZmZzZXQKCWludCAzMzMKCWl0b2IKCXJlcGxhY2UzCglieXRlICJiUmVmIgoJc3dhcAoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMTAKCS8vIHJldDogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsKCWJ5dGUgImdSZWYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDggLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCXR4biBTZW5kZXIKCWJ5dGUgImxSZWYiCglhcHBfbG9jYWxfZ2V0CglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlICJiUmVmIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIHJldDogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjExNgoJLy8gcmV0dXJuIHJldDsKCWZyYW1lX2RpZyAtMiAvLyByZXQ6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMQoJY2FsbHN1YiBzdGF0aWNBcnJheUluU3RvcmFnZU1hcAoJaW50IDEKCXJldHVybgoKc3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTIwCgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMjIKCS8vIHRoaXMuZ01hcC5wdXQoJ2dNYXAnLCBhKQoJYnl0ZSAiZ01hcCIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9nbG9iYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEyMwoJLy8gdGhpcy5sTWFwLnB1dCh0aGlzLnR4bi5zZW5kZXIsICdsTWFwJywgYSkKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfbG9jYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEyNAoJLy8gdGhpcy5iTWFwLnB1dCgnYk1hcCcsIGEpCglieXRlICJiTWFwIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMjYKCS8vIHJldDogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsKCWJ5dGUgImdNYXAiCglhcHBfZ2xvYmFsX2dldAoJaW50IDggLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglhcHBfbG9jYWxfZ2V0CglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlICJiTWFwIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIHJldDogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEzMgoJLy8gcmV0dXJuIHJldDsKCWZyYW1lX2RpZyAtMiAvLyByZXQ6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMQoJY2FsbHN1YiB1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZU1hcAoJaW50IDEKCXJldHVybgoKdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTM2CgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMzgKCS8vIHRoaXMuZ01hcC5wdXQoJ2dNYXAnLCBhKQoJYnl0ZSAiZ01hcCIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9nbG9iYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEzOQoJLy8gdGhpcy5sTWFwLnB1dCh0aGlzLnR4bi5zZW5kZXIsICdsTWFwJywgYSkKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfbG9jYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE0MAoJLy8gdGhpcy5iTWFwLnB1dCgnYk1hcCcsIGEpCglieXRlICJiTWFwIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNDIKCS8vIHRoaXMuZ01hcC5nZXQoJ2dNYXAnKVsxXSA9IDExMTEKCWJ5dGUgImdNYXAiCglhcHBfZ2xvYmFsX2dldAoJaW50IDggLy8gb2Zmc2V0CglpbnQgMTExMQoJaXRvYgoJcmVwbGFjZTMKCWJ5dGUgImdNYXAiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNDMKCS8vIHRoaXMubE1hcC5nZXQodGhpcy50eG4uc2VuZGVyLCAnbE1hcCcpWzFdID0gMjIyMgoJdHhuIFNlbmRlcgoJYnl0ZSAibE1hcCIKCWFwcF9sb2NhbF9nZXQKCWludCA4IC8vIG9mZnNldAoJaW50IDIyMjIKCWl0b2IKCXJlcGxhY2UzCgl0eG4gU2VuZGVyCglieXRlICJsTWFwIgoJdW5jb3ZlciAyCglhcHBfbG9jYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE0NAoJLy8gdGhpcy5iTWFwLmdldCgnYk1hcCcpWzFdID0gMzMzMwoJYnl0ZSAiYk1hcCIKCWJveF9nZXQKCWFzc2VydAoJaW50IDggLy8gb2Zmc2V0CglpbnQgMzMzMwoJaXRvYgoJcmVwbGFjZTMKCWJ5dGUgImJNYXAiCglzd2FwCglib3hfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE0NgoJLy8gcmV0OiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWwoJYnl0ZSAiZ01hcCIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJdHhuIFNlbmRlcgoJYnl0ZSAibE1hcCIKCWFwcF9sb2NhbF9nZXQKCWludCA4IC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCgljb25jYXQKCWJ5dGUgImJNYXAiCglib3hfZ2V0Cglhc3NlcnQKCWludCA4IC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2J1cnkgLTIgLy8gcmV0OiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTUyCgkvLyByZXR1cm4gcmV0OwoJZnJhbWVfZGlnIC0yIC8vIHJldDogdWludDY0WzNdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9uZXN0ZWRTdGF0aWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIG5lc3RlZFN0YXRpY0FycmF5CglpbnQgMQoJcmV0dXJuCgpuZXN0ZWRTdGF0aWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNTYKCS8vIGE6IFN0YXRpY0FycmF5PFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4sIDM+ID0gW1sxMSwgMjIsIDMzXSwgWzQ0LCA1NSwgNjZdLCBbNzcsIDg4LCA5OV1dCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxMDAwMDAwMDAwMDAwMDAyYzAwMDAwMDAwMDAwMDAwMzcwMDAwMDAwMDAwMDAwMDQyMDAwMDAwMDAwMDAwMDA0ZDAwMDAwMDAwMDAwMDAwNTgwMDAwMDAwMDAwMDAwMDYzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXVszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNTgKCS8vIHJldHVybiBhWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXVszXQoJaW50IDMyIC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVOZXN0ZWRTdGF0aWNBcnJheUVsZW1lbnQ6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMAoJY2FsbHN1YiB1cGRhdGVOZXN0ZWRTdGF0aWNBcnJheUVsZW1lbnQKCWludCAxCglyZXR1cm4KCnVwZGF0ZU5lc3RlZFN0YXRpY0FycmF5RWxlbWVudDoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNjIKCS8vIGE6IFN0YXRpY0FycmF5PFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4sIDM+ID0gW1sxMSwgMjIsIDMzXSwgWzQ0LCA1NSwgNjZdLCBbNzcsIDg4LCA5OV1dCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxMDAwMDAwMDAwMDAwMDAyYzAwMDAwMDAwMDAwMDAwMzcwMDAwMDAwMDAwMDAwMDQyMDAwMDAwMDAwMDAwMDA0ZDAwMDAwMDAwMDAwMDAwNTgwMDAwMDAwMDAwMDAwMDYzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXVszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNjQKCS8vIGFbMV1bMV0gPSA1NTUKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM11bM10KCWludCAzMiAvLyBvZmZzZXQKCWludCA1NTUKCWl0b2IKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXVszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNjYKCS8vIHJldHVybiBhWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXVszXQoJaW50IDMyIC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVOZXN0ZWRTdGF0aWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIHVwZGF0ZU5lc3RlZFN0YXRpY0FycmF5CglpbnQgMQoJcmV0dXJuCgp1cGRhdGVOZXN0ZWRTdGF0aWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNzAKCS8vIGE6IFN0YXRpY0FycmF5PFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4sIDM+ID0gW1sxMSwgMjIsIDMzXSwgWzQ0LCA1NSwgNjZdLCBbNzcsIDg4LCA5OV1dCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxMDAwMDAwMDAwMDAwMDAyYzAwMDAwMDAwMDAwMDAwMzcwMDAwMDAwMDAwMDAwMDQyMDAwMDAwMDAwMDAwMDA0ZDAwMDAwMDAwMDAwMDAwNTgwMDAwMDAwMDAwMDAwMDYzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXVszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNzIKCS8vIGFbMV0gPSBbNDQ0LCA1NTUsIDY2Nl0KCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM11bM10KCWludCAyNCAvLyBvZmZzZXQKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMWJjMDAwMDAwMDAwMDAwMDIyYjAwMDAwMDAwMDAwMDAyOWEKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXVszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNzQKCS8vIHJldHVybiBhWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXVszXQoJaW50IDMyIC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV90aHJlZURpbWVuc2lvbmFsVWludDE2QXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMAoJY2FsbHN1YiB0aHJlZURpbWVuc2lvbmFsVWludDE2QXJyYXkKCWludCAxCglyZXR1cm4KCnRocmVlRGltZW5zaW9uYWxVaW50MTZBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNzgKCS8vIGE6IFN0YXRpY0FycmF5PFN0YXRpY0FycmF5PFN0YXRpY0FycmF5PHVpbnQxNiwgMj4sIDI+LCAyPiA9IFsKCWJ5dGUgMHgwMDBiMDAxNjAwMjEwMDJjMDAzNzAwNDIwMDRkMDA1OAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbMl1bMl1bMl0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTgyCgkvLyBhWzFdWzFdID0gWzc3NywgODg4XQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNlsyXVsyXVsyXQoJaW50IDEyIC8vIG9mZnNldAoJYnl0ZSAweDAzMDkwMzc4CglyZXBsYWNlMwoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbMl1bMl1bMl0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTg0CgkvLyByZXR1cm4gYVsxXVsxXVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbMl1bMl1bMl0KCWludCAxNCAvLyBvZmZzZXQKCWludCAyCglleHRyYWN0MwoJYnl0ZSAweEZGRkYKCWImCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zaW1wbGVUdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIHNpbXBsZVR1cGxlCglpbnQgMQoJcmV0dXJuCgpzaW1wbGVUdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxODgKCS8vIGE6IFt1aW50NjQsIHVpbnQxNiwgdWludDY0LCB1aW50MTZdID0gWzExLCAyMiwgMzMsIDQ0XQoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMGIwMDE2MDAwMDAwMDAwMDAwMDAyMTAwMmMKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQxNl0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTkwCgkvLyByZXR1cm4gYVszXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDY0LHVpbnQxNix1aW50NjQsdWludDE2XQoJaW50IDE4IC8vIG9mZnNldAoJaW50IDIKCWV4dHJhY3QzCglieXRlIDB4RkZGRgoJYiYKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2FycmF5SW5UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIGFycmF5SW5UdXBsZQoJaW50IDEKCXJldHVybgoKYXJyYXlJblR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE5NAoJLy8gYTogW3VpbnQ2NCwgdWludDE2LCBTdGF0aWNBcnJheTx1aW50NjQsIDI+LCB1aW50MTZdID0gWwoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMGIwMDE2MDAwMDAwMDAwMDAwMDAyMTAwMDAwMDAwMDAwMDAwMmMwMDM3CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50NjQsdWludDE2LHVpbnQ2NFsyXSx1aW50MTZdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE5OAoJLy8gcmV0dXJuIGFbMl1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0WzJdLHVpbnQxNl0KCWludCAxOCAvLyBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdHVwbGVJbkFycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCWNhbGxzdWIgdHVwbGVJbkFycmF5CglpbnQgMQoJcmV0dXJuCgp0dXBsZUluQXJyYXk6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjAyCgkvLyBhOiBTdGF0aWNBcnJheTxbdWludDY0LCB1aW50MTZdLCAyPiA9IFsKCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDBiMDAxNjAwMDAwMDAwMDAwMDAwMjEwMDJjCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50NjQsdWludDE2XVsyXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMDYKCS8vIHJldHVybiBhWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50NjQsdWludDE2XVsyXQoJaW50IDE4IC8vIG9mZnNldAoJaW50IDIKCWV4dHJhY3QzCglieXRlIDB4RkZGRgoJYiYKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3R1cGxlSW5UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIHR1cGxlSW5UdXBsZQoJaW50IDEKCXJldHVybgoKdHVwbGVJblR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIxMAoJLy8gYTogW3VpbnQxNiwgdWludDE2LCBbdWludDY0LCB1aW50MTZdLCBbdWludDE2LCB1aW50NjRdXSA9IFsKCWJ5dGUgMHgwMDBiMDAxNjAwMDAwMDAwMDAwMDAwMjEwMDJjMDAzNzAwMDAwMDAwMDAwMDAwNDIKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNix1aW50MTYsW3VpbnQ2NCx1aW50MTZdLFt1aW50MTYsdWludDY0XV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjE0CgkvLyByZXR1cm4gYVszXVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2LHVpbnQxNixbdWludDY0LHVpbnQxNl0sW3VpbnQxNix1aW50NjRdXQoJaW50IDE2IC8vIG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zaG9ydFR5cGVOb3RhdGlvbjoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIHNob3J0VHlwZU5vdGF0aW9uCglpbnQgMQoJcmV0dXJuCgpzaG9ydFR5cGVOb3RhdGlvbjoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMTgKCS8vIGE6IFt1aW50MTY8Mj4sIHVpbnQ2NDwyPiwgdWludDE2PDI+XSA9IFsKCWJ5dGUgMHgwMDBiMDAxNjAwMDAwMDAwMDAwMDAwMjEwMDAwMDAwMDAwMDAwMDJjMDAzNzAwNDIKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNlsyXSx1aW50NjRbMl0sdWludDE2WzJdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMjIKCS8vIHJldHVybiBhWzJdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbMl0sdWludDY0WzJdLHVpbnQxNlsyXV0KCWludCAyMiAvLyBvZmZzZXQKCWludCAyCglleHRyYWN0MwoJYnl0ZSAweEZGRkYKCWImCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9kaXNndXN0aW5nOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCWNhbGxzdWIgZGlzZ3VzdGluZwoJaW50IDEKCXJldHVybgoKZGlzZ3VzdGluZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMjYKCS8vIGE6IFN0YXRpY0FycmF5PFt1aW50MTY8Mj4sIHVpbnQ2NCwgW3VpbnQxNiwgdWludDY0XSwgU3RhdGljQXJyYXk8dWludDY0PDI+LCAyPl0sIDI+ID0gWwoJYnl0ZSAweDAwMGIwMDE2MDAwMDAwMDAwMDAwMDAyMTAwMmMwMDAwMDAwMDAwMDAwMDM3MDAwMDAwMDAwMDAwMDA0MjAwMDAwMDAwMDAwMDAwNGQwMDAwMDAwMDAwMDAwMDU4MDAwMDAwMDAwMDAwMDA2MzAwNmYwMGRlMDAwMDAwMDAwMDAwMDE0ZDAxYmMwMDAwMDAwMDAwMDAwMjJiMDAwMDAwMDAwMDAwMDI5YTAwMDAwMDAwMDAwMDAzMDkwMDAwMDAwMDAwMDAwMzc4MDAwMDAwMDAwMDAwMDNlNwoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2WzJdLHVpbnQ2NCxbdWludDE2LHVpbnQ2NF0sdWludDY0WzJdWzJdXVsyXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMzEKCS8vIGFbMV1bM11bMV0gPSBbODg4OCwgOTk5OV0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2WzJdLHVpbnQ2NCxbdWludDE2LHVpbnQ2NF0sdWludDY0WzJdWzJdXVsyXQoJaW50IDkyIC8vIG9mZnNldAoJYnl0ZSAweDAwMDAwMDAwMDAwMDIyYjgwMDAwMDAwMDAwMDAyNzBmCglyZXBsYWNlMwoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2WzJdLHVpbnQ2NCxbdWludDE2LHVpbnQ2NF0sdWludDY0WzJdWzJdXVsyXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMzIKCS8vIHJldHVybiBhWzFdWzNdWzFdWzBdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbMl0sdWludDY0LFt1aW50MTYsdWludDY0XSx1aW50NjRbMl1bMl1dWzJdCglpbnQgOTIgLy8gb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3JldHVyblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCWNhbGxzdWIgcmV0dXJuVHVwbGUKCWludCAxCglyZXR1cm4KCnJldHVyblR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIzNgoJLy8gYTogW3VpbnQ2NCwgdWludDE2LCB1aW50NjRdID0gWzExLCAyMiwgMzNdCglieXRlIDB4MDAwMDAwMDAwMDAwMDAwYjAwMTYwMDAwMDAwMDAwMDAwMDIxCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50NjQsdWludDE2LHVpbnQ2NF0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjM3CgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDY0LHVpbnQxNix1aW50NjRdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV90dXBsZUFyZzoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJcG9wCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCgljYWxsc3ViIHR1cGxlQXJnCglpbnQgMQoJcmV0dXJuCgp0dXBsZUFyZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNDEKCS8vIHJldHVybiBhWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50NjQsdWludDE2LHVpbnQ2NF0KCWludCA4IC8vIG9mZnNldAoJaW50IDIKCWV4dHJhY3QzCglieXRlIDB4RkZGRgoJYiYKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2R5bmFtaWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIGR5bmFtaWNBcnJheQoJaW50IDEKCXJldHVybgoKZHluYW1pY0FycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI0NQoJLy8gYTogdWludDY0W10gPSBbMTEsIDIyLCAzM10KCWJ5dGUgMHgwMDAzMDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTYwMDAwMDAwMDAwMDAwMDIxCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFtdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI0NwoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0W10KCWludCAxCglpbnQgOAoJKgoJaW50IDIKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfcmV0dXJuRHluYW1pY0FycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCWNhbGxzdWIgcmV0dXJuRHluYW1pY0FycmF5CglpbnQgMQoJcmV0dXJuCgpyZXR1cm5EeW5hbWljQXJyYXk6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjUxCgkvLyBhOiB1aW50NjRbXSA9IFsxMSwgMjIsIDMzXQoJYnl0ZSAweDAwMDMwMDAwMDAwMDAwMDAwMDBiMDAwMDAwMDAwMDAwMDAxNjAwMDAwMDAwMDAwMDAwMjEKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjUyCgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfZHluYW1pY0FycmF5QXJnOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4Cglwb3AKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWNhbGxzdWIgZHluYW1pY0FycmF5QXJnCglpbnQgMQoJcmV0dXJuCgpkeW5hbWljQXJyYXlBcmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjU2CgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDEKCWludCA4CgkqCglpbnQgMgoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVEeW5hbWljQXJyYXlFbGVtZW50OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0FycmF5RWxlbWVudAoJaW50IDEKCXJldHVybgoKdXBkYXRlRHluYW1pY0FycmF5RWxlbWVudDoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNjAKCS8vIGE6IHVpbnQ2NFtdID0gWzExLCAyMiwgMzNdCglieXRlIDB4MDAwMzAwMDAwMDAwMDAwMDAwMGIwMDAwMDAwMDAwMDAwMDE2MDAwMDAwMDAwMDAwMDAyMQoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNjIKCS8vIGFbMV0gPSAyMjIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDEKCWludCA4CgkqCglpbnQgMgoJKwoJaW50IDIyMgoJaXRvYgoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjY0CgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDEKCWludCA4CgkqCglpbnQgMgoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9keW5hbWljVHVwbGVBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIGR5bmFtaWNUdXBsZUFycmF5CglpbnQgMQoJcmV0dXJuCgpkeW5hbWljVHVwbGVBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNjgKCS8vIGE6IFt1aW50MTYsIHVpbnQ2NF1bXSA9IFtbMTEsIDIyXSwgWzMzLCA0NF1dCglieXRlIDB4MDAwMjAwMGIwMDAwMDAwMDAwMDAwMDE2MDAyMTAwMDAwMDAwMDAwMDAwMmMKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNix1aW50NjRdW10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjcwCgkvLyByZXR1cm4gYVsxXVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2LHVpbnQ2NF1bXQoJaW50IDEKCWludCAxMAoJKgoJaW50IDIKCSsKCWludCAyIC8vIG9mZnNldAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9yZXR1cm5UdXBsZVdpdGhEeWFtaWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIHJldHVyblR1cGxlV2l0aER5YW1pY0FycmF5CglpbnQgMQoJcmV0dXJuCgpyZXR1cm5UdXBsZVdpdGhEeWFtaWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNzQKCS8vIGE6IFt1aW50NjQsIHVpbnQxNiwgdWludDY0W10sIHVpbnQxNltdXSA9IFsxLCAyLCBbMywgNF0sIFs1LCA2XV0KCWJ5dGUgMHgwMDAwMDAwMDAwMDAwMDAxMDAwMgoJc3RvcmUgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglieXRlIDB4MDAwZSAvLyBoZWFkIGVuZAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWludCAxNAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgMwoJaXRvYgoJaW50IDQKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA2CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0W10sdWludDE2W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI3NgoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0W10sdWludDE2W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9yZXR1cm5EeW5hbWljQXJyYXlGcm9tVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMAoJY2FsbHN1YiByZXR1cm5EeW5hbWljQXJyYXlGcm9tVHVwbGUKCWludCAxCglyZXR1cm4KCnJldHVybkR5bmFtaWNBcnJheUZyb21UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyODAKCS8vIGE6IFt1aW50OCwgdWludDE2LCB1aW50OFtdLCB1aW50MTZbXSwgdWludDhbXV0gPSBbMSwgMiwgWzMsIDRdLCBbNSwgNl0sIFs3LCA4XV0KCWJ5dGUgMHgwMTAwMDIKCXN0b3JlIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJYnl0ZSAweDAwMDkgLy8gaGVhZCBlbmQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglpbnQgOQoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWludCA0CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCA1CglpdG9iCglleHRyYWN0IDYgMAoJaW50IDYKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDcKCWl0b2IKCWV4dHJhY3QgNyAwCglpbnQgOAoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTYsdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyODIKCS8vIHJldHVybiBhWzRdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTYsdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCA3IC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglsb2FkIDAgLy8gZnVsbCB0dXBsZQoJbG9hZCAxIC8vIGFycmF5IG9mZnNldAoJbG9hZCAyIC8vIGZ1bGwgYXJyYXkgbGVuZ3RoCglleHRyYWN0MwoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlRHluYW1pY0FycmF5SW5UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNBcnJheUluVHVwbGUKCWludCAxCglyZXR1cm4KCnVwZGF0ZUR5bmFtaWNBcnJheUluVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mjg2CgkvLyBhOiBbdWludDgsIHVpbnQxNltdLCB1aW50OFtdLCB1aW50MTZbXSwgdWludDhbXV0gPSBbOSwgWzhdLCBbN10sIFs2XSwgWzVdXQoJYnl0ZSAweDA5CglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDA5IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDkKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDgKCWl0b2IKCWV4dHJhY3QgNiAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCA3CglpdG9iCglleHRyYWN0IDcgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgNgoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDUKCWl0b2IKCWV4dHJhY3QgNyAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mjg4CgkvLyBhWzBdID0gOTkgYXMgdWludDgKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJaW50IDAgLy8gb2Zmc2V0CglpbnQgOTkKCWl0b2IKCWV4dHJhY3QgNyAwCglyZXBsYWNlMwoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyODkKCS8vIGFbMV0gPSBbMTAsIDExXQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCglpbnQgMiAvLyB0eXBlIGxlbmd0aAoJaW50IDEgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWJ5dGUgMHgwMDAyMDAwYTAwMGIKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGCglieXRlIDB4MDAwMEZGRkZGRkZGRkZGRiAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMSAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAwIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgOCAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDEgLy8gc3RhcnRPZkhlYWRzCglpbnQgOSAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyOTAKCS8vIGFbMl0gPSBbMTIsIDEzXQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCglpbnQgMSAvLyB0eXBlIGxlbmd0aAoJaW50IDMgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWJ5dGUgMHgwMDAyMGMwZAoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkYKCWJ5dGUgMHgwMDAwMDAwMEZGRkZGRkZGIC8vIGhlYWQgdXBkYXRlIGJpdG1hc2sKCWludCAwIC8vIGlzIGZpcnN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDAgLy8gaXMgbGFzdCBkeW5hbWljIGVsZW1lbnQKCWludCA4IC8vIHRvdGFsIGhlYWQgbGVuZ3RoCglpbnQgMSAvLyBzdGFydE9mSGVhZHMKCWludCA5IC8vIGhlYWQgZW5kCgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNFbGVtZW50CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI5MQoJLy8gYVszXSA9IFsxNCwgMTVdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCWludCAyIC8vIHR5cGUgbGVuZ3RoCglpbnQgNSAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJYnl0ZSAweDAwMDIwMDBlMDAwZgoJYnl0ZSAweEZGRkZGRkZGRkZGRkZGRkYKCWJ5dGUgMHgwMDAwMDAwMDAwMDBGRkZGIC8vIGhlYWQgdXBkYXRlIGJpdG1hc2sKCWludCAwIC8vIGlzIGZpcnN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDAgLy8gaXMgbGFzdCBkeW5hbWljIGVsZW1lbnQKCWludCA4IC8vIHRvdGFsIGhlYWQgbGVuZ3RoCglpbnQgMSAvLyBzdGFydE9mSGVhZHMKCWludCA5IC8vIGhlYWQgZW5kCgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNFbGVtZW50CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI5MgoJLy8gYVs0XSA9IFsxNiwgMTddCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgNyAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJYnl0ZSAweDAwMDIxMDExCglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDAgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMSAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDggLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAxIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDkgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mjk0CgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfbm9uTGl0ZXJhbER5bmFtaWNFbGVtZW50SW5UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAxCgljYWxsc3ViIG5vbkxpdGVyYWxEeW5hbWljRWxlbWVudEluVHVwbGUKCWludCAxCglyZXR1cm4KCm5vbkxpdGVyYWxEeW5hbWljRWxlbWVudEluVHVwbGU6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mjk4CgkvLyBlOiB1aW50MTZbXSA9IFs1LCA2XQoJYnl0ZSAweDAwMDIwMDA1MDAwNgoJZnJhbWVfYnVyeSAtMSAvLyBlOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyOTkKCS8vIGE6IFt1aW50OCwgdWludDE2LCB1aW50OFtdLCB1aW50MTZbXSwgdWludDhbXV0gPSBbMSwgMiwgWzMsIDRdLCBlLCBbNywgOF1dCglieXRlIDB4MDEwMDAyCglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDA5IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDkKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNyAwCglpbnQgNAoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglmcmFtZV9kaWcgLTEgLy8gZTogdWludDE2W10KCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDcKCWl0b2IKCWV4dHJhY3QgNyAwCglpbnQgOAoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIGE6IFt1aW50OCx1aW50MTYsdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMDEKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0yIC8vIGE6IFt1aW50OCx1aW50MTYsdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfYXJyYXlQdXNoOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCWNhbGxzdWIgYXJyYXlQdXNoCglpbnQgMQoJcmV0dXJuCgphcnJheVB1c2g6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzA1CgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyXQoJYnl0ZSAweDAwMDIwMDAxMDAwMgoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMDcKCS8vIGEucHVzaCgzIGFzIHVpbnQxNikKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJZXh0cmFjdCAyIDAKCWNvbmNhdAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzA5CgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfYXJyYXlQb3A6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMAoJY2FsbHN1YiBhcnJheVBvcAoJaW50IDEKCXJldHVybgoKYXJyYXlQb3A6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzEzCgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyLCAzXQoJYnl0ZSAweDAwMDMwMDAxMDAwMjAwMDMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzE1CgkvLyBhLnBvcCgpCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWR1cAoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWV4dHJhY3QgMiAwCgljb25jYXQKCWR1cAoJbGVuCglpbnQgMgoJLQoJaW50IDAKCXN3YXAKCWV4dHJhY3QzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMxNwoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2FycmF5UG9wVmFsdWU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMQoJY2FsbHN1YiBhcnJheVBvcFZhbHVlCglpbnQgMQoJcmV0dXJuCgphcnJheVBvcFZhbHVlOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMyMQoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWJ5dGUgMHgwMDAzMDAwMTAwMDIwMDAzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMyMwoJLy8gdiA9IGEucG9wKCkhCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWR1cAoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWV4dHJhY3QgMiAwCgljb25jYXQKCWR1cAoJbGVuCglpbnQgMgoJLQoJaW50IDAKCXN3YXAKCWV4dHJhY3QzCglkdXAKCWxlbgoJaW50IDIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJY292ZXIgMgoJZXh0cmFjdDMKCXN3YXAKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCWZyYW1lX2J1cnkgLTIgLy8gdjogdWludDE2CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMyNQoJLy8gcmV0dXJuIHY7CglmcmFtZV9kaWcgLTIgLy8gdjogdWludDE2CglieXRlIDB4RkZGRgoJYiYKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2FycmF5U3BsaWNlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCWNhbGxzdWIgYXJyYXlTcGxpY2UKCWludCAxCglyZXR1cm4KCmFycmF5U3BsaWNlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMyOQoJLy8gYTogdWludDY0W10gPSBbMSwgMiwgM10KCWJ5dGUgMHgwMDAzMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFtdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMzMQoJLy8gYS5zcGxpY2UoMSwgMSkKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWludCAxCglpbnQgOAoJKgoJaW50IDIKCSsKCXN0b3JlIDEyIC8vIHNwbGljZSBzdGFydAoJaW50IDEKCWludCA4CgkqCglpbnQgOAoJKwoJc3RvcmUgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0W10KCWludCAyCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJc3Vic3RyaW5nMwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglkdXAKCWxlbgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCgkrCglpbnQgOAoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzMzCgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfYXJyYXlTcGxpY2VWYWx1ZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAzCgljYWxsc3ViIGFycmF5U3BsaWNlVmFsdWUKCWludCAxCglyZXR1cm4KCmFycmF5U3BsaWNlVmFsdWU6Cglwcm90byA0IDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzM3CgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF0KCWJ5dGUgMHgwMDBhMDAwMTAwMDIwMDAzMDAwNDAwMDUwMDA2MDAwNzAwMDgwMDA5MDAwYQoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMzkKCS8vIGkgPSAxCglpbnQgMQoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzQwCgkvLyBsID0gNwoJaW50IDcKCWZyYW1lX2J1cnkgLTMgLy8gbDogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM0MQoJLy8gdiA9IGEuc3BsaWNlKGksIGwpCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAwCglleHRyYWN0X3VpbnQxNgoJZnJhbWVfZGlnIC0zIC8vIGw6IHVpbnQ2NAoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtMiAvLyBpOiB1aW50NjQKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTIgLy8gc3BsaWNlIHN0YXJ0CglmcmFtZV9kaWcgLTMgLy8gbDogdWludDY0CglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9kaWcgLTMgLy8gbDogdWludDY0CglpdG9iCglleHRyYWN0IDYgMgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWludCAyCgktCglleHRyYWN0MwoJY29uY2F0Cglzd2FwCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCglmcmFtZV9idXJ5IC00IC8vIHY6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM0MwoJLy8gcmV0dXJuIHY7CglmcmFtZV9kaWcgLTQgLy8gdjogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2R5bmFtaWNBcnJheUVsZW1lbnRzOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDEKCWNhbGxzdWIgZHluYW1pY0FycmF5RWxlbWVudHMKCWludCAxCglyZXR1cm4KCmR5bmFtaWNBcnJheUVsZW1lbnRzOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM0NwoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWJ5dGUgMHgwMDAzMDAwMTAwMDIwMDAzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM0OAoJLy8gbmV3QTogdWludDE2W10gPSBbYVswXSwgYVsxXSwgYVsyXV0KCWJ5dGUgMHgwMDAzCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAwCglpbnQgMgoJKgoJaW50IDIKCSsKCWludCAyCglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAxCglpbnQgMgoJKgoJaW50IDIKCSsKCWludCAyCglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAyCglpbnQgMgoJKgoJaW50IDIKCSsKCWludCAyCglleHRyYWN0MwoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIG5ld0E6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1MAoJLy8gcmV0dXJuIG5ld0E7CglmcmFtZV9kaWcgLTIgLy8gbmV3QTogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3NwbGljZUxhc3RFbGVtZW50OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCWNhbGxzdWIgc3BsaWNlTGFzdEVsZW1lbnQKCWludCAxCglyZXR1cm4KCnNwbGljZUxhc3RFbGVtZW50OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1NAoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWJ5dGUgMHgwMDAzMDAwMTAwMDIwMDAzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1NgoJLy8gYS5zcGxpY2UoMiwgMSkKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWludCAyCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEyIC8vIHNwbGljZSBzdGFydAoJaW50IDEKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAyCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJc3Vic3RyaW5nMwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWxlbgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCgkrCglpbnQgMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzU4CgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3BsaWNlTGFzdEVsZW1lbnRWYWx1ZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAxCgljYWxsc3ViIHNwbGljZUxhc3RFbGVtZW50VmFsdWUKCWludCAxCglyZXR1cm4KCnNwbGljZUxhc3RFbGVtZW50VmFsdWU6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzYyCgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyLCAzXQoJYnl0ZSAweDAwMDMwMDAxMDAwMjAwMDMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzY0CgkvLyB2ID0gYS5zcGxpY2UoMiwgMSkKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWludCAyCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEyIC8vIHNwbGljZSBzdGFydAoJaW50IDEKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAyCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJc3Vic3RyaW5nMwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWxlbgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCgkrCglpbnQgMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cgljb25jYXQKCWludCAxCglpdG9iCglleHRyYWN0IDYgMgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWludCAyCgktCglleHRyYWN0MwoJY29uY2F0Cglzd2FwCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCglmcmFtZV9idXJ5IC0yIC8vIHY6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM2NgoJLy8gcmV0dXJuIHY7CglmcmFtZV9kaWcgLTIgLy8gdjogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3NwbGljZUZpcnN0RWxlbWVudDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIHNwbGljZUZpcnN0RWxlbWVudAoJaW50IDEKCXJldHVybgoKc3BsaWNlRmlyc3RFbGVtZW50OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM3MAoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWJ5dGUgMHgwMDAzMDAwMTAwMDIwMDAzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM3MgoJLy8gYS5zcGxpY2UoMCwgMSkKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWludCAwCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEyIC8vIHNwbGljZSBzdGFydAoJaW50IDEKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAyCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJc3Vic3RyaW5nMwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWxlbgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCgkrCglpbnQgMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mzc0CgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3BsaWNlRmlyc3RFbGVtZW50VmFsdWU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMQoJY2FsbHN1YiBzcGxpY2VGaXJzdEVsZW1lbnRWYWx1ZQoJaW50IDEKCXJldHVybgoKc3BsaWNlRmlyc3RFbGVtZW50VmFsdWU6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mzc4CgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyLCAzXQoJYnl0ZSAweDAwMDMwMDAxMDAwMjAwMDMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzgwCgkvLyB2ID0gYS5zcGxpY2UoMCwgMSkKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDAKCWV4dHJhY3RfdWludDE2CglpbnQgMQoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWludCAwCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEyIC8vIHNwbGljZSBzdGFydAoJaW50IDEKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAyCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJc3Vic3RyaW5nMwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWxlbgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCgkrCglpbnQgMgoJLQoJc3dhcAoJc3Vic3RyaW5nMwoJY29uY2F0Cgljb25jYXQKCWludCAxCglpdG9iCglleHRyYWN0IDYgMgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWludCAyCgktCglleHRyYWN0MwoJY29uY2F0Cglzd2FwCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCglmcmFtZV9idXJ5IC0yIC8vIHY6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM4MgoJLy8gcmV0dXJuIHY7CglmcmFtZV9kaWcgLTIgLy8gdjogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3N0cmluZ1JldHVybjoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJcG9wCgljYWxsc3ViIHN0cmluZ1JldHVybgoJaW50IDEKCXJldHVybgoKc3RyaW5nUmV0dXJuOgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM4NgoJLy8gcmV0dXJuICdIZWxsbyBXb3JsZCEnOwoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3N0cmluZ0FyZzoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJcG9wCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCglleHRyYWN0IDIgMAoJY2FsbHN1YiBzdHJpbmdBcmcKCWludCAxCglyZXR1cm4KCnN0cmluZ0FyZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozOTAKCS8vIGFzc2VydChzID09PSAnSGVsbG8gV29ybGQhJykKCWZyYW1lX2RpZyAtMSAvLyBzOiBieXRlcwoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJPT0KCWFzc2VydAoJcmV0c3ViCgphYmlfcm91dGVfc3RyaW5nSW5UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIHN0cmluZ0luVHVwbGUKCWludCAxCglyZXR1cm4KCnN0cmluZ0luVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mzk0CgkvLyBhOiBbdWludDE2LCB1aW50OFtdLCBzdHJpbmcsIHVpbnQ4W11dID0gWzEsIFsyXSwgJ0hlbGxvIFdvcmxkIScsIFszXV0KCWJ5dGUgMHgwMDAxCglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDA4IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDgKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNyAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWJ5dGUgMHgwMDBjNDg2NTZjNmM2ZjIwNTc2ZjcyNmM2NDIxIC8vIEhlbGxvIFdvcmxkIQoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglsb2FkIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2LHVpbnQ4W10sc3RyaW5nLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM5NgoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdLHN0cmluZyx1aW50OFtdXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfYWNjZXNTdHJpbmdJblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCWNhbGxzdWIgYWNjZXNTdHJpbmdJblR1cGxlCglpbnQgMQoJcmV0dXJuCgphY2Nlc1N0cmluZ0luVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDAwCgkvLyBhOiBbdWludDE2LCB1aW50OFtdLCBzdHJpbmcsIHVpbnQ4W11dID0gWzEsIFsyXSwgJ0hlbGxvIFdvcmxkIScsIFszXV0KCWJ5dGUgMHgwMDAxCglzdG9yZSAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWJ5dGUgMHgwMDA4IC8vIGhlYWQgZW5kCglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJaW50IDgKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJYnl0ZSAweAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNyAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWJ5dGUgMHgwMDBjNDg2NTZjNmM2ZjIwNTc2ZjcyNmM2NDIxIC8vIEhlbGxvIFdvcmxkIQoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglsb2FkIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2LHVpbnQ4W10sc3RyaW5nLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQwMgoJLy8gYXNzZXJ0KGFbMl0gPT09ICdIZWxsbyBXb3JsZCEnKQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSxzdHJpbmcsdWludDhbXV0KCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgNCAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJZXh0cmFjdDMKCWV4dHJhY3QgMiAwIC8vIGV4dHJhY3QgYnl0ZXMgZnJvbSBzdHJpbmcKCWJ5dGUgIkhlbGxvIFdvcmxkISIKCT09Cglhc3NlcnQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDA0CgkvLyByZXR1cm4gYVsyXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2LHVpbnQ4W10sc3RyaW5nLHVpbnQ4W11dCglpbnQgMSAvLyB0eXBlIGxlbmd0aAoJaW50IDQgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglsb2FkIDEgLy8gYXJyYXkgb2Zmc2V0Cglsb2FkIDIgLy8gZnVsbCBhcnJheSBsZW5ndGgKCWV4dHJhY3QzCglleHRyYWN0IDIgMCAvLyBleHRyYWN0IGJ5dGVzIGZyb20gc3RyaW5nCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlU3RyaW5nSW5UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIHVwZGF0ZVN0cmluZ0luVHVwbGUKCWludCAxCglyZXR1cm4KCnVwZGF0ZVN0cmluZ0luVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDA4CgkvLyBhOiBbdWludDgsIHVpbnQxNltdLCBzdHJpbmcsIHVpbnQxNltdLCB1aW50OFtdXSA9IFs5LCBbOF0sICdIaT8nLCBbNl0sIFs1XV0KCWJ5dGUgMHgwOQoJc3RvcmUgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglieXRlIDB4MDAwOSAvLyBoZWFkIGVuZAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWludCA5CglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWJ5dGUgMHgKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCA4CglpdG9iCglleHRyYWN0IDYgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglieXRlIDB4MDAwMzQ4NjkzZiAvLyBIaT8KCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDYKCWl0b2IKCWV4dHJhY3QgNiAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCSsKCWR1cAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglpdG9iCglleHRyYWN0IDYgMgoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJc3dhcAoJY29uY2F0CglzdG9yZSA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCA1CglpdG9iCglleHRyYWN0IDcgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDEwCgkvLyBhWzBdID0gOTkgYXMgdWludDgKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCglpbnQgMCAvLyBvZmZzZXQKCWludCA5OQoJaXRvYgoJZXh0cmFjdCA3IDAKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDExCgkvLyBhWzFdID0gWzEwLCAxMV0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCglpbnQgMiAvLyB0eXBlIGxlbmd0aAoJaW50IDEgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWJ5dGUgMHgwMDAyMDAwYTAwMGIKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGCglieXRlIDB4MDAwMEZGRkZGRkZGRkZGRiAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMSAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAwIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgOCAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDEgLy8gc3RhcnRPZkhlYWRzCglpbnQgOSAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQxMgoJLy8gYVsyXSA9ICdIZWxsbyBXb3JsZCEnCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCAzIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwYzQ4NjU2YzZjNmYyMDU3NmY3MjZjNjQyMSAvLyBIZWxsbyBXb3JsZCEKCWJ5dGUgMHhGRkZGRkZGRkZGRkZGRkZGCglieXRlIDB4MDAwMDAwMDBGRkZGRkZGRiAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMCAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAwIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgOCAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDEgLy8gc3RhcnRPZkhlYWRzCglpbnQgOSAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQxMwoJLy8gYVszXSA9IFsxNCwgMTVdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoJaW50IDIgLy8gdHlwZSBsZW5ndGgKCWludCA1IC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwMjAwMGUwMDBmCglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRgoJYnl0ZSAweDAwMDAwMDAwMDAwMEZGRkYgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDAgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMCAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDggLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAxIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDkgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MTQKCS8vIGFbNF0gPSBbMTYsIDE3XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgNyAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJYnl0ZSAweDAwMDIxMDExCglieXRlIDB4RkZGRkZGRkZGRkZGRkZGRgoJYnl0ZSAweDAwMDAwMDAwMDAwMDAwMDAgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDAgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMSAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDggLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAxIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDkgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MTYKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZVR1cGxlV2l0aE9ubHlEeW5hbWljVHlwZXM6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMAoJY2FsbHN1YiB1cGRhdGVUdXBsZVdpdGhPbmx5RHluYW1pY1R5cGVzCglpbnQgMQoJcmV0dXJuCgp1cGRhdGVUdXBsZVdpdGhPbmx5RHluYW1pY1R5cGVzOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQyMAoJLy8gYTogW3VpbnQxNltdLCB1aW50MTZbXSwgdWludDE2W11dID0gW1sxXSwgWzJdLCBbM11dCglieXRlIDB4IC8vIG5vIHN0YXRpYyBlbGVtZW50cwoJc3RvcmUgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglieXRlIDB4MDAwNiAvLyBoZWFkIGVuZAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWludCA2CglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWJ5dGUgMHgKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MjIKCS8vIGFbMF0gPSBbNCwgNV0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglpbnQgMiAvLyB0eXBlIGxlbmd0aAoJaW50IDAgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWJ5dGUgMHgwMDAyMDAwNDAwMDUKCWJ5dGUgMHhGRkZGRkZGRkZGRkYKCWJ5dGUgMHgwMDAwRkZGRkZGRkYgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDEgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMCAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDYgLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAwIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDYgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MjMKCS8vIGFbMV0gPSBbNiwgN10KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglpbnQgMiAvLyB0eXBlIGxlbmd0aAoJaW50IDIgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWJ5dGUgMHgwMDAyMDAwNjAwMDcKCWJ5dGUgMHhGRkZGRkZGRkZGRkYKCWJ5dGUgMHgwMDAwMDAwMEZGRkYgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDAgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMCAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDYgLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAwIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDYgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MjQKCS8vIGFbMl0gPSBbOCwgOV0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglpbnQgMiAvLyB0eXBlIGxlbmd0aAoJaW50IDQgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWJ5dGUgMHgwMDAyMDAwODAwMDkKCWJ5dGUgMHhGRkZGRkZGRkZGRkYKCWJ5dGUgMHgwMDAwMDAwMDAwMDAgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDAgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMSAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDYgLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAwIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDYgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MjYKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3Nob3J0ZW5EeW5hbWljRWxlbWVudEluVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMAoJY2FsbHN1YiBzaG9ydGVuRHluYW1pY0VsZW1lbnRJblR1cGxlCglpbnQgMQoJcmV0dXJuCgpzaG9ydGVuRHluYW1pY0VsZW1lbnRJblR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQzMAoJLy8gYTogW3VpbnQxNltdLCB1aW50MTZbXSwgdWludDE2W11dID0gW1sxLCAyXSwgWzIsIDNdLCBbMywgNF1dCglieXRlIDB4IC8vIG5vIHN0YXRpYyBlbGVtZW50cwoJc3RvcmUgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglieXRlIDB4MDAwNiAvLyBoZWFkIGVuZAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWludCA2CglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWJ5dGUgMHgKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJKwoJZHVwCglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWl0b2IKCWV4dHJhY3QgNiAyCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglzd2FwCgljb25jYXQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CgkrCglkdXAKCXN0b3JlIDkgLy8gZHluYW1pYyBoZWFkIG9mZnNldAoJaXRvYgoJZXh0cmFjdCA2IDIKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCXN3YXAKCWNvbmNhdAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0Cglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJbG9hZCAxMSAvLyBzdGF0aWMgZWxlbWVudHMKCWxvYWQgOCAvLyBkeW5hbWljIGhlYWQKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MzIKCS8vIGFbMF0gPSBbNV0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglpbnQgMiAvLyB0eXBlIGxlbmd0aAoJaW50IDAgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWJ5dGUgMHgwMDAxMDAwNQoJYnl0ZSAweEZGRkZGRkZGRkZGRgoJYnl0ZSAweDAwMDBGRkZGRkZGRiAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMSAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAwIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgNiAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDAgLy8gc3RhcnRPZkhlYWRzCglpbnQgNiAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQzMwoJLy8gYVsxXSA9IFs2XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCWludCAyIC8vIHR5cGUgbGVuZ3RoCglpbnQgMiAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJYnl0ZSAweDAwMDEwMDA2CglieXRlIDB4RkZGRkZGRkZGRkZGCglieXRlIDB4MDAwMDAwMDBGRkZGIC8vIGhlYWQgdXBkYXRlIGJpdG1hc2sKCWludCAwIC8vIGlzIGZpcnN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDAgLy8gaXMgbGFzdCBkeW5hbWljIGVsZW1lbnQKCWludCA2IC8vIHRvdGFsIGhlYWQgbGVuZ3RoCglpbnQgMCAvLyBzdGFydE9mSGVhZHMKCWludCA2IC8vIGhlYWQgZW5kCgljYWxsc3ViIHVwZGF0ZUR5bmFtaWNFbGVtZW50CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDM0CgkvLyBhWzJdID0gWzddCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJaW50IDIgLy8gdHlwZSBsZW5ndGgKCWludCA0IC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwMTAwMDcKCWJ5dGUgMHhGRkZGRkZGRkZGRkYKCWJ5dGUgMHgwMDAwMDAwMDAwMDAgLy8gaGVhZCB1cGRhdGUgYml0bWFzawoJaW50IDAgLy8gaXMgZmlyc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMSAvLyBpcyBsYXN0IGR5bmFtaWMgZWxlbWVudAoJaW50IDYgLy8gdG90YWwgaGVhZCBsZW5ndGgKCWludCAwIC8vIHN0YXJ0T2ZIZWFkcwoJaW50IDYgLy8gaGVhZCBlbmQKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0VsZW1lbnQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MzYKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX25hbWVkVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMAoJY2FsbHN1YiBuYW1lZFR1cGxlCglpbnQgMQoJcmV0dXJuCgpuYW1lZFR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ0MAoJLy8gYTogewoJYnl0ZSAweDAwMDEKCXN0b3JlIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJYnl0ZSAweDAwMDQgLy8gaGVhZCBlbmQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglpbnQgNAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglieXRlIDB4MDAwYzQ4NjU2YzZjNmYyMDU3NmY3MjZjNjQyMSAvLyBIZWxsbyBXb3JsZCEKCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglsb2FkIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NDgKCS8vIHJldHVybiBhLmJhcjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCAyIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglsb2FkIDAgLy8gZnVsbCB0dXBsZQoJbG9hZCAxIC8vIGFycmF5IG9mZnNldAoJbG9hZCAyIC8vIGZ1bGwgYXJyYXkgbGVuZ3RoCglleHRyYWN0MwoJZXh0cmFjdCAyIDAgLy8gZXh0cmFjdCBieXRlcyBmcm9tIHN0cmluZwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZU5hbWVkVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMAoJY2FsbHN1YiB1cGRhdGVOYW1lZFR1cGxlCglpbnQgMQoJcmV0dXJuCgp1cGRhdGVOYW1lZFR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ1MgoJLy8gYTogewoJYnl0ZSAweDAwMDEKCXN0b3JlIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJYnl0ZSAweDAwMDQgLy8gaGVhZCBlbmQKCXN0b3JlIDggLy8gZHluYW1pYyBoZWFkCglpbnQgNAoJc3RvcmUgOSAvLyBkeW5hbWljIGhlYWQgb2Zmc2V0CglieXRlIDB4CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglieXRlIDB4MDAwMzQ4NjkzZiAvLyBIaT8KCWxvYWQgMTAgLy8gZHluYW1pYyBlbGVtZW50cwoJc3dhcAoJY29uY2F0CglzdG9yZSAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglsb2FkIDExIC8vIHN0YXRpYyBlbGVtZW50cwoJbG9hZCA4IC8vIGR5bmFtaWMgaGVhZAoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NjAKCS8vIGEuYmFyID0gJ0hlbGxvIFdvcmxkIScKCWZyYW1lX2RpZyAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCAyIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwYzQ4NjU2YzZjNmYyMDU3NmY3MjZjNjQyMSAvLyBIZWxsbyBXb3JsZCEKCWJ5dGUgMHhGRkZGCglieXRlIDB4MDAwMCAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMSAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAxIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMiAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDIgLy8gc3RhcnRPZkhlYWRzCglpbnQgNCAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NjIKCS8vIHJldHVybiBhLmJhcjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCAyIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglsb2FkIDAgLy8gZnVsbCB0dXBsZQoJbG9hZCAxIC8vIGFycmF5IG9mZnNldAoJbG9hZCAyIC8vIGZ1bGwgYXJyYXkgbGVuZ3RoCglleHRyYWN0MwoJZXh0cmFjdCAyIDAgLy8gZXh0cmFjdCBieXRlcyBmcm9tIHN0cmluZwoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2N1c3RvbVR5cGVzOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCWNhbGxzdWIgY3VzdG9tVHlwZXMKCWludCAxCglyZXR1cm4KCmN1c3RvbVR5cGVzOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ2NgoJLy8gYWE6IEN1c3RvbVR5cGUgPSB7CglieXRlIDB4MDAwMQoJc3RvcmUgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglieXRlIDB4MDAwNCAvLyBoZWFkIGVuZAoJc3RvcmUgOCAvLyBkeW5hbWljIGhlYWQKCWludCA0CglzdG9yZSA5IC8vIGR5bmFtaWMgaGVhZCBvZmZzZXQKCWJ5dGUgMHgKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWJ5dGUgMHgwMDAzNDg2OTNmIC8vIEhpPwoJbG9hZCAxMCAvLyBkeW5hbWljIGVsZW1lbnRzCglzd2FwCgljb25jYXQKCXN0b3JlIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWxvYWQgMTEgLy8gc3RhdGljIGVsZW1lbnRzCglsb2FkIDggLy8gZHluYW1pYyBoZWFkCglsb2FkIDEwIC8vIGR5bmFtaWMgZWxlbWVudHMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGFhOiBDdXN0b21UeXBlCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ3MQoJLy8gYWEuYmFyID0gJ0hlbGxvIFdvcmxkIScKCWZyYW1lX2RpZyAtMSAvLyBhYTogQ3VzdG9tVHlwZQoJaW50IDEgLy8gdHlwZSBsZW5ndGgKCWludCAyIC8vIGhlYWQgb2Zmc2V0CgljYWxsc3ViIHByZUFycmF5QWNjZXNzCglieXRlIDB4MDAwYzQ4NjU2YzZjNmYyMDU3NmY3MjZjNjQyMSAvLyBIZWxsbyBXb3JsZCEKCWJ5dGUgMHhGRkZGCglieXRlIDB4MDAwMCAvLyBoZWFkIHVwZGF0ZSBiaXRtYXNrCglpbnQgMSAvLyBpcyBmaXJzdCBkeW5hbWljIGVsZW1lbnQKCWludCAxIC8vIGlzIGxhc3QgZHluYW1pYyBlbGVtZW50CglpbnQgMiAvLyB0b3RhbCBoZWFkIGxlbmd0aAoJaW50IDIgLy8gc3RhcnRPZkhlYWRzCglpbnQgNCAvLyBoZWFkIGVuZAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljRWxlbWVudAoJZnJhbWVfYnVyeSAtMSAvLyBhYTogQ3VzdG9tVHlwZQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NzMKCS8vIHJldHVybiBhYS5iYXI7CglmcmFtZV9kaWcgLTEgLy8gYWE6IEN1c3RvbVR5cGUKCWludCAxIC8vIHR5cGUgbGVuZ3RoCglpbnQgMiAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJZXh0cmFjdDMKCWV4dHJhY3QgMiAwIC8vIGV4dHJhY3QgYnl0ZXMgZnJvbSBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zdGF0aWNTdHJpbmdBcnJheUFyZzoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJcG9wCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCgljYWxsc3ViIHN0YXRpY1N0cmluZ0FycmF5QXJnCglpbnQgMQoJcmV0dXJuCgpzdGF0aWNTdHJpbmdBcnJheUFyZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NzcKCS8vIHJldHVybiBhWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IGJ5dGVzWzNdCglpbnQgMSAvLyB0eXBlIGxlbmd0aAoJaW50IDIgLy8gaGVhZCBvZmZzZXQKCWNhbGxzdWIgcHJlQXJyYXlBY2Nlc3MKCWxvYWQgMCAvLyBmdWxsIHR1cGxlCglsb2FkIDEgLy8gYXJyYXkgb2Zmc2V0Cglsb2FkIDIgLy8gZnVsbCBhcnJheSBsZW5ndGgKCWV4dHJhY3QzCglleHRyYWN0IDIgMCAvLyBleHRyYWN0IGJ5dGVzIGZyb20gc3RyaW5nCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfZHluYW1pY0FjY2Vzc09mRHluYW1pY0VsZW1lbnRJblN0YXRpY0FycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDAKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWNhbGxzdWIgZHluYW1pY0FjY2Vzc09mRHluYW1pY0VsZW1lbnRJblN0YXRpY0FycmF5CglpbnQgMQoJcmV0dXJuCgpkeW5hbWljQWNjZXNzT2ZEeW5hbWljRWxlbWVudEluU3RhdGljQXJyYXk6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDgxCgkvLyBpID0gMQoJaW50IDEKCWZyYW1lX2J1cnkgLTIgLy8gaTogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ4MgoJLy8gcmV0dXJuIGFbaV07CglmcmFtZV9kaWcgLTEgLy8gYTogYnl0ZXNbM10KCWludCAxIC8vIHR5cGUgbGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gaTogdWludDY0CglpbnQgMgoJKiAvLyBoZWFkIG9mZnNldAoJY2FsbHN1YiBwcmVBcnJheUFjY2VzcwoJbG9hZCAwIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMSAvLyBhcnJheSBvZmZzZXQKCWxvYWQgMiAvLyBmdWxsIGFycmF5IGxlbmd0aAoJZXh0cmFjdDMKCWV4dHJhY3QgMiAwIC8vIGV4dHJhY3QgYnl0ZXMgZnJvbSBzdHJpbmcKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCm1haW46Cgl0eG4gTnVtQXBwQXJncwoJYm56IHJvdXRlX2FiaQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgk9PQoJYm56IGJhcmVfcm91dGVfY3JlYXRlCgl0eG4gT25Db21wbGV0aW9uCglpbnQgT3B0SW4KCT09CglpbnQgMQoJbWF0Y2ggYmFyZV9yb3V0ZV9PcHRJbgoKcm91dGVfYWJpOgoJbWV0aG9kICJzdGF0aWNBcnJheSgpdWludDY0IgoJbWV0aG9kICJyZXR1cm5TdGF0aWNBcnJheSgpdWludDY0WzNdIgoJbWV0aG9kICJzdGF0aWNBcnJheUFyZyh1aW50NjRbM10pdWludDY0IgoJbWV0aG9kICJub25MaXRlcmFsU3RhdGljQXJyYXlFbGVtZW50cygpdWludDY0IgoJbWV0aG9kICJtaXhlZFN0YXRpY0FycmF5RWxlbWVudHMoKXVpbnQ2NCIKCW1ldGhvZCAibm9uTGl0ZXJhbFN0YXRpY0FycmF5QWNjZXNzKCl1aW50NjQiCgltZXRob2QgInNldFN0YXRpY0FycmF5RWxlbWVudCgpdWludDY0IgoJbWV0aG9kICJzdGF0aWNBcnJheUluU3RvcmFnZVJlZigpdWludDY0WzNdIgoJbWV0aG9kICJ1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZVJlZigpdWludDY0WzNdIgoJbWV0aG9kICJzdGF0aWNBcnJheUluU3RvcmFnZU1hcCgpdWludDY0WzNdIgoJbWV0aG9kICJ1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZU1hcCgpdWludDY0WzNdIgoJbWV0aG9kICJuZXN0ZWRTdGF0aWNBcnJheSgpdWludDY0IgoJbWV0aG9kICJ1cGRhdGVOZXN0ZWRTdGF0aWNBcnJheUVsZW1lbnQoKXVpbnQ2NCIKCW1ldGhvZCAidXBkYXRlTmVzdGVkU3RhdGljQXJyYXkoKXVpbnQ2NCIKCW1ldGhvZCAidGhyZWVEaW1lbnNpb25hbFVpbnQxNkFycmF5KCl1aW50MTYiCgltZXRob2QgInNpbXBsZVR1cGxlKCl1aW50MTYiCgltZXRob2QgImFycmF5SW5UdXBsZSgpdWludDY0IgoJbWV0aG9kICJ0dXBsZUluQXJyYXkoKXVpbnQxNiIKCW1ldGhvZCAidHVwbGVJblR1cGxlKCl1aW50NjQiCgltZXRob2QgInNob3J0VHlwZU5vdGF0aW9uKCl1aW50MTYiCgltZXRob2QgImRpc2d1c3RpbmcoKXVpbnQ2NCIKCW1ldGhvZCAicmV0dXJuVHVwbGUoKSh1aW50NjQsdWludDE2LHVpbnQ2NCkiCgltZXRob2QgInR1cGxlQXJnKCh1aW50NjQsdWludDE2LHVpbnQ2NCkpdWludDE2IgoJbWV0aG9kICJkeW5hbWljQXJyYXkoKXVpbnQ2NCIKCW1ldGhvZCAicmV0dXJuRHluYW1pY0FycmF5KCl1aW50NjRbXSIKCW1ldGhvZCAiZHluYW1pY0FycmF5QXJnKHVpbnQ2NFtdKXVpbnQ2NCIKCW1ldGhvZCAidXBkYXRlRHluYW1pY0FycmF5RWxlbWVudCgpdWludDY0IgoJbWV0aG9kICJkeW5hbWljVHVwbGVBcnJheSgpdWludDY0IgoJbWV0aG9kICJyZXR1cm5UdXBsZVdpdGhEeWFtaWNBcnJheSgpKHVpbnQ2NCx1aW50MTYsdWludDY0W10sdWludDE2W10pIgoJbWV0aG9kICJyZXR1cm5EeW5hbWljQXJyYXlGcm9tVHVwbGUoKXVpbnQ4W10iCgltZXRob2QgInVwZGF0ZUR5bmFtaWNBcnJheUluVHVwbGUoKSh1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W10pIgoJbWV0aG9kICJub25MaXRlcmFsRHluYW1pY0VsZW1lbnRJblR1cGxlKCkodWludDgsdWludDE2LHVpbnQ4W10sdWludDE2W10sdWludDhbXSkiCgltZXRob2QgImFycmF5UHVzaCgpdWludDE2W10iCgltZXRob2QgImFycmF5UG9wKCl1aW50MTZbXSIKCW1ldGhvZCAiYXJyYXlQb3BWYWx1ZSgpdWludDE2IgoJbWV0aG9kICJhcnJheVNwbGljZSgpdWludDY0W10iCgltZXRob2QgImFycmF5U3BsaWNlVmFsdWUoKXVpbnQxNltdIgoJbWV0aG9kICJkeW5hbWljQXJyYXlFbGVtZW50cygpdWludDE2W10iCgltZXRob2QgInNwbGljZUxhc3RFbGVtZW50KCl1aW50MTZbXSIKCW1ldGhvZCAic3BsaWNlTGFzdEVsZW1lbnRWYWx1ZSgpdWludDE2W10iCgltZXRob2QgInNwbGljZUZpcnN0RWxlbWVudCgpdWludDE2W10iCgltZXRob2QgInNwbGljZUZpcnN0RWxlbWVudFZhbHVlKCl1aW50MTZbXSIKCW1ldGhvZCAic3RyaW5nUmV0dXJuKClzdHJpbmciCgltZXRob2QgInN0cmluZ0FyZyhzdHJpbmcpdm9pZCIKCW1ldGhvZCAic3RyaW5nSW5UdXBsZSgpKHVpbnQxNix1aW50OFtdLHN0cmluZyx1aW50OFtdKSIKCW1ldGhvZCAiYWNjZXNTdHJpbmdJblR1cGxlKClzdHJpbmciCgltZXRob2QgInVwZGF0ZVN0cmluZ0luVHVwbGUoKSh1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXSkiCgltZXRob2QgInVwZGF0ZVR1cGxlV2l0aE9ubHlEeW5hbWljVHlwZXMoKSh1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXSkiCgltZXRob2QgInNob3J0ZW5EeW5hbWljRWxlbWVudEluVHVwbGUoKSh1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXSkiCgltZXRob2QgIm5hbWVkVHVwbGUoKXN0cmluZyIKCW1ldGhvZCAidXBkYXRlTmFtZWRUdXBsZSgpc3RyaW5nIgoJbWV0aG9kICJjdXN0b21UeXBlcygpc3RyaW5nIgoJbWV0aG9kICJzdGF0aWNTdHJpbmdBcnJheUFyZyhzdHJpbmdbM10pc3RyaW5nIgoJbWV0aG9kICJkeW5hbWljQWNjZXNzT2ZEeW5hbWljRWxlbWVudEluU3RhdGljQXJyYXkoc3RyaW5nWzNdKXN0cmluZyIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoIGFiaV9yb3V0ZV9zdGF0aWNBcnJheSBhYmlfcm91dGVfcmV0dXJuU3RhdGljQXJyYXkgYWJpX3JvdXRlX3N0YXRpY0FycmF5QXJnIGFiaV9yb3V0ZV9ub25MaXRlcmFsU3RhdGljQXJyYXlFbGVtZW50cyBhYmlfcm91dGVfbWl4ZWRTdGF0aWNBcnJheUVsZW1lbnRzIGFiaV9yb3V0ZV9ub25MaXRlcmFsU3RhdGljQXJyYXlBY2Nlc3MgYWJpX3JvdXRlX3NldFN0YXRpY0FycmF5RWxlbWVudCBhYmlfcm91dGVfc3RhdGljQXJyYXlJblN0b3JhZ2VSZWYgYWJpX3JvdXRlX3VwZGF0ZVN0YXRpY0FycmF5SW5TdG9yYWdlUmVmIGFiaV9yb3V0ZV9zdGF0aWNBcnJheUluU3RvcmFnZU1hcCBhYmlfcm91dGVfdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VNYXAgYWJpX3JvdXRlX25lc3RlZFN0YXRpY0FycmF5IGFiaV9yb3V0ZV91cGRhdGVOZXN0ZWRTdGF0aWNBcnJheUVsZW1lbnQgYWJpX3JvdXRlX3VwZGF0ZU5lc3RlZFN0YXRpY0FycmF5IGFiaV9yb3V0ZV90aHJlZURpbWVuc2lvbmFsVWludDE2QXJyYXkgYWJpX3JvdXRlX3NpbXBsZVR1cGxlIGFiaV9yb3V0ZV9hcnJheUluVHVwbGUgYWJpX3JvdXRlX3R1cGxlSW5BcnJheSBhYmlfcm91dGVfdHVwbGVJblR1cGxlIGFiaV9yb3V0ZV9zaG9ydFR5cGVOb3RhdGlvbiBhYmlfcm91dGVfZGlzZ3VzdGluZyBhYmlfcm91dGVfcmV0dXJuVHVwbGUgYWJpX3JvdXRlX3R1cGxlQXJnIGFiaV9yb3V0ZV9keW5hbWljQXJyYXkgYWJpX3JvdXRlX3JldHVybkR5bmFtaWNBcnJheSBhYmlfcm91dGVfZHluYW1pY0FycmF5QXJnIGFiaV9yb3V0ZV91cGRhdGVEeW5hbWljQXJyYXlFbGVtZW50IGFiaV9yb3V0ZV9keW5hbWljVHVwbGVBcnJheSBhYmlfcm91dGVfcmV0dXJuVHVwbGVXaXRoRHlhbWljQXJyYXkgYWJpX3JvdXRlX3JldHVybkR5bmFtaWNBcnJheUZyb21UdXBsZSBhYmlfcm91dGVfdXBkYXRlRHluYW1pY0FycmF5SW5UdXBsZSBhYmlfcm91dGVfbm9uTGl0ZXJhbER5bmFtaWNFbGVtZW50SW5UdXBsZSBhYmlfcm91dGVfYXJyYXlQdXNoIGFiaV9yb3V0ZV9hcnJheVBvcCBhYmlfcm91dGVfYXJyYXlQb3BWYWx1ZSBhYmlfcm91dGVfYXJyYXlTcGxpY2UgYWJpX3JvdXRlX2FycmF5U3BsaWNlVmFsdWUgYWJpX3JvdXRlX2R5bmFtaWNBcnJheUVsZW1lbnRzIGFiaV9yb3V0ZV9zcGxpY2VMYXN0RWxlbWVudCBhYmlfcm91dGVfc3BsaWNlTGFzdEVsZW1lbnRWYWx1ZSBhYmlfcm91dGVfc3BsaWNlRmlyc3RFbGVtZW50IGFiaV9yb3V0ZV9zcGxpY2VGaXJzdEVsZW1lbnRWYWx1ZSBhYmlfcm91dGVfc3RyaW5nUmV0dXJuIGFiaV9yb3V0ZV9zdHJpbmdBcmcgYWJpX3JvdXRlX3N0cmluZ0luVHVwbGUgYWJpX3JvdXRlX2FjY2VzU3RyaW5nSW5UdXBsZSBhYmlfcm91dGVfdXBkYXRlU3RyaW5nSW5UdXBsZSBhYmlfcm91dGVfdXBkYXRlVHVwbGVXaXRoT25seUR5bmFtaWNUeXBlcyBhYmlfcm91dGVfc2hvcnRlbkR5bmFtaWNFbGVtZW50SW5UdXBsZSBhYmlfcm91dGVfbmFtZWRUdXBsZSBhYmlfcm91dGVfdXBkYXRlTmFtZWRUdXBsZSBhYmlfcm91dGVfY3VzdG9tVHlwZXMgYWJpX3JvdXRlX3N0YXRpY1N0cmluZ0FycmF5QXJnIGFiaV9yb3V0ZV9keW5hbWljQWNjZXNzT2ZEeW5hbWljRWxlbWVudEluU3RhdGljQXJyYXk="; + override approvalProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudDoKCXByb3RvIDMgMQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gaGVhZCBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgZHluYW1pYyBhcnJheSBvZmZzZXQgb2YgZWxlbWVudAoJaW50IDAKCXN3YXAKCWV4dHJhY3QzIC8vIGV4dHJhY3QgcG9ydGlvbiBvZiB0dXBsZSBiZWZvcmUgZWxlbWVudAoJZnJhbWVfZGlnIC0yIC8vIG5ldyB0dXBsZSBlbGVtZW50Cgljb25jYXQKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfZGlnIC0xIC8vIGhlYWQgb2Zmc2V0CglleHRyYWN0X3VpbnQxNiAvLyBleHRyYWN0IGR5bmFtaWMgYXJyYXkgb2Zmc2V0IG9mIGVsZW1lbnQKCWZyYW1lX2RpZyAtMyAvLyBvbGQgZWxlbWVudCBsZW5ndGgKCSsKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglsZW4KCXN1YnN0cmluZzMKCWNvbmNhdAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTIgLy8gbmV3IHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2YgbmV3IGVsZW1lbnQKCWZyYW1lX2RpZyAtMyAvLyBvbGQgZWxlbWVudCBsZW5ndGgKCTwKCWJueiBzd2FwcGVkX2RpZmZlcmVuY2UKCWZyYW1lX2RpZyAtMiAvLyBuZXcgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBuZXcgZWxlbWVudAoJZnJhbWVfZGlnIC0zIC8vIG9sZCBlbGVtZW50IGxlbmd0aAoJaW50IDEKCXN0b3JlIDcgLy8gc3VidHJhY3QgaGVhZCBkaWZmZXJlbmNlCgliIGdldF9kaWZmZXJlbmNlCgpzd2FwcGVkX2RpZmZlcmVuY2U6CglmcmFtZV9kaWcgLTMgLy8gb2xkIGVsZW1lbnQgbGVuZ3RoCglmcmFtZV9kaWcgLTIgLy8gbmV3IHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2YgbmV3IGVsZW1lbnQKCWludCAwCglzdG9yZSA3IC8vIHN1YnRyYWN0IGhlYWQgZGlmZmVyZW5jZQoKZ2V0X2RpZmZlcmVuY2U6CgktIC8vIGdldCBsZW5ndGggZGlmZmVyZW5jZQoJcmV0c3ViCgp1cGRhdGVfZHluYW1pY19oZWFkOgoJcHJvdG8gMiAwCglmcmFtZV9kaWcgLTIgLy8gbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9kaWcgLTEgLy8gZHluYW1pYyBhcnJheSBvZmZzZXQKCWV4dHJhY3RfdWludDE2IC8vIGV4dHJhY3QgZHluYW1pYyBhcnJheSBvZmZzZXQKCWxvYWQgNyAvLyBzdWJ0cmFjdCBoZWFkIGRpZmZlcmVuY2UKCWJ6IHN1YnRyYWN0X2hlYWRfZGlmZmVyZW5jZQoJKyAvLyBhZGQgZGlmZmVyZW5jZSB0byBvZmZzZXQKCWIgZW5kX2NhbGNfbmV3X2hlYWQKCnN1YnRyYWN0X2hlYWRfZGlmZmVyZW5jZToKCXN3YXAKCS0gLy8gc3VidHJhY3QgZGlmZmVyZW5jZSBmcm9tIG9mZmV0CgplbmRfY2FsY19uZXdfaGVhZDoKCWl0b2IgLy8gY29udmVydCB0byBieXRlcwoJZXh0cmFjdCA2IDIgLy8gY29udmVydCB0byB1aW50MTYKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglzd2FwCglmcmFtZV9kaWcgLTEgLy8gb2Zmc2V0Cglzd2FwCglyZXBsYWNlMyAvLyB1cGRhdGUgb2Zmc2V0CglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCXJldHN1YgoKYmFyZV9yb3V0ZV9jcmVhdGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJPT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgY3JlYXRlCglpbnQgMQoJcmV0dXJuCgpjcmVhdGU6Cglwcm90byAwIDAKCXJldHN1YgoKYmFyZV9yb3V0ZV9PcHRJbjoKCXR4biBPbkNvbXBsZXRpb24KCWludCBPcHRJbgoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWNhbGxzdWIgb3B0SW4KCWludCAxCglyZXR1cm4KCm9wdEluOgoJcHJvdG8gMCAwCglyZXRzdWIKCmFiaV9yb3V0ZV9zdGF0aWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBzdGF0aWNBcnJheQoJaW50IDEKCXJldHVybgoKc3RhdGljQXJyYXk6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjkKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMQoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfcmV0dXJuU3RhdGljQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgcmV0dXJuU3RhdGljQXJyYXkKCWludCAxCglyZXR1cm4KCnJldHVyblN0YXRpY0FycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1CgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzcKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3RhdGljQXJyYXlBcmc6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWNhbGxzdWIgc3RhdGljQXJyYXlBcmcKCWludCAxCglyZXR1cm4KCnN0YXRpY0FycmF5QXJnOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQxCgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9ub25MaXRlcmFsU3RhdGljQXJyYXlFbGVtZW50czoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAzCgljYWxsc3ViIG5vbkxpdGVyYWxTdGF0aWNBcnJheUVsZW1lbnRzCglpbnQgMQoJcmV0dXJuCgpub25MaXRlcmFsU3RhdGljQXJyYXlFbGVtZW50czoKCXByb3RvIDQgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NQoJLy8gbjEgPSAxMQoJaW50IDExCglmcmFtZV9idXJ5IC0xIC8vIG4xOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDYKCS8vIG4yID0gMjIKCWludCAyMgoJZnJhbWVfYnVyeSAtMiAvLyBuMjogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ3CgkvLyBuMyA9IDMzCglpbnQgMzMKCWZyYW1lX2J1cnkgLTMgLy8gbjM6IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0OAoJLy8gYTogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFtuMSwgbjIsIG4zXQoJZnJhbWVfZGlnIC0xIC8vIG4xOiB1aW50NjQKCWl0b2IKCWZyYW1lX2RpZyAtMiAvLyBuMjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBuMzogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2J1cnkgLTQgLy8gYTogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjUwCgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtNCAvLyBhOiB1aW50NjRbM10KCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9taXhlZFN0YXRpY0FycmF5RWxlbWVudHM6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMwoJY2FsbHN1YiBtaXhlZFN0YXRpY0FycmF5RWxlbWVudHMKCWludCAxCglyZXR1cm4KCm1peGVkU3RhdGljQXJyYXlFbGVtZW50czoKCXByb3RvIDQgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo1NAoJLy8gbjEgPSAzCglpbnQgMwoJZnJhbWVfYnVyeSAtMSAvLyBuMTogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjU1CgkvLyBuMiA9IDQKCWludCA0CglmcmFtZV9idXJ5IC0yIC8vIG4yOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NTYKCS8vIG4zID0gNQoJaW50IDUKCWZyYW1lX2J1cnkgLTMgLy8gbjM6IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo1NwoJLy8gYTogU3RhdGljQXJyYXk8dWludDY0LCA5PiA9IFswLCAxLCAyLCBuMSwgbjIsIG4zLCA2LCA3LCA4XQoJaW50IDAKCWl0b2IKCWludCAxCglpdG9iCgljb25jYXQKCWludCAyCglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBuMTogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMiAvLyBuMjogdWludDY0CglpdG9iCgljb25jYXQKCWZyYW1lX2RpZyAtMyAvLyBuMzogdWludDY0CglpdG9iCgljb25jYXQKCWludCA2CglpdG9iCgljb25jYXQKCWludCA3CglpdG9iCgljb25jYXQKCWludCA4CglpdG9iCgljb25jYXQKCWZyYW1lX2J1cnkgLTQgLy8gYTogdWludDY0WzldCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjU5CgkvLyByZXR1cm4gYVsxXSArIGFbNF0gKyBhWzddOwoJZnJhbWVfZGlnIC00IC8vIGE6IHVpbnQ2NFs5XQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWZyYW1lX2RpZyAtNCAvLyBhOiB1aW50NjRbOV0KCWludCA0CglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCgkrCglmcmFtZV9kaWcgLTQgLy8gYTogdWludDY0WzldCglpbnQgNwoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJKwoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfbm9uTGl0ZXJhbFN0YXRpY0FycmF5QWNjZXNzOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgbm9uTGl0ZXJhbFN0YXRpY0FycmF5QWNjZXNzCglpbnQgMQoJcmV0dXJuCgpub25MaXRlcmFsU3RhdGljQXJyYXlBY2Nlc3M6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NjMKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo2NAoJLy8gbiA9IDIKCWludCAyCglmcmFtZV9idXJ5IC0yIC8vIG46IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo2NgoJLy8gcmV0dXJuIGFbbl07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglmcmFtZV9kaWcgLTIgLy8gbjogdWludDY0CglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zZXRTdGF0aWNBcnJheUVsZW1lbnQ6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgc2V0U3RhdGljQXJyYXlFbGVtZW50CglpbnQgMQoJcmV0dXJuCgpzZXRTdGF0aWNBcnJheUVsZW1lbnQ6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NzAKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo3MgoJLy8gYVsxXSA9IDIyMgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMjIyCglpdG9iCglyZXBsYWNlMwoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NzQKCS8vIHJldHVybiBhWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3N0YXRpY0FycmF5SW5TdG9yYWdlUmVmOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgc3RhdGljQXJyYXlJblN0b3JhZ2VSZWYKCWludCAxCglyZXR1cm4KCnN0YXRpY0FycmF5SW5TdG9yYWdlUmVmOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjc4CgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6ODAKCS8vIHRoaXMuZ1JlZi5wdXQoYSkKCWJ5dGUgImdSZWYiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfZ2xvYmFsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo4MQoJLy8gdGhpcy5sUmVmLnB1dCh0aGlzLnR4bi5zZW5kZXIsIGEpCgl0eG4gU2VuZGVyCglieXRlICJsUmVmIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYXBwX2xvY2FsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo4MgoJLy8gdGhpcy5iUmVmLnB1dChhKQoJYnl0ZSAiYlJlZiIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWJveF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6ODQKCS8vIHJldDogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsKCWJ5dGUgImdSZWYiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCXR4biBTZW5kZXIKCWJ5dGUgImxSZWYiCglhcHBfbG9jYWxfZ2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlICJiUmVmIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIHJldDogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjkwCgkvLyByZXR1cm4gcmV0OwoJZnJhbWVfZGlnIC0yIC8vIHJldDogdWludDY0WzNdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZVJlZjoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwCgljYWxsc3ViIHVwZGF0ZVN0YXRpY0FycmF5SW5TdG9yYWdlUmVmCglpbnQgMQoJcmV0dXJuCgp1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZVJlZjoKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo5NAoJLy8gYTogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsxMSwgMjIsIDMzXQoJaW50IDExCglpdG9iCglpbnQgMjIKCWl0b2IKCWNvbmNhdAoJaW50IDMzCglpdG9iCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjk2CgkvLyB0aGlzLmdSZWYucHV0KGEpCglieXRlICJnUmVmIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYXBwX2dsb2JhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6OTcKCS8vIHRoaXMubFJlZi5wdXQodGhpcy50eG4uc2VuZGVyLCBhKQoJdHhuIFNlbmRlcgoJYnl0ZSAibFJlZiIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9sb2NhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6OTgKCS8vIHRoaXMuYlJlZi5wdXQoYSkKCWJ5dGUgImJSZWYiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglib3hfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEwMAoJLy8gdGhpcy5nUmVmLmdldCgpWzFdID0gMTExCglieXRlICJnUmVmIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDExMQoJaXRvYgoJcmVwbGFjZTMKCWJ5dGUgImdSZWYiCglzd2FwCglhcHBfZ2xvYmFsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMDEKCS8vIHRoaXMubFJlZi5nZXQodGhpcy50eG4uc2VuZGVyKVsxXSA9IDIyMgoJdHhuIFNlbmRlcgoJYnl0ZSAibFJlZiIKCWFwcF9sb2NhbF9nZXQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDIyMgoJaXRvYgoJcmVwbGFjZTMKCXR4biBTZW5kZXIKCWJ5dGUgImxSZWYiCgl1bmNvdmVyIDIKCWFwcF9sb2NhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTAyCgkvLyB0aGlzLmJSZWYuZ2V0KClbMV0gPSAzMzMKCWJ5dGUgImJSZWYiCglib3hfZ2V0Cglhc3NlcnQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDMzMwoJaXRvYgoJcmVwbGFjZTMKCWJ5dGUgImJSZWYiCglzd2FwCglib3hfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEwNAoJLy8gcmV0OiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWwoJYnl0ZSAiZ1JlZiIKCWFwcF9nbG9iYWxfZ2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJdHhuIFNlbmRlcgoJYnl0ZSAibFJlZiIKCWFwcF9sb2NhbF9nZXQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCgljb25jYXQKCWJ5dGUgImJSZWYiCglib3hfZ2V0Cglhc3NlcnQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCgljb25jYXQKCWZyYW1lX2J1cnkgLTIgLy8gcmV0OiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTEwCgkvLyByZXR1cm4gcmV0OwoJZnJhbWVfZGlnIC0yIC8vIHJldDogdWludDY0WzNdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zdGF0aWNBcnJheUluU3RvcmFnZU1hcDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwCgljYWxsc3ViIHN0YXRpY0FycmF5SW5TdG9yYWdlTWFwCglpbnQgMQoJcmV0dXJuCgpzdGF0aWNBcnJheUluU3RvcmFnZU1hcDoKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMTQKCS8vIGE6IFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMTYKCS8vIHRoaXMuZ01hcC5wdXQoJ2dNYXAnLCBhKQoJYnl0ZSAiZ01hcCIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWFwcF9nbG9iYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjExNwoJLy8gdGhpcy5sTWFwLnB1dCh0aGlzLnR4bi5zZW5kZXIsICdsTWFwJywgYSkKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfbG9jYWxfcHV0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjExOAoJLy8gdGhpcy5iTWFwLnB1dCgnYk1hcCcsIGEpCglieXRlICJiTWFwIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMjAKCS8vIHJldDogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsKCWJ5dGUgImdNYXAiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglhcHBfbG9jYWxfZ2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlICJiTWFwIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIHJldDogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjEyNgoJLy8gcmV0dXJuIHJldDsKCWZyYW1lX2RpZyAtMiAvLyByZXQ6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cAoJY2FsbHN1YiB1cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZU1hcAoJaW50IDEKCXJldHVybgoKdXBkYXRlU3RhdGljQXJyYXlJblN0b3JhZ2VNYXA6Cglwcm90byAyIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTMwCgkvLyBhOiBTdGF0aWNBcnJheTx1aW50NjQsIDM+ID0gWzExLCAyMiwgMzNdCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTMyCgkvLyB0aGlzLmdNYXAucHV0KCdnTWFwJywgYSkKCWJ5dGUgImdNYXAiCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdCglhcHBfZ2xvYmFsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMzMKCS8vIHRoaXMubE1hcC5wdXQodGhpcy50eG4uc2VuZGVyLCAnbE1hcCcsIGEpCgl0eG4gU2VuZGVyCglieXRlICJsTWFwIgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXQoJYXBwX2xvY2FsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMzQKCS8vIHRoaXMuYk1hcC5wdXQoJ2JNYXAnLCBhKQoJYnl0ZSAiYk1hcCIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbM10KCWJveF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTM2CgkvLyB0aGlzLmdNYXAuZ2V0KCdnTWFwJylbMV0gPSAxMTExCglieXRlICJnTWFwIgoJYXBwX2dsb2JhbF9nZXQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDExMTEKCWl0b2IKCXJlcGxhY2UzCglieXRlICJnTWFwIgoJc3dhcAoJYXBwX2dsb2JhbF9wdXQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTM3CgkvLyB0aGlzLmxNYXAuZ2V0KHRoaXMudHhuLnNlbmRlciwgJ2xNYXAnKVsxXSA9IDIyMjIKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglhcHBfbG9jYWxfZ2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAyMjIyCglpdG9iCglyZXBsYWNlMwoJdHhuIFNlbmRlcgoJYnl0ZSAibE1hcCIKCXVuY292ZXIgMgoJYXBwX2xvY2FsX3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxMzgKCS8vIHRoaXMuYk1hcC5nZXQoJ2JNYXAnKVsxXSA9IDMzMzMKCWJ5dGUgImJNYXAiCglib3hfZ2V0Cglhc3NlcnQKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDMzMzMKCWl0b2IKCXJlcGxhY2UzCglieXRlICJiTWFwIgoJc3dhcAoJYm94X3B1dAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNDAKCS8vIHJldDogU3RhdGljQXJyYXk8dWludDY0LCAzPiA9IFsKCWJ5dGUgImdNYXAiCglhcHBfZ2xvYmFsX2dldAoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCXR4biBTZW5kZXIKCWJ5dGUgImxNYXAiCglhcHBfbG9jYWxfZ2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglieXRlICJiTWFwIgoJYm94X2dldAoJYXNzZXJ0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIHJldDogdWludDY0WzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE0NgoJLy8gcmV0dXJuIHJldDsKCWZyYW1lX2RpZyAtMiAvLyByZXQ6IHVpbnQ2NFszXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfbmVzdGVkU3RhdGljQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgbmVzdGVkU3RhdGljQXJyYXkKCWludCAxCglyZXR1cm4KCm5lc3RlZFN0YXRpY0FycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE1MAoJLy8gYTogU3RhdGljQXJyYXk8U3RhdGljQXJyYXk8dWludDY0LCAzPiwgMz4gPSBbWzExLCAyMiwgMzNdLCBbNDQsIDU1LCA2Nl0sIFs3NywgODgsIDk5XV0KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglpbnQgNDQKCWl0b2IKCWludCA1NQoJaXRvYgoJY29uY2F0CglpbnQgNjYKCWl0b2IKCWNvbmNhdAoJY29uY2F0CglpbnQgNzcKCWl0b2IKCWludCA4OAoJaXRvYgoJY29uY2F0CglpbnQgOTkKCWl0b2IKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXVszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNTIKCS8vIHJldHVybiBhWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXVszXQoJaW50IDEKCWludCAyNCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZU5lc3RlZFN0YXRpY0FycmF5RWxlbWVudDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiB1cGRhdGVOZXN0ZWRTdGF0aWNBcnJheUVsZW1lbnQKCWludCAxCglyZXR1cm4KCnVwZGF0ZU5lc3RlZFN0YXRpY0FycmF5RWxlbWVudDoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNTYKCS8vIGE6IFN0YXRpY0FycmF5PFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4sIDM+ID0gW1sxMSwgMjIsIDMzXSwgWzQ0LCA1NSwgNjZdLCBbNzcsIDg4LCA5OV1dCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJaW50IDQ0CglpdG9iCglpbnQgNTUKCWl0b2IKCWNvbmNhdAoJaW50IDY2CglpdG9iCgljb25jYXQKCWNvbmNhdAoJaW50IDc3CglpdG9iCglpbnQgODgKCWl0b2IKCWNvbmNhdAoJaW50IDk5CglpdG9iCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM11bM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTU4CgkvLyBhWzFdWzFdID0gNTU1CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdWzNdCglpbnQgMQoJaW50IDI0IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCSsKCWludCA1NTUKCWl0b2IKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFszXVszXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNjAKCS8vIHJldHVybiBhWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFszXVszXQoJaW50IDEKCWludCAyNCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZU5lc3RlZFN0YXRpY0FycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHVwZGF0ZU5lc3RlZFN0YXRpY0FycmF5CglpbnQgMQoJcmV0dXJuCgp1cGRhdGVOZXN0ZWRTdGF0aWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNjQKCS8vIGE6IFN0YXRpY0FycmF5PFN0YXRpY0FycmF5PHVpbnQ2NCwgMz4sIDM+ID0gW1sxMSwgMjIsIDMzXSwgWzQ0LCA1NSwgNjZdLCBbNzcsIDg4LCA5OV1dCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJaW50IDQ0CglpdG9iCglpbnQgNTUKCWl0b2IKCWNvbmNhdAoJaW50IDY2CglpdG9iCgljb25jYXQKCWNvbmNhdAoJaW50IDc3CglpdG9iCglpbnQgODgKCWl0b2IKCWNvbmNhdAoJaW50IDk5CglpdG9iCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbM11bM10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTY2CgkvLyBhWzFdID0gWzQ0NCwgNTU1LCA2NjZdCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdWzNdCglpbnQgMQoJaW50IDI0IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgNDQ0CglpdG9iCglpbnQgNTU1CglpdG9iCgljb25jYXQKCWludCA2NjYKCWl0b2IKCWNvbmNhdAoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0WzNdWzNdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE2OAoJLy8gcmV0dXJuIGFbMV1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0WzNdWzNdCglpbnQgMQoJaW50IDI0IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdGhyZWVEaW1lbnNpb25hbFVpbnQxNkFycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHRocmVlRGltZW5zaW9uYWxVaW50MTZBcnJheQoJaW50IDEKCXJldHVybgoKdGhyZWVEaW1lbnNpb25hbFVpbnQxNkFycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE3MgoJLy8gYTogU3RhdGljQXJyYXk8U3RhdGljQXJyYXk8U3RhdGljQXJyYXk8dWludDE2LCAyPiwgMj4sIDI+ID0gWwoJaW50IDExCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgNDQKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWNvbmNhdAoJaW50IDU1CglpdG9iCglleHRyYWN0IDYgMAoJaW50IDY2CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgNzcKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgODgKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNlsyXVsyXVsyXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNzYKCS8vIGFbMV1bMV0gPSBbNzc3LCA4ODhdCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2WzJdWzJdWzJdCglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAxCglpbnQgNCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJKwoJaW50IDc3NwoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA4ODgKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNlsyXVsyXVsyXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxNzgKCS8vIHJldHVybiBhWzFdWzFdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNlsyXVsyXVsyXQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMQoJaW50IDQgLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCSsKCWludCAxCglpbnQgMiAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJKwoJaW50IDIKCWV4dHJhY3QzCglieXRlIDB4RkZGRgoJYiYKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3NpbXBsZVR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHNpbXBsZVR1cGxlCglpbnQgMQoJcmV0dXJuCgpzaW1wbGVUdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoxODIKCS8vIGE6IFt1aW50NjQsIHVpbnQxNiwgdWludDY0LCB1aW50MTZdID0gWzExLCAyMiwgMzMsIDQ0XQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMTQKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTEKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDIyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDQ0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50NjQsdWludDE2LHVpbnQ2NCx1aW50MTZdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE4NAoJLy8gcmV0dXJuIGFbM107CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0LHVpbnQxNl0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMTgKCWludCAyCglleHRyYWN0MwoJYnl0ZSAweEZGRkYKCWImCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheUluVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYXJyYXlJblR1cGxlCglpbnQgMQoJcmV0dXJuCgphcnJheUluVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTg4CgkvLyBhOiBbdWludDY0LCB1aW50MTYsIFN0YXRpY0FycmF5PHVpbnQ2NCwgMj4sIHVpbnQxNl0gPSBbCglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAxYwoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAxMQoJaXRvYgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMjIKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAzMwoJaXRvYgoJaW50IDQ0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDU1CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50NjQsdWludDE2LHVpbnQ2NFsyXSx1aW50MTZdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjE5MgoJLy8gcmV0dXJuIGFbMl1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0WzJdLHVpbnQxNl0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMTAKCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJKwoJaW50IDgKCWV4dHJhY3QzCglidG9pCglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV90dXBsZUluQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdHVwbGVJbkFycmF5CglpbnQgMQoJcmV0dXJuCgp0dXBsZUluQXJyYXk6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MTk2CgkvLyBhOiBTdGF0aWNBcnJheTxbdWludDY0LCB1aW50MTZdLCAyPiA9IFsKCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDBhCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDExCglpdG9iCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAyMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMGEKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDQ0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0Cgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTZdWzJdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIwMAoJLy8gcmV0dXJuIGFbMV1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTZdWzJdCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDEKCWludCAxMCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDgKCSsKCWludCAyCglleHRyYWN0MwoJYnl0ZSAweEZGRkYKCWImCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV90dXBsZUluVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdHVwbGVJblR1cGxlCglpbnQgMQoJcmV0dXJuCgp0dXBsZUluVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjA0CgkvLyBhOiBbdWludDE2LCB1aW50MTYsIFt1aW50NjQsIHVpbnQxNl0sIFt1aW50MTYsIHVpbnQ2NF1dID0gWwoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMTgKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTEKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAyMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMGEKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDQ0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDBhCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDU1CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgNjYKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTYsdWludDE2LFt1aW50NjQsdWludDE2XSxbdWludDE2LHVpbnQ2NF1dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIwOAoJLy8gcmV0dXJuIGFbM11bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50MTYsW3VpbnQ2NCx1aW50MTZdLFt1aW50MTYsdWludDY0XV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMTQKCWludCAyCgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3Nob3J0VHlwZU5vdGF0aW9uOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHNob3J0VHlwZU5vdGF0aW9uCglpbnQgMQoJcmV0dXJuCgpzaG9ydFR5cGVOb3RhdGlvbjoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMTIKCS8vIGE6IFt1aW50MTY8Mj4sIHVpbnQ2NDwyPiwgdWludDE2PDI+XSA9IFsKCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDE4CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDExCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAzMwoJaXRvYgoJaW50IDQ0CglpdG9iCgljb25jYXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDU1CglpdG9iCglleHRyYWN0IDYgMAoJaW50IDY2CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNlsyXSx1aW50NjRbMl0sdWludDE2WzJdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMTYKCS8vIHJldHVybiBhWzJdWzFdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbMl0sdWludDY0WzJdLHVpbnQxNlsyXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMjAKCWludCAxCglpbnQgMiAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJKwoJaW50IDIKCWV4dHJhY3QzCglieXRlIDB4RkZGRgoJYiYKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2Rpc2d1c3Rpbmc6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgZGlzZ3VzdGluZwoJaW50IDEKCXJldHVybgoKZGlzZ3VzdGluZzoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMjAKCS8vIGE6IFN0YXRpY0FycmF5PFt1aW50MTY8Mj4sIHVpbnQ2NCwgW3VpbnQxNiwgdWludDY0XSwgU3RhdGljQXJyYXk8dWludDY0PDI+LCAyPl0sIDI+ID0gWwoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMzYKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTEKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMjIKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDMzCglpdG9iCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDBhCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDQ0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgNTUKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgNjYKCWl0b2IKCWludCA3NwoJaXRvYgoJY29uY2F0CglpbnQgODgKCWl0b2IKCWludCA5OQoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMzYKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTExCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIyMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMzCglpdG9iCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDBhCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDQ0NAoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDU1NQoJaXRvYgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCA2NjYKCWl0b2IKCWludCA3NzcKCWl0b2IKCWNvbmNhdAoJaW50IDg4OAoJaXRvYgoJaW50IDk5OQoJaXRvYgoJY29uY2F0Cgljb25jYXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbMl0sdWludDY0LFt1aW50MTYsdWludDY0XSx1aW50NjRbMl1bMl1dWzJdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIyNQoJLy8gYVsxXVszXVsxXSA9IFs4ODg4LCA5OTk5XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbMl0sdWludDY0LFt1aW50MTYsdWludDY0XSx1aW50NjRbMl1bMl1dWzJdCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDEKCWludCA1NCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDIyCgkrCglpbnQgMQoJaW50IDE2IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CgkrCglpbnQgODg4OAoJaXRvYgoJaW50IDk5OTkKCWl0b2IKCWNvbmNhdAoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNlsyXSx1aW50NjQsW3VpbnQxNix1aW50NjRdLHVpbnQ2NFsyXVsyXV1bMl0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjI2CgkvLyByZXR1cm4gYVsxXVszXVsxXVswXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2WzJdLHVpbnQ2NCxbdWludDE2LHVpbnQ2NF0sdWludDY0WzJdWzJdXVsyXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAxCglpbnQgNTQgLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAyMgoJKwoJaW50IDEKCWludCAxNiAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJKwoJaW50IDAKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CgkrCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3JldHVyblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHJldHVyblR1cGxlCglpbnQgMQoJcmV0dXJuCgpyZXR1cm5UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyMzAKCS8vIGE6IFt1aW50NjQsIHVpbnQxNiwgdWludDY0XSA9IFsxMSwgMjIsIDMzXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMTIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTEKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDIyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDY0LHVpbnQxNix1aW50NjRdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIzMQoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0XQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdHVwbGVBcmc6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWNhbGxzdWIgdHVwbGVBcmcKCWludCAxCglyZXR1cm4KCnR1cGxlQXJnOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIzNQoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ2NCx1aW50MTYsdWludDY0XQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCA4CglpbnQgMgoJZXh0cmFjdDMKCWJ5dGUgMHhGRkZGCgliJgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfZHluYW1pY0FycmF5OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIGR5bmFtaWNBcnJheQoJaW50IDEKCXJldHVybgoKZHluYW1pY0FycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjIzOQoJLy8gYTogdWludDY0W10gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFtdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI0MQoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0W10KCWludCAxCglpbnQgOCAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglpbnQgOAoJZXh0cmFjdDMKCWJ0b2kKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3JldHVybkR5bmFtaWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiByZXR1cm5EeW5hbWljQXJyYXkKCWludCAxCglyZXR1cm4KCnJldHVybkR5bmFtaWNBcnJheToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNDUKCS8vIGE6IHVpbnQ2NFtdID0gWzExLCAyMiwgMzNdCglpbnQgMTEKCWl0b2IKCWludCAyMgoJaXRvYgoJY29uY2F0CglpbnQgMzMKCWl0b2IKCWNvbmNhdAoJYnl0ZSAweDAwMDMKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNDYKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9keW5hbWljQXJyYXlBcmc6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCXR4bmEgQXBwbGljYXRpb25BcmdzIDEKCWNhbGxzdWIgZHluYW1pY0FycmF5QXJnCglpbnQgMQoJcmV0dXJuCgpkeW5hbWljQXJyYXlBcmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjUwCgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfdXBkYXRlRHluYW1pY0FycmF5RWxlbWVudDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljQXJyYXlFbGVtZW50CglpbnQgMQoJcmV0dXJuCgp1cGRhdGVEeW5hbWljQXJyYXlFbGVtZW50OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI1NAoJLy8gYTogdWludDY0W10gPSBbMTEsIDIyLCAzM10KCWludCAxMQoJaXRvYgoJaW50IDIyCglpdG9iCgljb25jYXQKCWludCAzMwoJaXRvYgoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQ2NFtdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI1NgoJLy8gYVsxXSA9IDIyMgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglpbnQgMQoJaW50IDggLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJaW50IDIyMgoJaXRvYgoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjU4CgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDEKCWludCA4IC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfZHluYW1pY1R1cGxlQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgZHluYW1pY1R1cGxlQXJyYXkKCWludCAxCglyZXR1cm4KCmR5bmFtaWNUdXBsZUFycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI2MgoJLy8gYTogW3VpbnQxNiwgdWludDY0XVtdID0gW1sxMSwgMjJdLCBbMzMsIDQ0XV0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDBhCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDExCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMjIKCWl0b2IKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMGEKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMzMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCA0NAoJaXRvYgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0Cgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNix1aW50NjRdW10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjY0CgkvLyByZXR1cm4gYVsxXVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2LHVpbnQ2NF1bXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAxCglpbnQgMTAgLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJaW50IDIKCSsKCWludCA4CglleHRyYWN0MwoJYnRvaQoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfcmV0dXJuVHVwbGVXaXRoRHlhbWljQXJyYXk6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgcmV0dXJuVHVwbGVXaXRoRHlhbWljQXJyYXkKCWludCAxCglyZXR1cm4KCnJldHVyblR1cGxlV2l0aER5YW1pY0FycmF5OgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI2OAoJLy8gYTogW3VpbnQ2NCwgdWludDE2LCB1aW50NjRbXSwgdWludDE2W11dID0gWzEsIDIsIFszLCA0XSwgWzUsIDZdXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMGUKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMQoJaXRvYgoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDMKCWl0b2IKCWludCA0CglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA2CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDY0LHVpbnQxNix1aW50NjRbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjcwCgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDY0LHVpbnQxNix1aW50NjRbXSx1aW50MTZbXV0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3JldHVybkR5bmFtaWNBcnJheUZyb21UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiByZXR1cm5EeW5hbWljQXJyYXlGcm9tVHVwbGUKCWludCAxCglyZXR1cm4KCnJldHVybkR5bmFtaWNBcnJheUZyb21UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNzQKCS8vIGE6IFt1aW50OCwgdWludDE2LCB1aW50OFtdLCB1aW50MTZbXSwgdWludDhbXV0gPSBbMSwgMiwgWzMsIDRdLCBbNSwgNl0sIFs3LCA4XV0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA5CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNyAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWludCA0CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDUKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgNgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWludCA3CglpdG9iCglleHRyYWN0IDcgMAoJaW50IDgKCWl0b2IKCWV4dHJhY3QgNyAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTYsdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyNzYKCS8vIHJldHVybiBhWzRdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTYsdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCA3Cglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAxCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZUR5bmFtaWNBcnJheUluVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdXBkYXRlRHluYW1pY0FycmF5SW5UdXBsZQoJaW50IDEKCXJldHVybgoKdXBkYXRlRHluYW1pY0FycmF5SW5UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyODAKCS8vIGE6IFt1aW50OCwgdWludDE2W10sIHVpbnQ4W10sIHVpbnQxNltdLCB1aW50OFtdXSA9IFs5LCBbOF0sIFs3XSwgWzZdLCBbNV1dCglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAwOQoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCA5CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgOAoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNwoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNgoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI4MgoJLy8gYVswXSA9IDk5IGFzIHVpbnQ4CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMAoJaW50IDk5CglpdG9iCglleHRyYWN0IDcgMAoJcmVwbGFjZTMKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MjgzCgkvLyBhWzFdID0gWzEwLCAxMV0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAxCglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAyCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCXN0b3JlIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxvYWQgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBvbGQgZWxlbWVudAoJaW50IDEwCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDExCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglpbnQgMQoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY190dXBsZV9lbGVtZW50CglkdXAgLy8gZHVwIGxlbmd0aCBkaWZmZXJlbmNlCglpbnQgMwoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY19oZWFkCglkdXAgLy8gZHVwIGxlbmd0aCBkaWZmZXJlbmNlCglpbnQgNQoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY19oZWFkCglkdXAgLy8gZHVwIGxlbmd0aCBkaWZmZXJlbmNlCglpbnQgNwoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY19oZWFkCglwb3AgLy8gcG9wIGxlbmd0aCBkaWZmZXJlbmNlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyODQKCS8vIGFbMl0gPSBbMTIsIDEzXQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDMKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglpbnQgMTIKCWl0b2IKCWV4dHJhY3QgNyAwCglpbnQgMTMKCWl0b2IKCWV4dHJhY3QgNyAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWludCAzCgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX3R1cGxlX2VsZW1lbnQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCA1CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCA3CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCXBvcCAvLyBwb3AgbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI4NQoJLy8gYVszXSA9IFsxNCwgMTVdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNQoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMgoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCAxNAoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCAxNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJaW50IDUKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDcKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mjg2CgkvLyBhWzRdID0gWzE2LCAxN10KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCA3Cglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAxCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCXN0b3JlIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxvYWQgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBvbGQgZWxlbWVudAoJaW50IDE2CglpdG9iCglleHRyYWN0IDcgMAoJaW50IDE3CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglpbnQgNwoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY190dXBsZV9lbGVtZW50Cglwb3AgLy8gcG9wIGxlbmd0aCBkaWZmZXJlbmNlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDgsdWludDE2W10sdWludDhbXSx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyODgKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSx1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9ub25MaXRlcmFsRHluYW1pY0VsZW1lbnRJblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgbm9uTGl0ZXJhbER5bmFtaWNFbGVtZW50SW5UdXBsZQoJaW50IDEKCXJldHVybgoKbm9uTGl0ZXJhbER5bmFtaWNFbGVtZW50SW5UdXBsZToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czoyOTIKCS8vIGU6IHVpbnQxNltdID0gWzUsIDZdCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA2CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGU6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI5MwoJLy8gYTogW3VpbnQ4LCB1aW50MTYsIHVpbnQ4W10sIHVpbnQxNltdLCB1aW50OFtdXSA9IFsxLCAyLCBbMywgNF0sIGUsIFs3LCA4XV0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA5CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNyAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWludCA0CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJZnJhbWVfZGlnIC0xIC8vIGU6IHVpbnQxNltdCglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDcKCWl0b2IKCWV4dHJhY3QgNyAwCglpbnQgOAoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTIgLy8gYTogW3VpbnQ4LHVpbnQxNix1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjI5NQoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTIgLy8gYTogW3VpbnQ4LHVpbnQxNix1aW50OFtdLHVpbnQxNltdLHVpbnQ4W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVB1c2g6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYXJyYXlQdXNoCglpbnQgMQoJcmV0dXJuCgphcnJheVB1c2g6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mjk5CgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyXQoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMDEKCS8vIGEucHVzaCgzIGFzIHVpbnQxNikKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJZXh0cmFjdCAyIDAKCWNvbmNhdAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzAzCgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfYXJyYXlQb3A6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYXJyYXlQb3AKCWludCAxCglyZXR1cm4KCmFycmF5UG9wOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMwNwoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCAzCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMwOQoJLy8gYS5wb3AoKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCglleHRyYWN0IDIgMAoJY29uY2F0CglkdXAKCWxlbgoJaW50IDIKCS0KCWludCAwCglzd2FwCglleHRyYWN0MwoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMTEKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVBvcFZhbHVlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgYXJyYXlQb3BWYWx1ZQoJaW50IDEKCXJldHVybgoKYXJyYXlQb3BWYWx1ZToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMTUKCS8vIGE6IHVpbnQxNltdID0gWzEsIDIsIDNdCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDMKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMTcKCS8vIHYgPSBhLnBvcCgpIQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglkdXAKCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCglleHRyYWN0IDIgMAoJY29uY2F0CglkdXAKCWxlbgoJaW50IDIKCS0KCWludCAwCglzd2FwCglleHRyYWN0MwoJZHVwCglsZW4KCWludCAyCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWNvdmVyIDIKCWV4dHJhY3QzCglzd2FwCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCglmcmFtZV9idXJ5IC0yIC8vIHY6IHVpbnQxNgoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMTkKCS8vIHJldHVybiB2OwoJZnJhbWVfZGlnIC0yIC8vIHY6IHVpbnQxNgoJYnl0ZSAweEZGRkYKCWImCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVNwbGljZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBhcnJheVNwbGljZQoJaW50IDEKCXJldHVybgoKYXJyYXlTcGxpY2U6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzIzCgkvLyBhOiB1aW50NjRbXSA9IFsxLCAyLCAzXQoJaW50IDEKCWl0b2IKCWludCAyCglpdG9iCgljb25jYXQKCWludCAzCglpdG9iCgljb25jYXQKCWJ5dGUgMHgwMDAzCglzd2FwCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDY0W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzI1CgkvLyBhLnNwbGljZSgxLCAxKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgktCglpdG9iCglleHRyYWN0IDYgMgoJaW50IDEKCWludCA4CgkqCglpbnQgMgoJKwoJc3RvcmUgMTIgLy8gc3BsaWNlIHN0YXJ0CglpbnQgMQoJaW50IDgKCSoKCWludCA4CgkrCglzdG9yZSAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50NjRbXQoJaW50IDIKCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0CglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDY0W10KCWR1cAoJbGVuCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCSsKCWludCA4CgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50NjRbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMjcKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQ2NFtdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hcnJheVNwbGljZVZhbHVlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXBuIDMKCWNhbGxzdWIgYXJyYXlTcGxpY2VWYWx1ZQoJaW50IDEKCXJldHVybgoKYXJyYXlTcGxpY2VWYWx1ZToKCXByb3RvIDQgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMzEKCS8vIGE6IHVpbnQxNltdID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXQoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCA0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJaW50IDYKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCA3CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgOAoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJaW50IDkKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCAxMAoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMGEKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozMzMKCS8vIGkgPSAxCglpbnQgMQoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzM0CgkvLyBsID0gNwoJaW50IDcKCWZyYW1lX2J1cnkgLTMgLy8gbDogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMzNQoJLy8gdiA9IGEuc3BsaWNlKGksIGwpCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAwCglleHRyYWN0X3VpbnQxNgoJZnJhbWVfZGlnIC0zIC8vIGw6IHVpbnQ2NAoJLQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtMiAvLyBpOiB1aW50NjQKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTIgLy8gc3BsaWNlIHN0YXJ0CglmcmFtZV9kaWcgLTMgLy8gbDogdWludDY0CglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9kaWcgLTMgLy8gbDogdWludDY0CglpdG9iCglleHRyYWN0IDYgMgoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWludCAyCgktCglleHRyYWN0MwoJY29uY2F0Cglzd2FwCglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCglmcmFtZV9idXJ5IC00IC8vIHY6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjMzNwoJLy8gcmV0dXJuIHY7CglmcmFtZV9kaWcgLTQgLy8gdjogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2R5bmFtaWNBcnJheUVsZW1lbnRzOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgZHluYW1pY0FycmF5RWxlbWVudHMKCWludCAxCglyZXR1cm4KCmR5bmFtaWNBcnJheUVsZW1lbnRzOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM0MQoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCAzCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM0MgoJLy8gbmV3QTogdWludDE2W10gPSBbYVswXSwgYVsxXSwgYVsyXV0KCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDAKCWludCAyIC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWludCAyCglleHRyYWN0MwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMQoJaW50IDIgLy8gZWxlbWVudCBsZW5ndGgKCSogLy8gZWxlbWVudCBvZmZzZXQKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJaW50IDIKCWV4dHJhY3QzCgljb25jYXQKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDIKCWludCAyIC8vIGVsZW1lbnQgbGVuZ3RoCgkqIC8vIGVsZW1lbnQgb2Zmc2V0CglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWludCAyCglleHRyYWN0MwoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0yIC8vIG5ld0E6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM0NAoJLy8gcmV0dXJuIG5ld0E7CglmcmFtZV9kaWcgLTIgLy8gbmV3QTogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3NwbGljZUxhc3RFbGVtZW50OgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHNwbGljZUxhc3RFbGVtZW50CglpbnQgMQoJcmV0dXJuCgpzcGxpY2VMYXN0RWxlbWVudDoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNDgKCS8vIGE6IHVpbnQxNltdID0gWzEsIDIsIDNdCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDMKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNTAKCS8vIGEuc3BsaWNlKDIsIDEpCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglpbnQgMgoJaW50IDIKCSoKCWludCAyCgkrCglzdG9yZSAxMiAvLyBzcGxpY2Ugc3RhcnQKCWludCAxCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1MgoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3NwbGljZUxhc3RFbGVtZW50VmFsdWU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cAoJY2FsbHN1YiBzcGxpY2VMYXN0RWxlbWVudFZhbHVlCglpbnQgMQoJcmV0dXJuCgpzcGxpY2VMYXN0RWxlbWVudFZhbHVlOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1NgoJLy8gYTogdWludDE2W10gPSBbMSwgMiwgM10KCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWludCAzCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHVpbnQxNltdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM1OAoJLy8gdiA9IGEuc3BsaWNlKDIsIDEpCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWludCAwCglleHRyYWN0X3VpbnQxNgoJaW50IDEKCS0KCWl0b2IKCWV4dHJhY3QgNiAyCglpbnQgMgoJaW50IDIKCSoKCWludCAyCgkrCglzdG9yZSAxMiAvLyBzcGxpY2Ugc3RhcnQKCWludCAxCglpbnQgMgoJKgoJaW50IDIKCSsKCXN0b3JlIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMgoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCXN1YnN0cmluZzMKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJZHVwCglsZW4KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJKwoJaW50IDIKCS0KCXN3YXAKCXN1YnN0cmluZzMKCWNvbmNhdAoJY29uY2F0CglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDIKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJbG9hZCAxMiAvLyBzcGxpY2Ugc3RhcnQKCWxvYWQgMTMgLy8gc3BsaWNlIGJ5dGUgbGVuZ3RoCglpbnQgMgoJLQoJZXh0cmFjdDMKCWNvbmNhdAoJc3dhcAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoJZnJhbWVfYnVyeSAtMiAvLyB2OiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNjAKCS8vIHJldHVybiB2OwoJZnJhbWVfZGlnIC0yIC8vIHY6IHVpbnQxNltdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zcGxpY2VGaXJzdEVsZW1lbnQ6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgc3BsaWNlRmlyc3RFbGVtZW50CglpbnQgMQoJcmV0dXJuCgpzcGxpY2VGaXJzdEVsZW1lbnQ6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzY0CgkvLyBhOiB1aW50MTZbXSA9IFsxLCAyLCAzXQoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWJ5dGUgMHgwMDAzCglzd2FwCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzY2CgkvLyBhLnNwbGljZSgwLCAxKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgktCglpdG9iCglleHRyYWN0IDYgMgoJaW50IDAKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTIgLy8gc3BsaWNlIHN0YXJ0CglpbnQgMQoJaW50IDIKCSoKCWludCAyCgkrCglzdG9yZSAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDIKCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0CglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWR1cAoJbGVuCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCSsKCWludCAyCgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNjgKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zcGxpY2VGaXJzdEVsZW1lbnRWYWx1ZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwCgljYWxsc3ViIHNwbGljZUZpcnN0RWxlbWVudFZhbHVlCglpbnQgMQoJcmV0dXJuCgpzcGxpY2VGaXJzdEVsZW1lbnRWYWx1ZToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNzIKCS8vIGE6IHVpbnQxNltdID0gWzEsIDIsIDNdCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDMKCXN3YXAKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiB1aW50MTZbXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozNzQKCS8vIHYgPSBhLnNwbGljZSgwLCAxKQoJZnJhbWVfZGlnIC0xIC8vIGE6IHVpbnQxNltdCglpbnQgMAoJZXh0cmFjdF91aW50MTYKCWludCAxCgktCglpdG9iCglleHRyYWN0IDYgMgoJaW50IDAKCWludCAyCgkqCglpbnQgMgoJKwoJc3RvcmUgMTIgLy8gc3BsaWNlIHN0YXJ0CglpbnQgMQoJaW50IDIKCSoKCWludCAyCgkrCglzdG9yZSAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCWZyYW1lX2RpZyAtMSAvLyBhOiB1aW50MTZbXQoJaW50IDIKCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0CglzdWJzdHJpbmczCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWR1cAoJbGVuCglsb2FkIDEyIC8vIHNwbGljZSBzdGFydAoJbG9hZCAxMyAvLyBzcGxpY2UgYnl0ZSBsZW5ndGgKCSsKCWludCAyCgktCglzd2FwCglzdWJzdHJpbmczCgljb25jYXQKCWNvbmNhdAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAyCglmcmFtZV9kaWcgLTEgLy8gYTogdWludDE2W10KCWxvYWQgMTIgLy8gc3BsaWNlIHN0YXJ0Cglsb2FkIDEzIC8vIHNwbGljZSBieXRlIGxlbmd0aAoJaW50IDIKCS0KCWV4dHJhY3QzCgljb25jYXQKCXN3YXAKCWZyYW1lX2J1cnkgLTEgLy8gYTogdWludDE2W10KCWZyYW1lX2J1cnkgLTIgLy8gdjogdWludDE2W10KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mzc2CgkvLyByZXR1cm4gdjsKCWZyYW1lX2RpZyAtMiAvLyB2OiB1aW50MTZbXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfc3RyaW5nUmV0dXJuOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CgljYWxsc3ViIHN0cmluZ1JldHVybgoJaW50IDEKCXJldHVybgoKc3RyaW5nUmV0dXJuOgoJcHJvdG8gMCAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM4MAoJLy8gcmV0dXJuICdIZWxsbyBXb3JsZCEnOwoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3N0cmluZ0FyZzoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJZXh0cmFjdCAyIDAKCWNhbGxzdWIgc3RyaW5nQXJnCglpbnQgMQoJcmV0dXJuCgpzdHJpbmdBcmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mzg0CgkvLyBhc3NlcnQocyA9PT0gJ0hlbGxvIFdvcmxkIScpCglmcmFtZV9kaWcgLTEgLy8gczogYnl0ZXMKCWJ5dGUgIkhlbGxvIFdvcmxkISIKCT09Cglhc3NlcnQKCXJldHN1YgoKYWJpX3JvdXRlX3N0cmluZ0luVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgc3RyaW5nSW5UdXBsZQoJaW50IDEKCXJldHVybgoKc3RyaW5nSW5UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozODgKCS8vIGE6IFt1aW50MTYsIHVpbnQ4W10sIHN0cmluZywgdWludDhbXV0gPSBbMSwgWzJdLCAnSGVsbG8gV29ybGQhJywgWzNdXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDgKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNyAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSxzdHJpbmcsdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6MzkwCgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2LHVpbnQ4W10sc3RyaW5nLHVpbnQ4W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hY2Nlc1N0cmluZ0luVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYWNjZXNTdHJpbmdJblR1cGxlCglpbnQgMQoJcmV0dXJuCgphY2Nlc1N0cmluZ0luVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6Mzk0CgkvLyBhOiBbdWludDE2LCB1aW50OFtdLCBzdHJpbmcsIHVpbnQ4W11dID0gWzEsIFsyXSwgJ0hlbGxvIFdvcmxkIScsIFszXV0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA4CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWludCAyCglpdG9iCglleHRyYWN0IDcgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWJ5dGUgIkhlbGxvIFdvcmxkISIKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNyAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2LHVpbnQ4W10sc3RyaW5nLHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjM5NgoJLy8gYXNzZXJ0KGFbMl0gPT09ICdIZWxsbyBXb3JsZCEnKQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSxzdHJpbmcsdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNAoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglleHRyYWN0IDIgMAoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJPT0KCWFzc2VydAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czozOTgKCS8vIHJldHVybiBhWzJdOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSxzdHJpbmcsdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNAoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglleHRyYWN0IDIgMAoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZVN0cmluZ0luVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdXBkYXRlU3RyaW5nSW5UdXBsZQoJaW50IDEKCXJldHVybgoKdXBkYXRlU3RyaW5nSW5UdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MDIKCS8vIGE6IFt1aW50OCwgdWludDE2W10sIHN0cmluZywgdWludDE2W10sIHVpbnQ4W11dID0gWzksIFs4XSwgJ0hpPycsIFs2XSwgWzVdXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDkKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgOQoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDgKCWl0b2IKCWV4dHJhY3QgNiAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJYnl0ZSAiSGk/IgoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNgoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDA0CgkvLyBhWzBdID0gOTkgYXMgdWludDgKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDAKCWludCA5OQoJaXRvYgoJZXh0cmFjdCA3IDAKCXJlcGxhY2UzCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDA1CgkvLyBhWzFdID0gWzEwLCAxMV0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDEKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDIKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglpbnQgMTAKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMTEKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWludCAxCgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX3R1cGxlX2VsZW1lbnQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCAzCgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCA1CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCA3CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCXBvcCAvLyBwb3AgbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDA2CgkvLyBhWzJdID0gJ0hlbGxvIFdvcmxkIScKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDgsdWludDE2W10sc3RyaW5nLHVpbnQxNltdLHVpbnQ4W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDMKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglieXRlICJIZWxsbyBXb3JsZCEiCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJaW50IDMKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDUKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDcKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MDcKCS8vIGFbM10gPSBbMTQsIDE1XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNQoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMgoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCAxNAoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCAxNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJaW50IDUKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDcKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MDgKCS8vIGFbNF0gPSBbMTYsIDE3XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNwoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCAxNgoJaXRvYgoJZXh0cmFjdCA3IDAKCWludCAxNwoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJaW50IDcKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MTAKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50OCx1aW50MTZbXSxzdHJpbmcsdWludDE2W10sdWludDhbXV0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZVR1cGxlV2l0aE9ubHlEeW5hbWljVHlwZXM6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgdXBkYXRlVHVwbGVXaXRoT25seUR5bmFtaWNUeXBlcwoJaW50IDEKCXJldHVybgoKdXBkYXRlVHVwbGVXaXRoT25seUR5bmFtaWNUeXBlczoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MTQKCS8vIGE6IFt1aW50MTZbXSwgdWludDE2W10sIHVpbnQxNltdXSA9IFtbMV0sIFsyXSwgWzNdXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDYKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDE2CgkvLyBhWzBdID0gWzQsIDVdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAwCglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAyCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCXN0b3JlIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxvYWQgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBvbGQgZWxlbWVudAoJaW50IDQKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgNQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJaW50IDAKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDIKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDQKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MTcKCS8vIGFbMV0gPSBbNiwgN10KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDIKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglpbnQgNgoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA3CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglpbnQgMgoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY190dXBsZV9lbGVtZW50CglkdXAgLy8gZHVwIGxlbmd0aCBkaWZmZXJlbmNlCglpbnQgNAoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY19oZWFkCglwb3AgLy8gcG9wIGxlbmd0aCBkaWZmZXJlbmNlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQxOAoJLy8gYVsyXSA9IFs4LCA5XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgNAoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMgoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCA4CglpdG9iCglleHRyYWN0IDYgMAoJaW50IDkKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWludCA0CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX3R1cGxlX2VsZW1lbnQKCXBvcCAvLyBwb3AgbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDIwCgkvLyByZXR1cm4gYTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zaG9ydGVuRHluYW1pY0VsZW1lbnRJblR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHNob3J0ZW5EeW5hbWljRWxlbWVudEluVHVwbGUKCWludCAxCglyZXR1cm4KCnNob3J0ZW5EeW5hbWljRWxlbWVudEluVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDI0CgkvLyBhOiBbdWludDE2W10sIHVpbnQxNltdLCB1aW50MTZbXV0gPSBbWzEsIDJdLCBbMiwgM10sIFszLCA0XV0KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA2CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJYnl0ZSAweDAwMDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWludCAyCglpdG9iCglleHRyYWN0IDYgMAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWludCA0CglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglieXRlIDB4MDAwMgoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQyNgoJLy8gYVswXSA9IFs1XQoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMAoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMgoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCA1CglpdG9iCglleHRyYWN0IDYgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJaW50IDAKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDIKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJZHVwIC8vIGR1cCBsZW5ndGggZGlmZmVyZW5jZQoJaW50IDQKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfaGVhZAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0MjcKCS8vIGFbMV0gPSBbNl0KCWZyYW1lX2RpZyAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDIKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglpbnQgNgoJaXRvYgoJZXh0cmFjdCA2IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWludCAyCgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX3R1cGxlX2VsZW1lbnQKCWR1cCAvLyBkdXAgbGVuZ3RoIGRpZmZlcmVuY2UKCWludCA0CgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX2hlYWQKCXBvcCAvLyBwb3AgbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTZbXSx1aW50MTZbXSx1aW50MTZbXV0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDI4CgkvLyBhWzJdID0gWzddCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCA0Cglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAyCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCXN0b3JlIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxvYWQgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbGVuIC8vIGxlbmd0aCBvZiBvbGQgZWxlbWVudAoJaW50IDcKCWl0b2IKCWV4dHJhY3QgNiAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglpbnQgNAoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY190dXBsZV9lbGVtZW50Cglwb3AgLy8gcG9wIGxlbmd0aCBkaWZmZXJlbmNlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2W10sdWludDE2W10sdWludDE2W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQzMAoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdXQoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfbmFtZWRUdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBuYW1lZFR1cGxlCglpbnQgMQoJcmV0dXJuCgpuYW1lZFR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQzNAoJLy8gYTogewoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDQKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJYnl0ZSAiSGVsbG8gV29ybGQhIgoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IHsgZm9vOiB1aW50MTYsIGJhcjogc3RyaW5nLCB9CgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ0MgoJLy8gcmV0dXJuIGEuYmFyOwoJZnJhbWVfZGlnIC0xIC8vIGE6IHsgZm9vOiB1aW50MTYsIGJhcjogc3RyaW5nLCB9CglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJZXh0cmFjdCAyIDAKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV91cGRhdGVOYW1lZFR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIHVwZGF0ZU5hbWVkVHVwbGUKCWludCAxCglyZXR1cm4KCnVwZGF0ZU5hbWVkVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDQ2CgkvLyBhOiB7CglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAwNAoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglieXRlICJIaT8iCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogeyBmb286IHVpbnQxNiwgYmFyOiBzdHJpbmcsIH0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDU0CgkvLyBhLmJhciA9ICdIZWxsbyBXb3JsZCEnCglmcmFtZV9kaWcgLTEgLy8gYTogeyBmb286IHVpbnQxNiwgYmFyOiBzdHJpbmcsIH0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMgoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWJ5dGUgIkhlbGxvIFdvcmxkISIKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglpbnQgMgoJY2FsbHN1YiB1cGRhdGVfZHluYW1pY190dXBsZV9lbGVtZW50Cglwb3AgLy8gcG9wIGxlbmd0aCBkaWZmZXJlbmNlCglsb2FkIDMgLy8gZnVsbCB0dXBsZQoJZnJhbWVfYnVyeSAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NTYKCS8vIHJldHVybiBhLmJhcjsKCWZyYW1lX2RpZyAtMSAvLyBhOiB7IGZvbzogdWludDE2LCBiYXI6IHN0cmluZywgfQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAyCglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAxCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCWV4dHJhY3QgMiAwCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfY3VzdG9tVHlwZXM6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgY3VzdG9tVHlwZXMKCWludCAxCglyZXR1cm4KCmN1c3RvbVR5cGVzOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ2MAoJLy8gYWE6IEN1c3RvbVR5cGUgPSB7CglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAwNAoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglieXRlICJIaT8iCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYWE6IEN1c3RvbVR5cGUKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDY1CgkvLyBhYS5iYXIgPSAnSGVsbG8gV29ybGQhJwoJZnJhbWVfZGlnIC0xIC8vIGFhOiBDdXN0b21UeXBlCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJc3RvcmUgNCAvLyBvbGQgdHVwbGUgZWxlbWVudAoJbG9hZCA0IC8vIG9sZCB0dXBsZSBlbGVtZW50CglsZW4gLy8gbGVuZ3RoIG9mIG9sZCBlbGVtZW50CglieXRlICJIZWxsbyBXb3JsZCEiCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJaW50IDIKCWNhbGxzdWIgdXBkYXRlX2R5bmFtaWNfdHVwbGVfZWxlbWVudAoJcG9wIC8vIHBvcCBsZW5ndGggZGlmZmVyZW5jZQoJbG9hZCAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2J1cnkgLTEgLy8gYWE6IEN1c3RvbVR5cGUKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDY3CgkvLyByZXR1cm4gYWEuYmFyOwoJZnJhbWVfZGlnIC0xIC8vIGFhOiBDdXN0b21UeXBlCglkdXAKCXN0b3JlIDMgLy8gZnVsbCB0dXBsZQoJaW50IDIKCXN3YXAKCWR1cG4gMgoJdW5jb3ZlciAzCglpbnQgMgoJZXh0cmFjdDMKCWJ0b2kgLy8gc3RhcnQgb2YgZHluYW1pYyBhcnJheQoJZHVwCgljb3ZlciAyIC8vIGR1cGxpY2F0ZSBzdGFydCBmb3IgbGF0ZXIKCWludCAyCglleHRyYWN0MyAvLyBleHRyYWN0IGxlbmd0aCBvZiBhcnJheQoJYnRvaQoJaW50IDEKCSogLy8gZ2V0IGFycmF5IGxlbmd0aAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCglleHRyYWN0MwoJZXh0cmFjdCAyIDAKCWR1cAoJbGVuCglpdG9iCglleHRyYWN0IDYgMgoJc3dhcAoJY29uY2F0CglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9zdGF0aWNTdHJpbmdBcnJheUFyZzoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJY2FsbHN1YiBzdGF0aWNTdHJpbmdBcnJheUFyZwoJaW50IDEKCXJldHVybgoKc3RhdGljU3RyaW5nQXJyYXlBcmc6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDcxCgkvLyByZXR1cm4gYVsxXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBieXRlc1szXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAxCglpbnQgMgoJKgoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglleHRyYWN0IDIgMAoJZHVwCglsZW4KCWl0b2IKCWV4dHJhY3QgNiAyCglzd2FwCgljb25jYXQKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2R5bmFtaWNBY2Nlc3NPZkR5bmFtaWNFbGVtZW50SW5TdGF0aWNBcnJheToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQoJY2FsbHN1YiBkeW5hbWljQWNjZXNzT2ZEeW5hbWljRWxlbWVudEluU3RhdGljQXJyYXkKCWludCAxCglyZXR1cm4KCmR5bmFtaWNBY2Nlc3NPZkR5bmFtaWNFbGVtZW50SW5TdGF0aWNBcnJheToKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0NzUKCS8vIGkgPSAxCglpbnQgMQoJZnJhbWVfYnVyeSAtMiAvLyBpOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDc2CgkvLyByZXR1cm4gYVtpXTsKCWZyYW1lX2RpZyAtMSAvLyBhOiBieXRlc1szXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWZyYW1lX2RpZyAtMiAvLyBpOiB1aW50NjQKCWludCAyCgkqCglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWR1cAoJY292ZXIgMiAvLyBkdXBsaWNhdGUgc3RhcnQgZm9yIGxhdGVyCglpbnQgMgoJZXh0cmFjdDMgLy8gZXh0cmFjdCBsZW5ndGggb2YgYXJyYXkKCWJ0b2kKCWludCAxCgkqIC8vIGdldCBhcnJheSBsZW5ndGgKCWludCAyCgkrIC8vIGFkZCB0d28gZm9yIGxlbmd0aAoJZXh0cmFjdDMKCWV4dHJhY3QgMiAwCglkdXAKCWxlbgoJaXRvYgoJZXh0cmFjdCA2IDIKCXN3YXAKCWNvbmNhdAoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgphYmlfcm91dGVfZHluYW1pY0FycmF5SW5NaWRkbGVPZlR1cGxlOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CgljYWxsc3ViIGR5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZQoJaW50IDEKCXJldHVybgoKZHluYW1pY0FycmF5SW5NaWRkbGVPZlR1cGxlOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ4MAoJLy8gYTogW3VpbnQxNiwgdWludDhbXSwgdWludDE2XSA9IFsxLCBbMl0sIDNdCglieXRlIDB4CglkdXAKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglieXRlIDB4MDAwNgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAxCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglpbnQgMgoJaXRvYgoJZXh0cmFjdCA3IDAKCWJ5dGUgMHgwMDAxCglzd2FwCgljb25jYXQKCWR1cAoJbGVuCglsb2FkIDIgLy8gaGVhZCBvZmZzZXQKCWJ0b2kKCSsKCWl0b2IKCWV4dHJhY3QgNiAyCglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJc3dhcAoJY29uY2F0CglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMwoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2LHVpbnQ4W10sdWludDE2XQoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0ODIKCS8vIHJldHVybiBhOwoJZnJhbWVfZGlnIC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSx1aW50MTZdCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hY2Nlc3NEeW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGU6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWNhbGxzdWIgYWNjZXNzRHluYW1pY0FycmF5SW5NaWRkbGVPZlR1cGxlCglpbnQgMQoJcmV0dXJuCgphY2Nlc3NEeW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDg2CgkvLyBhOiBbdWludDE2LCB1aW50OFtdLCB1aW50MTZdID0gWzEsIFsyXSwgM10KCWJ5dGUgMHgKCWR1cAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglzdG9yZSAxIC8vIHR1cGxlIHRhaWwKCWJ5dGUgMHgwMDA2CglzdG9yZSAyIC8vIGhlYWQgb2Zmc2V0Cglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDEKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWludCAyCglpdG9iCglleHRyYWN0IDcgMAoJYnl0ZSAweDAwMDEKCXN3YXAKCWNvbmNhdAoJZHVwCglsZW4KCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJYnRvaQoJKwoJaXRvYgoJZXh0cmFjdCA2IDIKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCglzd2FwCgljb25jYXQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWludCAzCglpdG9iCglleHRyYWN0IDYgMAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDEgLy8gdHVwbGUgdGFpbAoJY29uY2F0CglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSx1aW50MTZdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ4OAoJLy8gcmV0dXJuIGFbMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdLHVpbnQxNl0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMgoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9hY2Nlc3NEeW5hbWljQXJyYXlFbGVtZW50SW5UdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiBhY2Nlc3NEeW5hbWljQXJyYXlFbGVtZW50SW5UdXBsZQoJaW50IDEKCXJldHVybgoKYWNjZXNzRHluYW1pY0FycmF5RWxlbWVudEluVHVwbGU6Cglwcm90byAxIDAKCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NDkyCgkvLyBhOiBbdWludDE2LCB1aW50OFtdXSA9IFsxMSwgWzIyLCAzMywgNDRdXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDQKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMTEKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMiAvLyBoZWFkIG9mZnNldAoJY29uY2F0CglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCWludCAyMgoJaXRvYgoJZXh0cmFjdCA3IDAKCWludCAzMwoJaXRvYgoJZXh0cmFjdCA3IDAKCWNvbmNhdAoJaW50IDQ0CglpdG9iCglleHRyYWN0IDcgMAoJY29uY2F0CglieXRlIDB4MDAwMwoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCWNvbmNhdAoJZnJhbWVfYnVyeSAtMSAvLyBhOiBbdWludDE2LHVpbnQ4W11dCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjQ5NAoJLy8gcmV0dXJuIGFbMV1bMV07CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdXQoJZHVwCglzdG9yZSAzIC8vIGZ1bGwgdHVwbGUKCWludCAyCglzd2FwCglkdXBuIDIKCXVuY292ZXIgMwoJaW50IDIKCWV4dHJhY3QzCglidG9pIC8vIHN0YXJ0IG9mIGR5bmFtaWMgYXJyYXkKCWludCAxCglpbnQgMSAvLyBlbGVtZW50IGxlbmd0aAoJKiAvLyBlbGVtZW50IG9mZnNldAoJaW50IDIKCSsgLy8gYWRkIHR3byBmb3IgbGVuZ3RoCgkrCglpbnQgMQoJZXh0cmFjdDMKCWJ5dGUgMHhGRkZGRkZGRgoJYiYKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX3VwZGF0ZUR5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZToKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiB1cGRhdGVEeW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGUKCWludCAxCglyZXR1cm4KCnVwZGF0ZUR5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZToKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9hYmkuYWxnby50czo0OTgKCS8vIGE6IFt1aW50MTYsIHVpbnQ4W10sIHVpbnQxNl0gPSBbMSwgWzJdLCAzXQoJYnl0ZSAweAoJZHVwCglzdG9yZSAwIC8vIHR1cGxlIGhlYWQKCXN0b3JlIDEgLy8gdHVwbGUgdGFpbAoJYnl0ZSAweDAwMDYKCXN0b3JlIDIgLy8gaGVhZCBvZmZzZXQKCWxvYWQgMCAvLyB0dXBsZSBoZWFkCglpbnQgMQoJaXRvYgoJZXh0cmFjdCA2IDAKCWNvbmNhdAoJc3RvcmUgMCAvLyB0dXBsZSBoZWFkCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0Cgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJaW50IDIKCWl0b2IKCWV4dHJhY3QgNyAwCglieXRlIDB4MDAwMQoJc3dhcAoJY29uY2F0CglkdXAKCWxlbgoJbG9hZCAyIC8vIGhlYWQgb2Zmc2V0CglidG9pCgkrCglpdG9iCglleHRyYWN0IDYgMgoJc3RvcmUgMiAvLyBoZWFkIG9mZnNldAoJbG9hZCAxIC8vIHR1cGxlIHRhaWwKCXN3YXAKCWNvbmNhdAoJc3RvcmUgMSAvLyB0dXBsZSB0YWlsCglsb2FkIDAgLy8gdHVwbGUgaGVhZAoJaW50IDMKCWl0b2IKCWV4dHJhY3QgNiAwCgljb25jYXQKCXN0b3JlIDAgLy8gdHVwbGUgaGVhZAoJbG9hZCAwIC8vIHR1cGxlIGhlYWQKCWxvYWQgMSAvLyB0dXBsZSB0YWlsCgljb25jYXQKCWZyYW1lX2J1cnkgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdLHVpbnQxNl0KCgkvLyB0ZXN0cy9jb250cmFjdHMvYWJpLmFsZ28udHM6NTAwCgkvLyBhWzFdID0gWzQsIDVdCglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdLHVpbnQxNl0KCWR1cAoJc3RvcmUgMyAvLyBmdWxsIHR1cGxlCglpbnQgMgoJc3dhcAoJZHVwbiAyCgl1bmNvdmVyIDMKCWludCAyCglleHRyYWN0MwoJYnRvaSAvLyBzdGFydCBvZiBkeW5hbWljIGFycmF5CglkdXAKCWNvdmVyIDIgLy8gZHVwbGljYXRlIHN0YXJ0IGZvciBsYXRlcgoJaW50IDIKCWV4dHJhY3QzIC8vIGV4dHJhY3QgbGVuZ3RoIG9mIGFycmF5CglidG9pCglpbnQgMQoJKiAvLyBnZXQgYXJyYXkgbGVuZ3RoCglpbnQgMgoJKyAvLyBhZGQgdHdvIGZvciBsZW5ndGgKCWV4dHJhY3QzCglzdG9yZSA0IC8vIG9sZCB0dXBsZSBlbGVtZW50Cglsb2FkIDQgLy8gb2xkIHR1cGxlIGVsZW1lbnQKCWxlbiAvLyBsZW5ndGggb2Ygb2xkIGVsZW1lbnQKCWludCA0CglpdG9iCglleHRyYWN0IDcgMAoJaW50IDUKCWl0b2IKCWV4dHJhY3QgNyAwCgljb25jYXQKCWJ5dGUgMHgwMDAyCglzd2FwCgljb25jYXQKCWludCAyCgljYWxsc3ViIHVwZGF0ZV9keW5hbWljX3R1cGxlX2VsZW1lbnQKCXBvcCAvLyBwb3AgbGVuZ3RoIGRpZmZlcmVuY2UKCWxvYWQgMyAvLyBmdWxsIHR1cGxlCglmcmFtZV9idXJ5IC0xIC8vIGE6IFt1aW50MTYsdWludDhbXSx1aW50MTZdCgoJLy8gdGVzdHMvY29udHJhY3RzL2FiaS5hbGdvLnRzOjUwMgoJLy8gcmV0dXJuIGE7CglmcmFtZV9kaWcgLTEgLy8gYTogW3VpbnQxNix1aW50OFtdLHVpbnQxNl0KCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKbWFpbjoKCXR4biBOdW1BcHBBcmdzCglibnogcm91dGVfYWJpCgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCT09CglibnogYmFyZV9yb3V0ZV9jcmVhdGUKCXR4biBPbkNvbXBsZXRpb24KCWludCBPcHRJbgoJPT0KCWludCAxCgltYXRjaCBiYXJlX3JvdXRlX09wdEluCgpyb3V0ZV9hYmk6CgltZXRob2QgInN0YXRpY0FycmF5KCl1aW50NjQiCgltZXRob2QgInJldHVyblN0YXRpY0FycmF5KCl1aW50NjRbM10iCgltZXRob2QgInN0YXRpY0FycmF5QXJnKHVpbnQ2NFszXSl1aW50NjQiCgltZXRob2QgIm5vbkxpdGVyYWxTdGF0aWNBcnJheUVsZW1lbnRzKCl1aW50NjQiCgltZXRob2QgIm1peGVkU3RhdGljQXJyYXlFbGVtZW50cygpdWludDY0IgoJbWV0aG9kICJub25MaXRlcmFsU3RhdGljQXJyYXlBY2Nlc3MoKXVpbnQ2NCIKCW1ldGhvZCAic2V0U3RhdGljQXJyYXlFbGVtZW50KCl1aW50NjQiCgltZXRob2QgInN0YXRpY0FycmF5SW5TdG9yYWdlUmVmKCl1aW50NjRbM10iCgltZXRob2QgInVwZGF0ZVN0YXRpY0FycmF5SW5TdG9yYWdlUmVmKCl1aW50NjRbM10iCgltZXRob2QgInN0YXRpY0FycmF5SW5TdG9yYWdlTWFwKCl1aW50NjRbM10iCgltZXRob2QgInVwZGF0ZVN0YXRpY0FycmF5SW5TdG9yYWdlTWFwKCl1aW50NjRbM10iCgltZXRob2QgIm5lc3RlZFN0YXRpY0FycmF5KCl1aW50NjQiCgltZXRob2QgInVwZGF0ZU5lc3RlZFN0YXRpY0FycmF5RWxlbWVudCgpdWludDY0IgoJbWV0aG9kICJ1cGRhdGVOZXN0ZWRTdGF0aWNBcnJheSgpdWludDY0IgoJbWV0aG9kICJ0aHJlZURpbWVuc2lvbmFsVWludDE2QXJyYXkoKXVpbnQxNiIKCW1ldGhvZCAic2ltcGxlVHVwbGUoKXVpbnQxNiIKCW1ldGhvZCAiYXJyYXlJblR1cGxlKCl1aW50NjQiCgltZXRob2QgInR1cGxlSW5BcnJheSgpdWludDE2IgoJbWV0aG9kICJ0dXBsZUluVHVwbGUoKXVpbnQ2NCIKCW1ldGhvZCAic2hvcnRUeXBlTm90YXRpb24oKXVpbnQxNiIKCW1ldGhvZCAiZGlzZ3VzdGluZygpdWludDY0IgoJbWV0aG9kICJyZXR1cm5UdXBsZSgpKHVpbnQ2NCx1aW50MTYsdWludDY0KSIKCW1ldGhvZCAidHVwbGVBcmcoKHVpbnQ2NCx1aW50MTYsdWludDY0KSl1aW50MTYiCgltZXRob2QgImR5bmFtaWNBcnJheSgpdWludDY0IgoJbWV0aG9kICJyZXR1cm5EeW5hbWljQXJyYXkoKXVpbnQ2NFtdIgoJbWV0aG9kICJkeW5hbWljQXJyYXlBcmcodWludDY0W10pdWludDY0IgoJbWV0aG9kICJ1cGRhdGVEeW5hbWljQXJyYXlFbGVtZW50KCl1aW50NjQiCgltZXRob2QgImR5bmFtaWNUdXBsZUFycmF5KCl1aW50NjQiCgltZXRob2QgInJldHVyblR1cGxlV2l0aER5YW1pY0FycmF5KCkodWludDY0LHVpbnQxNix1aW50NjRbXSx1aW50MTZbXSkiCgltZXRob2QgInJldHVybkR5bmFtaWNBcnJheUZyb21UdXBsZSgpdWludDhbXSIKCW1ldGhvZCAidXBkYXRlRHluYW1pY0FycmF5SW5UdXBsZSgpKHVpbnQ4LHVpbnQxNltdLHVpbnQ4W10sdWludDE2W10sdWludDhbXSkiCgltZXRob2QgIm5vbkxpdGVyYWxEeW5hbWljRWxlbWVudEluVHVwbGUoKSh1aW50OCx1aW50MTYsdWludDhbXSx1aW50MTZbXSx1aW50OFtdKSIKCW1ldGhvZCAiYXJyYXlQdXNoKCl1aW50MTZbXSIKCW1ldGhvZCAiYXJyYXlQb3AoKXVpbnQxNltdIgoJbWV0aG9kICJhcnJheVBvcFZhbHVlKCl1aW50MTYiCgltZXRob2QgImFycmF5U3BsaWNlKCl1aW50NjRbXSIKCW1ldGhvZCAiYXJyYXlTcGxpY2VWYWx1ZSgpdWludDE2W10iCgltZXRob2QgImR5bmFtaWNBcnJheUVsZW1lbnRzKCl1aW50MTZbXSIKCW1ldGhvZCAic3BsaWNlTGFzdEVsZW1lbnQoKXVpbnQxNltdIgoJbWV0aG9kICJzcGxpY2VMYXN0RWxlbWVudFZhbHVlKCl1aW50MTZbXSIKCW1ldGhvZCAic3BsaWNlRmlyc3RFbGVtZW50KCl1aW50MTZbXSIKCW1ldGhvZCAic3BsaWNlRmlyc3RFbGVtZW50VmFsdWUoKXVpbnQxNltdIgoJbWV0aG9kICJzdHJpbmdSZXR1cm4oKXN0cmluZyIKCW1ldGhvZCAic3RyaW5nQXJnKHN0cmluZyl2b2lkIgoJbWV0aG9kICJzdHJpbmdJblR1cGxlKCkodWludDE2LHVpbnQ4W10sc3RyaW5nLHVpbnQ4W10pIgoJbWV0aG9kICJhY2Nlc1N0cmluZ0luVHVwbGUoKXN0cmluZyIKCW1ldGhvZCAidXBkYXRlU3RyaW5nSW5UdXBsZSgpKHVpbnQ4LHVpbnQxNltdLHN0cmluZyx1aW50MTZbXSx1aW50OFtdKSIKCW1ldGhvZCAidXBkYXRlVHVwbGVXaXRoT25seUR5bmFtaWNUeXBlcygpKHVpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdKSIKCW1ldGhvZCAic2hvcnRlbkR5bmFtaWNFbGVtZW50SW5UdXBsZSgpKHVpbnQxNltdLHVpbnQxNltdLHVpbnQxNltdKSIKCW1ldGhvZCAibmFtZWRUdXBsZSgpc3RyaW5nIgoJbWV0aG9kICJ1cGRhdGVOYW1lZFR1cGxlKClzdHJpbmciCgltZXRob2QgImN1c3RvbVR5cGVzKClzdHJpbmciCgltZXRob2QgInN0YXRpY1N0cmluZ0FycmF5QXJnKHN0cmluZ1szXSlzdHJpbmciCgltZXRob2QgImR5bmFtaWNBY2Nlc3NPZkR5bmFtaWNFbGVtZW50SW5TdGF0aWNBcnJheShzdHJpbmdbM10pc3RyaW5nIgoJbWV0aG9kICJkeW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGUoKSh1aW50MTYsdWludDhbXSx1aW50MTYpIgoJbWV0aG9kICJhY2Nlc3NEeW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGUoKXVpbnQ4W10iCgltZXRob2QgImFjY2Vzc0R5bmFtaWNBcnJheUVsZW1lbnRJblR1cGxlKCl1aW50MzIiCgltZXRob2QgInVwZGF0ZUR5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZSgpKHVpbnQxNix1aW50OFtdLHVpbnQxNikiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCBhYmlfcm91dGVfc3RhdGljQXJyYXkgYWJpX3JvdXRlX3JldHVyblN0YXRpY0FycmF5IGFiaV9yb3V0ZV9zdGF0aWNBcnJheUFyZyBhYmlfcm91dGVfbm9uTGl0ZXJhbFN0YXRpY0FycmF5RWxlbWVudHMgYWJpX3JvdXRlX21peGVkU3RhdGljQXJyYXlFbGVtZW50cyBhYmlfcm91dGVfbm9uTGl0ZXJhbFN0YXRpY0FycmF5QWNjZXNzIGFiaV9yb3V0ZV9zZXRTdGF0aWNBcnJheUVsZW1lbnQgYWJpX3JvdXRlX3N0YXRpY0FycmF5SW5TdG9yYWdlUmVmIGFiaV9yb3V0ZV91cGRhdGVTdGF0aWNBcnJheUluU3RvcmFnZVJlZiBhYmlfcm91dGVfc3RhdGljQXJyYXlJblN0b3JhZ2VNYXAgYWJpX3JvdXRlX3VwZGF0ZVN0YXRpY0FycmF5SW5TdG9yYWdlTWFwIGFiaV9yb3V0ZV9uZXN0ZWRTdGF0aWNBcnJheSBhYmlfcm91dGVfdXBkYXRlTmVzdGVkU3RhdGljQXJyYXlFbGVtZW50IGFiaV9yb3V0ZV91cGRhdGVOZXN0ZWRTdGF0aWNBcnJheSBhYmlfcm91dGVfdGhyZWVEaW1lbnNpb25hbFVpbnQxNkFycmF5IGFiaV9yb3V0ZV9zaW1wbGVUdXBsZSBhYmlfcm91dGVfYXJyYXlJblR1cGxlIGFiaV9yb3V0ZV90dXBsZUluQXJyYXkgYWJpX3JvdXRlX3R1cGxlSW5UdXBsZSBhYmlfcm91dGVfc2hvcnRUeXBlTm90YXRpb24gYWJpX3JvdXRlX2Rpc2d1c3RpbmcgYWJpX3JvdXRlX3JldHVyblR1cGxlIGFiaV9yb3V0ZV90dXBsZUFyZyBhYmlfcm91dGVfZHluYW1pY0FycmF5IGFiaV9yb3V0ZV9yZXR1cm5EeW5hbWljQXJyYXkgYWJpX3JvdXRlX2R5bmFtaWNBcnJheUFyZyBhYmlfcm91dGVfdXBkYXRlRHluYW1pY0FycmF5RWxlbWVudCBhYmlfcm91dGVfZHluYW1pY1R1cGxlQXJyYXkgYWJpX3JvdXRlX3JldHVyblR1cGxlV2l0aER5YW1pY0FycmF5IGFiaV9yb3V0ZV9yZXR1cm5EeW5hbWljQXJyYXlGcm9tVHVwbGUgYWJpX3JvdXRlX3VwZGF0ZUR5bmFtaWNBcnJheUluVHVwbGUgYWJpX3JvdXRlX25vbkxpdGVyYWxEeW5hbWljRWxlbWVudEluVHVwbGUgYWJpX3JvdXRlX2FycmF5UHVzaCBhYmlfcm91dGVfYXJyYXlQb3AgYWJpX3JvdXRlX2FycmF5UG9wVmFsdWUgYWJpX3JvdXRlX2FycmF5U3BsaWNlIGFiaV9yb3V0ZV9hcnJheVNwbGljZVZhbHVlIGFiaV9yb3V0ZV9keW5hbWljQXJyYXlFbGVtZW50cyBhYmlfcm91dGVfc3BsaWNlTGFzdEVsZW1lbnQgYWJpX3JvdXRlX3NwbGljZUxhc3RFbGVtZW50VmFsdWUgYWJpX3JvdXRlX3NwbGljZUZpcnN0RWxlbWVudCBhYmlfcm91dGVfc3BsaWNlRmlyc3RFbGVtZW50VmFsdWUgYWJpX3JvdXRlX3N0cmluZ1JldHVybiBhYmlfcm91dGVfc3RyaW5nQXJnIGFiaV9yb3V0ZV9zdHJpbmdJblR1cGxlIGFiaV9yb3V0ZV9hY2Nlc1N0cmluZ0luVHVwbGUgYWJpX3JvdXRlX3VwZGF0ZVN0cmluZ0luVHVwbGUgYWJpX3JvdXRlX3VwZGF0ZVR1cGxlV2l0aE9ubHlEeW5hbWljVHlwZXMgYWJpX3JvdXRlX3Nob3J0ZW5EeW5hbWljRWxlbWVudEluVHVwbGUgYWJpX3JvdXRlX25hbWVkVHVwbGUgYWJpX3JvdXRlX3VwZGF0ZU5hbWVkVHVwbGUgYWJpX3JvdXRlX2N1c3RvbVR5cGVzIGFiaV9yb3V0ZV9zdGF0aWNTdHJpbmdBcnJheUFyZyBhYmlfcm91dGVfZHluYW1pY0FjY2Vzc09mRHluYW1pY0VsZW1lbnRJblN0YXRpY0FycmF5IGFiaV9yb3V0ZV9keW5hbWljQXJyYXlJbk1pZGRsZU9mVHVwbGUgYWJpX3JvdXRlX2FjY2Vzc0R5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZSBhYmlfcm91dGVfYWNjZXNzRHluYW1pY0FycmF5RWxlbWVudEluVHVwbGUgYWJpX3JvdXRlX3VwZGF0ZUR5bmFtaWNBcnJheUluTWlkZGxlT2ZUdXBsZQ=="; override clearProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"; override methods: algosdk.ABIMethod[] = [ new algosdk.ABIMethod({ name: "staticArray", desc: "", args: [], returns: { type: "uint64", desc: "" } }), @@ -60,7 +60,11 @@ export class AbiTest extends bkr.ApplicationClient { new algosdk.ABIMethod({ name: "updateNamedTuple", desc: "", args: [], returns: { type: "string", desc: "" } }), new algosdk.ABIMethod({ name: "customTypes", desc: "", args: [], returns: { type: "string", desc: "" } }), new algosdk.ABIMethod({ name: "staticStringArrayArg", desc: "", args: [{ type: "string[3]", name: "a", desc: "" }], returns: { type: "string", desc: "" } }), - new algosdk.ABIMethod({ name: "dynamicAccessOfDynamicElementInStaticArray", desc: "", args: [{ type: "string[3]", name: "a", desc: "" }], returns: { type: "string", desc: "" } }) + new algosdk.ABIMethod({ name: "dynamicAccessOfDynamicElementInStaticArray", desc: "", args: [{ type: "string[3]", name: "a", desc: "" }], returns: { type: "string", desc: "" } }), + new algosdk.ABIMethod({ name: "dynamicArrayInMiddleOfTuple", desc: "", args: [], returns: { type: "(uint16,uint8[],uint16)", desc: "" } }), + new algosdk.ABIMethod({ name: "accessDynamicArrayInMiddleOfTuple", desc: "", args: [], returns: { type: "uint8[]", desc: "" } }), + new algosdk.ABIMethod({ name: "accessDynamicArrayElementInTuple", desc: "", args: [], returns: { type: "uint32", desc: "" } }), + new algosdk.ABIMethod({ name: "updateDynamicArrayInMiddleOfTuple", desc: "", args: [], returns: { type: "(uint16,uint8[],uint16)", desc: "" } }) ]; async staticArray(txnParams?: bkr.TransactionOverrides): Promise> { const result = await this.execute(await this.compose.staticArray(txnParams)); @@ -414,6 +418,46 @@ export class AbiTest extends bkr.ApplicationClient { const result = await this.execute(await this.compose.dynamicAccessOfDynamicElementInStaticArray({ a: args.a }, txnParams)); return new bkr.ABIResult(result, result.returnValue as string); } + async dynamicArrayInMiddleOfTuple(txnParams?: bkr.TransactionOverrides): Promise> { + const result = await this.execute(await this.compose.dynamicArrayInMiddleOfTuple(txnParams)); + return new bkr.ABIResult<[ + bigint, + bigint[], + bigint + ]>(result, result.returnValue as [ + bigint, + bigint[], + bigint + ]); + } + async accessDynamicArrayInMiddleOfTuple(txnParams?: bkr.TransactionOverrides): Promise> { + const result = await this.execute(await this.compose.accessDynamicArrayInMiddleOfTuple(txnParams)); + return new bkr.ABIResult(result, result.returnValue as bigint[]); + } + async accessDynamicArrayElementInTuple(txnParams?: bkr.TransactionOverrides): Promise> { + const result = await this.execute(await this.compose.accessDynamicArrayElementInTuple(txnParams)); + return new bkr.ABIResult(result, result.returnValue as bigint); + } + async updateDynamicArrayInMiddleOfTuple(txnParams?: bkr.TransactionOverrides): Promise> { + const result = await this.execute(await this.compose.updateDynamicArrayInMiddleOfTuple(txnParams)); + return new bkr.ABIResult<[ + bigint, + bigint[], + bigint + ]>(result, result.returnValue as [ + bigint, + bigint[], + bigint + ]); + } compose = { staticArray: async (txnParams?: bkr.TransactionOverrides, atc?: algosdk.AtomicTransactionComposer): Promise => { return this.addMethodCall(algosdk.getMethodByName(this.methods, "staticArray"), {}, txnParams, atc); @@ -592,6 +636,18 @@ export class AbiTest extends bkr.ApplicationClient { a: string[]; }, txnParams?: bkr.TransactionOverrides, atc?: algosdk.AtomicTransactionComposer): Promise => { return this.addMethodCall(algosdk.getMethodByName(this.methods, "dynamicAccessOfDynamicElementInStaticArray"), { a: args.a }, txnParams, atc); + }, + dynamicArrayInMiddleOfTuple: async (txnParams?: bkr.TransactionOverrides, atc?: algosdk.AtomicTransactionComposer): Promise => { + return this.addMethodCall(algosdk.getMethodByName(this.methods, "dynamicArrayInMiddleOfTuple"), {}, txnParams, atc); + }, + accessDynamicArrayInMiddleOfTuple: async (txnParams?: bkr.TransactionOverrides, atc?: algosdk.AtomicTransactionComposer): Promise => { + return this.addMethodCall(algosdk.getMethodByName(this.methods, "accessDynamicArrayInMiddleOfTuple"), {}, txnParams, atc); + }, + accessDynamicArrayElementInTuple: async (txnParams?: bkr.TransactionOverrides, atc?: algosdk.AtomicTransactionComposer): Promise => { + return this.addMethodCall(algosdk.getMethodByName(this.methods, "accessDynamicArrayElementInTuple"), {}, txnParams, atc); + }, + updateDynamicArrayInMiddleOfTuple: async (txnParams?: bkr.TransactionOverrides, atc?: algosdk.AtomicTransactionComposer): Promise => { + return this.addMethodCall(algosdk.getMethodByName(this.methods, "updateDynamicArrayInMiddleOfTuple"), {}, txnParams, atc); } }; } diff --git a/tests/contracts/clients/loopstest_client.ts b/tests/contracts/clients/loopstest_client.ts index ec3be6bb9..e1cbf4ba1 100644 --- a/tests/contracts/clients/loopstest_client.ts +++ b/tests/contracts/clients/loopstest_client.ts @@ -4,7 +4,7 @@ export class LoopsTest extends bkr.ApplicationClient { desc: string = ""; override appSchema: bkr.Schema = { declared: {}, reserved: {} }; override acctSchema: bkr.Schema = { declared: {}, reserved: {} }; - override approvalProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKYWJpX3JvdXRlX3doaWxlTG9vcDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJZHVwbiAwCgljYWxsc3ViIHdoaWxlTG9vcAoJaW50IDEKCXJldHVybgoKd2hpbGVMb29wOgoJcHJvdG8gMSAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2xvb3BzLmFsZ28udHM6NgoJLy8gaSA9IDAKCWludCAwCglmcmFtZV9idXJ5IC0xIC8vIGk6IHVpbnQ2NAoKd2hpbGVfMDoKCWZyYW1lX2RpZyAtMSAvLyBpOiB1aW50NjQKCWludCAxMAoJPAoJYnogd2hpbGVfMF9lbmQKCgkvLyB0ZXN0cy9jb250cmFjdHMvbG9vcHMuYWxnby50czo5CgkvLyBpID0gaSArIDEKCWZyYW1lX2RpZyAtMSAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IC0xIC8vIGk6IHVpbnQ2NAoJYiB3aGlsZV8wCgp3aGlsZV8wX2VuZDoKCS8vIHRlc3RzL2NvbnRyYWN0cy9sb29wcy5hbGdvLnRzOjEyCgkvLyByZXR1cm4gaTsKCWZyYW1lX2RpZyAtMSAvLyBpOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKYWJpX3JvdXRlX2Zvckxvb3A6Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCXR4biBBcHBsaWNhdGlvbklECglpbnQgMAoJIT0KCSYmCglhc3NlcnQKCWJ5dGUgMHgKCWR1cG4gMQoJY2FsbHN1YiBmb3JMb29wCglpbnQgMQoJcmV0dXJuCgpmb3JMb29wOgoJcHJvdG8gMiAwCgoJLy8gdGVzdHMvY29udHJhY3RzL2xvb3BzLmFsZ28udHM6MTYKCS8vIGkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAtMSAvLyBpOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvbG9vcHMuYWxnby50czoxOAoJLy8gaiA9IDAKCWludCAwCglmcmFtZV9idXJ5IC0yIC8vIGo6IHVpbnQ2NAoKZm9yXzA6CglmcmFtZV9kaWcgLTIgLy8gajogdWludDY0CglpbnQgMTAKCTwKCWJ6IGZvcl8wX2VuZAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9sb29wcy5hbGdvLnRzOjE5CgkvLyBpID0gaSArIDEKCWZyYW1lX2RpZyAtMSAvLyBpOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IC0xIC8vIGk6IHVpbnQ2NAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9sb29wcy5hbGdvLnRzOjE4CgkvLyBqID0gaiArIDEKCWZyYW1lX2RpZyAtMiAvLyBqOiB1aW50NjQKCWludCAxCgkrCglmcmFtZV9idXJ5IC0yIC8vIGo6IHVpbnQ2NAoJYiBmb3JfMAoKZm9yXzBfZW5kOgoJLy8gdGVzdHMvY29udHJhY3RzL2xvb3BzLmFsZ28udHM6MjIKCS8vIHJldHVybiBpOwoJZnJhbWVfZGlnIC0xIC8vIGk6IHVpbnQ2NAoJaXRvYgoJYnl0ZSAweDE1MWY3Yzc1Cglzd2FwCgljb25jYXQKCWxvZwoJcmV0c3ViCgptYWluOgoJdHhuIE51bUFwcEFyZ3MKCWJueiByb3V0ZV9hYmkKCgkvLyBkZWZhdWx0IGNyZWF0ZUFwcGxpY2F0aW9uCgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCT09Cgl0eG4gT25Db21wbGV0aW9uCglpbnQgTm9PcAoJPT0KCSYmCglyZXR1cm4KCnJvdXRlX2FiaToKCW1ldGhvZCAid2hpbGVMb29wKCl1aW50NjQiCgltZXRob2QgImZvckxvb3AoKXVpbnQ2NCIKCXR4bmEgQXBwbGljYXRpb25BcmdzIDAKCW1hdGNoIGFiaV9yb3V0ZV93aGlsZUxvb3AgYWJpX3JvdXRlX2Zvckxvb3A="; + override approvalProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKCWIgbWFpbgoKYWJpX3JvdXRlX3doaWxlTG9vcDoKCXR4biBPbkNvbXBsZXRpb24KCWludCBOb09wCgk9PQoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgkhPQoJJiYKCWFzc2VydAoJYnl0ZSAweAoJY2FsbHN1YiB3aGlsZUxvb3AKCWludCAxCglyZXR1cm4KCndoaWxlTG9vcDoKCXByb3RvIDEgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9sb29wcy5hbGdvLnRzOjYKCS8vIGkgPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAtMSAvLyBpOiB1aW50NjQKCndoaWxlXzA6CglmcmFtZV9kaWcgLTEgLy8gaTogdWludDY0CglpbnQgMTAKCTwKCWJ6IHdoaWxlXzBfZW5kCgoJLy8gdGVzdHMvY29udHJhY3RzL2xvb3BzLmFsZ28udHM6OQoJLy8gaSA9IGkgKyAxCglmcmFtZV9kaWcgLTEgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAtMSAvLyBpOiB1aW50NjQKCWIgd2hpbGVfMAoKd2hpbGVfMF9lbmQ6CgkvLyB0ZXN0cy9jb250cmFjdHMvbG9vcHMuYWxnby50czoxMgoJLy8gcmV0dXJuIGk7CglmcmFtZV9kaWcgLTEgLy8gaTogdWludDY0CglpdG9iCglieXRlIDB4MTUxZjdjNzUKCXN3YXAKCWNvbmNhdAoJbG9nCglyZXRzdWIKCmFiaV9yb3V0ZV9mb3JMb29wOgoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09Cgl0eG4gQXBwbGljYXRpb25JRAoJaW50IDAKCSE9CgkmJgoJYXNzZXJ0CglieXRlIDB4CglkdXAKCWNhbGxzdWIgZm9yTG9vcAoJaW50IDEKCXJldHVybgoKZm9yTG9vcDoKCXByb3RvIDIgMAoKCS8vIHRlc3RzL2NvbnRyYWN0cy9sb29wcy5hbGdvLnRzOjE2CgkvLyBpID0gMAoJaW50IDAKCWZyYW1lX2J1cnkgLTEgLy8gaTogdWludDY0CgoJLy8gdGVzdHMvY29udHJhY3RzL2xvb3BzLmFsZ28udHM6MTgKCS8vIGogPSAwCglpbnQgMAoJZnJhbWVfYnVyeSAtMiAvLyBqOiB1aW50NjQKCmZvcl8wOgoJZnJhbWVfZGlnIC0yIC8vIGo6IHVpbnQ2NAoJaW50IDEwCgk8CglieiBmb3JfMF9lbmQKCgkvLyB0ZXN0cy9jb250cmFjdHMvbG9vcHMuYWxnby50czoxOQoJLy8gaSA9IGkgKyAxCglmcmFtZV9kaWcgLTEgLy8gaTogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAtMSAvLyBpOiB1aW50NjQKCgkvLyB0ZXN0cy9jb250cmFjdHMvbG9vcHMuYWxnby50czoxOAoJLy8gaiA9IGogKyAxCglmcmFtZV9kaWcgLTIgLy8gajogdWludDY0CglpbnQgMQoJKwoJZnJhbWVfYnVyeSAtMiAvLyBqOiB1aW50NjQKCWIgZm9yXzAKCmZvcl8wX2VuZDoKCS8vIHRlc3RzL2NvbnRyYWN0cy9sb29wcy5hbGdvLnRzOjIyCgkvLyByZXR1cm4gaTsKCWZyYW1lX2RpZyAtMSAvLyBpOiB1aW50NjQKCWl0b2IKCWJ5dGUgMHgxNTFmN2M3NQoJc3dhcAoJY29uY2F0Cglsb2cKCXJldHN1YgoKbWFpbjoKCXR4biBOdW1BcHBBcmdzCglibnogcm91dGVfYWJpCgoJLy8gZGVmYXVsdCBjcmVhdGVBcHBsaWNhdGlvbgoJdHhuIEFwcGxpY2F0aW9uSUQKCWludCAwCgk9PQoJdHhuIE9uQ29tcGxldGlvbgoJaW50IE5vT3AKCT09CgkmJgoJcmV0dXJuCgpyb3V0ZV9hYmk6CgltZXRob2QgIndoaWxlTG9vcCgpdWludDY0IgoJbWV0aG9kICJmb3JMb29wKCl1aW50NjQiCgl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCgltYXRjaCBhYmlfcm91dGVfd2hpbGVMb29wIGFiaV9yb3V0ZV9mb3JMb29w"; override clearProgram: string = "I3ByYWdtYSB2ZXJzaW9uIDgKaW50IDEKcmV0dXJu"; override methods: algosdk.ABIMethod[] = [ new algosdk.ABIMethod({ name: "whileLoop", desc: "", args: [], returns: { type: "uint64", desc: "" } }),