@akta/sdk 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/auction/index.js +5 -5
  2. package/dist/auction/index.mjs +4 -4
  3. package/dist/{chunk-C3Q3DYPD.mjs → chunk-2AR3LS5J.mjs} +3 -3
  4. package/dist/{chunk-C3Q3DYPD.mjs.map → chunk-2AR3LS5J.mjs.map} +1 -1
  5. package/dist/{chunk-IZTB6YOJ.js → chunk-2WOYNNPV.js} +8 -8
  6. package/dist/{chunk-IZTB6YOJ.js.map → chunk-2WOYNNPV.js.map} +1 -1
  7. package/dist/{chunk-WPATZWNC.mjs → chunk-4ANINCSI.mjs} +3 -3
  8. package/dist/{chunk-BP23PXOA.js → chunk-5M6DY6Q7.js} +7 -7
  9. package/dist/{chunk-BP23PXOA.js.map → chunk-5M6DY6Q7.js.map} +1 -1
  10. package/dist/{chunk-N4PQF2XF.mjs → chunk-6MGMITC7.mjs} +3 -3
  11. package/dist/{chunk-IOSDIJTT.mjs → chunk-6PHYDWAI.mjs} +3 -3
  12. package/dist/{chunk-I2AH4XA6.js → chunk-76JFN4TN.js} +6 -6
  13. package/dist/{chunk-I2AH4XA6.js.map → chunk-76JFN4TN.js.map} +1 -1
  14. package/dist/{chunk-KMVWSUUI.js → chunk-AXS7YUII.js} +21 -10
  15. package/dist/chunk-AXS7YUII.js.map +1 -0
  16. package/dist/{chunk-VARI5DBW.js → chunk-B3ANVNAW.js} +31 -31
  17. package/dist/{chunk-VARI5DBW.js.map → chunk-B3ANVNAW.js.map} +1 -1
  18. package/dist/{chunk-APOVSDCN.mjs → chunk-CPU7YHCB.mjs} +2 -2
  19. package/dist/{chunk-BTVZKNNI.js → chunk-FQEKBA3B.js} +5 -5
  20. package/dist/{chunk-BTVZKNNI.js.map → chunk-FQEKBA3B.js.map} +1 -1
  21. package/dist/{chunk-ZABE6CV7.mjs → chunk-FZXOT7SC.mjs} +3 -3
  22. package/dist/{chunk-TGH7PFXC.mjs → chunk-GRR6MUNV.mjs} +3 -3
  23. package/dist/{chunk-M5QOSPKZ.js → chunk-GVPFBZMF.js} +5 -5
  24. package/dist/{chunk-M5QOSPKZ.js.map → chunk-GVPFBZMF.js.map} +1 -1
  25. package/dist/{chunk-LW57YWGF.js → chunk-HHXP4XDJ.js} +5 -5
  26. package/dist/{chunk-LW57YWGF.js.map → chunk-HHXP4XDJ.js.map} +1 -1
  27. package/dist/{chunk-5CPWIJNS.js → chunk-HIDVSX3C.js} +7 -7
  28. package/dist/{chunk-5CPWIJNS.js.map → chunk-HIDVSX3C.js.map} +1 -1
  29. package/dist/{chunk-7C2J3XNH.js → chunk-HT2LVEDG.js} +5 -5
  30. package/dist/{chunk-7C2J3XNH.js.map → chunk-HT2LVEDG.js.map} +1 -1
  31. package/dist/{chunk-VNBPUJXA.mjs → chunk-IERRX2GS.mjs} +3 -3
  32. package/dist/{chunk-QZWXM2GR.mjs → chunk-IWPVSICN.mjs} +3 -3
  33. package/dist/{chunk-LAANYMUP.mjs → chunk-JMZYQMSW.mjs} +3 -3
  34. package/dist/{chunk-HXF3JLNE.js → chunk-JPV3DVL6.js} +10 -10
  35. package/dist/{chunk-HXF3JLNE.js.map → chunk-JPV3DVL6.js.map} +1 -1
  36. package/dist/{chunk-5F5IFJ2J.mjs → chunk-KPXE4SEJ.mjs} +2 -2
  37. package/dist/{chunk-FVFLY5A6.js → chunk-LYG4MDFV.js} +6 -6
  38. package/dist/{chunk-FVFLY5A6.js.map → chunk-LYG4MDFV.js.map} +1 -1
  39. package/dist/{chunk-XASWHIKG.js → chunk-MDSBD67B.js} +6 -6
  40. package/dist/{chunk-XASWHIKG.js.map → chunk-MDSBD67B.js.map} +1 -1
  41. package/dist/{chunk-WEGE45N2.mjs → chunk-MOHS2K45.mjs} +3 -3
  42. package/dist/{chunk-CC6LCTVW.mjs → chunk-NANBUL67.mjs} +2 -2
  43. package/dist/{chunk-C7GS6GJZ.mjs → chunk-OYSHMZRR.mjs} +4 -4
  44. package/dist/{chunk-ZHFTRBE6.mjs → chunk-SGXO2K4C.mjs} +3 -3
  45. package/dist/{chunk-RZUZCM44.js → chunk-SQH64QTI.js} +4 -4
  46. package/dist/{chunk-RZUZCM44.js.map → chunk-SQH64QTI.js.map} +1 -1
  47. package/dist/{chunk-MATDF7EM.mjs → chunk-TQADXRCE.mjs} +15 -4
  48. package/dist/{chunk-MATDF7EM.mjs.map → chunk-TQADXRCE.mjs.map} +1 -1
  49. package/dist/{chunk-4M6IGGNM.js → chunk-UWAIIBII.js} +3 -3
  50. package/dist/{chunk-4M6IGGNM.js.map → chunk-UWAIIBII.js.map} +1 -1
  51. package/dist/{chunk-MGXVNKUX.js → chunk-V2TNS6B5.js} +8 -8
  52. package/dist/{chunk-MGXVNKUX.js.map → chunk-V2TNS6B5.js.map} +1 -1
  53. package/dist/{chunk-S7HZC5RM.js → chunk-VL2UI54Z.js} +5 -5
  54. package/dist/{chunk-S7HZC5RM.js.map → chunk-VL2UI54Z.js.map} +1 -1
  55. package/dist/{chunk-SXS2YREI.mjs → chunk-VVRQI5IY.mjs} +4 -4
  56. package/dist/{chunk-B54US4TN.mjs → chunk-XNWIPDFE.mjs} +4 -4
  57. package/dist/{chunk-ZW5I4BM7.js → chunk-YHMGRIY5.js} +8 -8
  58. package/dist/{chunk-ZW5I4BM7.js.map → chunk-YHMGRIY5.js.map} +1 -1
  59. package/dist/dao/constants.d.ts +2 -1
  60. package/dist/dao/index.js +5 -5
  61. package/dist/dao/index.mjs +4 -4
  62. package/dist/dao/types.d.ts +5 -1
  63. package/dist/dao-deployable/index.js +7 -7
  64. package/dist/dao-deployable/index.mjs +4 -4
  65. package/dist/escrow/index.js +4 -4
  66. package/dist/escrow/index.mjs +3 -3
  67. package/dist/gates/index.js +4 -4
  68. package/dist/gates/index.mjs +3 -3
  69. package/dist/hyper-swap/index.js +4 -4
  70. package/dist/hyper-swap/index.mjs +3 -3
  71. package/dist/index.js +19 -19
  72. package/dist/index.mjs +18 -18
  73. package/dist/marketplace/index.js +5 -5
  74. package/dist/marketplace/index.mjs +4 -4
  75. package/dist/meta-merkles/index.js +4 -4
  76. package/dist/meta-merkles/index.mjs +3 -3
  77. package/dist/poll/index.js +4 -4
  78. package/dist/poll/index.mjs +3 -3
  79. package/dist/prize-box/index.js +4 -4
  80. package/dist/prize-box/index.mjs +3 -3
  81. package/dist/raffle/index.js +5 -5
  82. package/dist/raffle/index.mjs +4 -4
  83. package/dist/rewards/index.js +4 -4
  84. package/dist/rewards/index.mjs +3 -3
  85. package/dist/social/index.js +3 -3
  86. package/dist/social/index.mjs +2 -2
  87. package/dist/staking/index.js +4 -4
  88. package/dist/staking/index.mjs +3 -3
  89. package/dist/staking-pool/index.js +4 -4
  90. package/dist/staking-pool/index.mjs +3 -3
  91. package/dist/subscriptions/index.js +4 -4
  92. package/dist/subscriptions/index.mjs +3 -3
  93. package/dist/wallet/index.js +4 -4
  94. package/dist/wallet/index.mjs +3 -3
  95. package/package.json +1 -1
  96. package/dist/chunk-KMVWSUUI.js.map +0 -1
  97. /package/dist/{chunk-WPATZWNC.mjs.map → chunk-4ANINCSI.mjs.map} +0 -0
  98. /package/dist/{chunk-N4PQF2XF.mjs.map → chunk-6MGMITC7.mjs.map} +0 -0
  99. /package/dist/{chunk-IOSDIJTT.mjs.map → chunk-6PHYDWAI.mjs.map} +0 -0
  100. /package/dist/{chunk-APOVSDCN.mjs.map → chunk-CPU7YHCB.mjs.map} +0 -0
  101. /package/dist/{chunk-ZABE6CV7.mjs.map → chunk-FZXOT7SC.mjs.map} +0 -0
  102. /package/dist/{chunk-TGH7PFXC.mjs.map → chunk-GRR6MUNV.mjs.map} +0 -0
  103. /package/dist/{chunk-VNBPUJXA.mjs.map → chunk-IERRX2GS.mjs.map} +0 -0
  104. /package/dist/{chunk-QZWXM2GR.mjs.map → chunk-IWPVSICN.mjs.map} +0 -0
  105. /package/dist/{chunk-LAANYMUP.mjs.map → chunk-JMZYQMSW.mjs.map} +0 -0
  106. /package/dist/{chunk-5F5IFJ2J.mjs.map → chunk-KPXE4SEJ.mjs.map} +0 -0
  107. /package/dist/{chunk-WEGE45N2.mjs.map → chunk-MOHS2K45.mjs.map} +0 -0
  108. /package/dist/{chunk-CC6LCTVW.mjs.map → chunk-NANBUL67.mjs.map} +0 -0
  109. /package/dist/{chunk-C7GS6GJZ.mjs.map → chunk-OYSHMZRR.mjs.map} +0 -0
  110. /package/dist/{chunk-ZHFTRBE6.mjs.map → chunk-SGXO2K4C.mjs.map} +0 -0
  111. /package/dist/{chunk-SXS2YREI.mjs.map → chunk-VVRQI5IY.mjs.map} +0 -0
  112. /package/dist/{chunk-B54US4TN.mjs.map → chunk-XNWIPDFE.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-M5QOSPKZ.js","../src/meta-merkles/index.ts","../src/generated/MetaMerklesClient.ts","../src/meta-merkles/types.ts","../src/meta-merkles/tree.ts"],"names":["SchemaPart","MerkleTreeType"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-M5QOSPKZ.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n MetaMerklesClient,\n MetaMerklesFactory,\n TypesValue,\n RootKey,\n} from '../generated/MetaMerklesClient';\nimport { NewContractSDKParams, MaybeSigner } from \"../types\";\nimport {\n AddRootParams,\n UpdateRootParams,\n DeleteRootParams,\n AddDataParams,\n DeleteDataParams,\n AddTypeParams,\n GetRootParams,\n GetDataParams,\n GetTypeParams,\n VerifyParams,\n ReadParams,\n VerifiedReadParams,\n RootCostsParams,\n DataCostsParams,\n MetaMerklesGlobalState,\n SchemaPart,\n} from \"./types\";\nimport { MerkleTree } from \"./tree\";\n\nexport * from \"./types\";\nexport * from \"./tree\";\n\n/** Cost in microAlgo for adding a new tree type */\nconst ADD_TYPE_COST = 100_000_000n;\n\n/**\n * SDK for interacting with the MetaMerkles contract.\n * Use this to manage merkle tree roots, metadata, and verify merkle proofs.\n */\nexport class MetaMerklesSDK extends BaseSDK<MetaMerklesClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: MetaMerklesFactory, ...params }, ENV_VAR_NAMES.META_MERKLES_APP_ID);\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the current global state of the MetaMerkles contract.\n */\n async getState(): Promise<MetaMerklesGlobalState> {\n const state = await this.client.state.global.getAll();\n\n return {\n typesId: state.typesId ?? 0n,\n };\n }\n\n /**\n * Gets a merkle root by address and name.\n * @returns The 32-byte merkle root or undefined if not found\n */\n async getRoot({ address, name }: GetRootParams): Promise<Uint8Array | undefined> {\n const rootKey: RootKey = { address, name };\n try {\n return await this.client.state.box.roots.value(rootKey);\n } catch (error) {\n // Box doesn't exist - return undefined\n if (error instanceof Error && error.message.includes('box not found')) {\n return undefined;\n }\n throw error;\n }\n }\n\n /**\n * Checks if a merkle root exists.\n */\n async hasRoot({ address, name }: GetRootParams): Promise<boolean> {\n const root = await this.getRoot({ address, name });\n return root !== undefined;\n }\n\n /**\n * Gets all merkle roots as a map.\n */\n async getRoots(): Promise<Map<RootKey, Uint8Array>> {\n return await this.client.state.box.roots.getMap();\n }\n\n /**\n * Gets metadata associated with a merkle root.\n * @returns The metadata value or undefined if not found\n */\n async getData({ address, name, key }: GetDataParams): Promise<string | undefined> {\n // Truncate address to first 16 bytes for the data key\n const addressBytes = Uint8Array.from(Buffer.from(address.slice(0, 32), 'base64'));\n const truncatedAddress = addressBytes.slice(0, 16);\n\n try {\n return await this.client.state.box.data.value({\n address: truncatedAddress,\n name,\n key,\n });\n } catch (error) {\n // Box doesn't exist - return undefined\n if (error instanceof Error && error.message.includes('box not found')) {\n return undefined;\n }\n throw error;\n }\n }\n\n /**\n * Gets a tree type by ID.\n * @returns The type value (schema and description) or undefined if not found\n */\n async getType({ id }: GetTypeParams): Promise<TypesValue | undefined> {\n return await this.client.state.box.types.value(id);\n }\n\n /**\n * Gets all tree types as a map.\n */\n async getTypes(): Promise<Map<bigint, TypesValue>> {\n return await this.client.state.box.types.getMap();\n }\n\n /**\n * Gets the cost in microAlgo for creating a merkle root with the given name.\n */\n async rootCosts({ name }: RootCostsParams): Promise<bigint> {\n return await this.client.rootCosts({ args: { name } });\n }\n\n /**\n * Gets the cost in microAlgo for adding data with the given parameters.\n */\n async dataCosts({ name, key, value }: DataCostsParams): Promise<bigint> {\n return await this.client.dataCosts({ args: { name, key, value } });\n }\n\n // ========== Verify Methods ==========\n\n /**\n * Verifies a leaf is included in a merkle tree.\n * @returns true if the proof is valid\n */\n async verify({ address, name, leaf, proof, type }: VerifyParams): Promise<boolean> {\n // Convert proof array to format expected by contract\n const formattedProof = proof.map(p => {\n if (p.length !== 32) {\n throw new Error('Each proof element must be exactly 32 bytes');\n }\n return p;\n });\n\n const { return: result } = await this.client.send.verify({\n args: {\n address,\n name,\n leaf,\n proof: formattedProof,\n type,\n },\n });\n\n return result ?? false;\n }\n\n /**\n * Reads metadata from a merkle root.\n */\n async read({ address, name, key }: ReadParams): Promise<string> {\n return await this.client.read({\n args: { address, name, key },\n });\n }\n\n /**\n * Verifies inclusion and reads metadata if verified.\n * @returns The metadata value, or empty string if verification fails\n */\n async verifiedRead({ address, name, leaf, proof, type, key }: VerifiedReadParams): Promise<string> {\n const formattedProof = proof.map(p => {\n if (p.length !== 32) {\n throw new Error('Each proof element must be exactly 32 bytes');\n }\n return p;\n });\n\n const { return: result } = await this.client.send.verifiedRead({\n args: {\n address,\n name,\n leaf,\n proof: formattedProof,\n type,\n key,\n },\n });\n\n return result ?? '';\n }\n\n /**\n * Verifies inclusion and reads metadata. Throws if verification fails.\n * @returns The metadata value\n */\n async verifiedMustRead({ address, name, leaf, proof, type, key }: VerifiedReadParams): Promise<string> {\n const formattedProof = proof.map(p => {\n if (p.length !== 32) {\n throw new Error('Each proof element must be exactly 32 bytes');\n }\n return p;\n });\n\n const { return: result } = await this.client.send.verifiedMustRead({\n args: {\n address,\n name,\n leaf,\n proof: formattedProof,\n type,\n key,\n },\n });\n\n if (result === undefined) {\n throw new Error('Failed to read verified data');\n }\n\n return result;\n }\n\n // ========== Write Methods ==========\n\n /**\n * Adds a new merkle root.\n * @param name - The name alias of the root (max 31 bytes)\n * @param root - The 32-byte merkle tree root\n * @param type - The index of the tree type from box storage\n */\n async addRoot({ sender, signer, name, root, type }: AddRootParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n if (root.length !== 32) {\n throw new Error('Root must be exactly 32 bytes');\n }\n\n const cost = await this.rootCosts({ name });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.addRoot({\n ...sendParams,\n args: {\n payment,\n name,\n root,\n type,\n },\n });\n }\n\n /**\n * Updates an existing merkle root.\n * @param name - The name of the merkle group data\n * @param newRoot - The new 32-byte merkle tree root\n */\n async updateRoot({ sender, signer, name, newRoot }: UpdateRootParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n if (newRoot.length !== 32) {\n throw new Error('New root must be exactly 32 bytes');\n }\n\n await this.client.send.updateRoot({\n ...sendParams,\n args: {\n name,\n newRoot,\n },\n });\n }\n\n /**\n * Deletes a merkle root and returns the MBR to the sender.\n * Only the original creator can delete the root.\n */\n async deleteRoot({ sender, signer, name }: DeleteRootParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.deleteRoot({\n ...sendParams,\n // Extra fee for inner payment to return MBR\n extraFee: microAlgo(1000),\n args: { name },\n });\n }\n\n /**\n * Adds metadata to an existing merkle root.\n * @param name - The name of the merkle tree root\n * @param key - The metadata key (max 15 bytes, cannot start with \"l.\")\n * @param value - The metadata value (max 1024 bytes)\n */\n async addData({ sender, signer, name, key, value }: AddDataParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const cost = await this.dataCosts({ name, key, value });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.addData({\n ...sendParams,\n args: {\n payment,\n name,\n key,\n value,\n },\n });\n }\n\n /**\n * Deletes metadata from a merkle root and returns the MBR to the sender.\n * Only the original creator can delete data.\n */\n async deleteData({ sender, signer, name, key }: DeleteDataParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.deleteData({\n ...sendParams,\n // Extra fee for inner payment to return MBR\n extraFee: microAlgo(1000),\n args: { name, key },\n });\n }\n\n /**\n * Adds a new tree type definition.\n * Requires a 100 ALGO payment.\n * @param description - Description of the tree type (max 800 bytes)\n * @param schemaList - The schema parts defining the leaf structure\n */\n async addType({ sender, signer, description, schemaList }: AddTypeParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(ADD_TYPE_COST),\n receiver: this.client.appAddress,\n });\n\n // Convert SchemaPart enum values to numbers for the contract\n const schemaListNumbers = schemaList.map(part => part as number);\n\n await this.client.send.addType({\n ...sendParams,\n args: {\n payment,\n description,\n schemaList: schemaListNumbers,\n },\n });\n }\n\n // ========== High-Level Merkle Tree Methods ==========\n\n /**\n * Adds a merkle root from a MerkleTree instance.\n * This is a convenience method that extracts the root from the tree.\n * \n * @example\n * ```ts\n * const tree = MerkleTree.ofSimple([1n, 2n, 3n], SchemaPart.Uint64);\n * await sdk.addRootFromTree({ name: 'my-tree', tree, type: 1n });\n * ```\n */\n async addRootFromTree<T extends unknown[]>({\n sender,\n signer,\n name,\n tree,\n type,\n }: MaybeSigner & {\n name: string;\n tree: MerkleTree<T>;\n type: bigint | number;\n }): Promise<void> {\n return this.addRoot({\n sender,\n signer,\n name,\n root: tree.root,\n type,\n });\n }\n\n /**\n * Verifies a leaf from a MerkleTree instance.\n * This is a convenience method that extracts the leaf hash and proof from the tree.\n * \n * @example\n * ```ts\n * const tree = MerkleTree.ofSimple([1n, 2n, 3n], SchemaPart.Uint64);\n * const isValid = await sdk.verifyFromTree({\n * address: creatorAddress,\n * name: 'my-tree',\n * tree,\n * index: 0, // verify the first leaf\n * type: 1n,\n * });\n * ```\n */\n async verifyFromTree<T extends unknown[]>({\n address,\n name,\n tree,\n index,\n type,\n }: {\n address: string;\n name: string;\n tree: MerkleTree<T>;\n index: number;\n type: bigint | number;\n }): Promise<boolean> {\n return this.verify({\n address,\n name,\n leaf: tree.getLeafHash(index),\n proof: tree.getProof(index),\n type,\n });\n }\n\n /**\n * Verifies and reads metadata using a MerkleTree instance.\n * \n * @example\n * ```ts\n * const tree = MerkleTree.ofSimple([1n, 2n, 3n], SchemaPart.Uint64);\n * const royalty = await sdk.verifiedReadFromTree({\n * address: creatorAddress,\n * name: 'my-tree',\n * tree,\n * index: 0,\n * type: 1n,\n * key: 'royalty',\n * });\n * ```\n */\n async verifiedReadFromTree<T extends unknown[]>({\n address,\n name,\n tree,\n index,\n type,\n key,\n }: {\n address: string;\n name: string;\n tree: MerkleTree<T>;\n index: number;\n type: bigint | number;\n key: string;\n }): Promise<string> {\n return this.verifiedRead({\n address,\n name,\n leaf: tree.getLeafHash(index),\n proof: tree.getProof(index),\n type,\n key,\n });\n }\n\n /**\n * Verifies inclusion and reads metadata using a MerkleTree instance.\n * Throws if verification fails.\n */\n async verifiedMustReadFromTree<T extends unknown[]>({\n address,\n name,\n tree,\n index,\n type,\n key,\n }: {\n address: string;\n name: string;\n tree: MerkleTree<T>;\n index: number;\n type: bigint | number;\n key: string;\n }): Promise<string> {\n return this.verifiedMustRead({\n address,\n name,\n leaf: tree.getLeafHash(index),\n proof: tree.getProof(index),\n type,\n key,\n });\n }\n}\n\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^7\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client'\nimport { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app'\nimport { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport {\n AppClient as _AppClient,\n AppClientMethodCallParams,\n AppClientParams,\n AppClientBareCallParams,\n CallOnComplete,\n AppClientCompilationParams,\n ResolveAppClientByCreatorAndName,\n ResolveAppClientByNetwork,\n CloneAppClientParams,\n} from '@algorandfoundation/algokit-utils/types/app-client'\nimport { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory'\nimport { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer'\nimport { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction'\nimport { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"MetaMerkles\",\"structs\":{\"DataKey\":[{\"name\":\"address\",\"type\":\"byte[16]\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"RootKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"name\",\"type\":\"string\"}],\"TypesValue\":[{\"name\":\"schema\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}]},\"methods\":[{\"name\":\"create\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"addRoot\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name alias of the root being added\"},{\"type\":\"byte[32]\",\"name\":\"root\",\"desc\":\"a merkle tree root\"},{\"type\":\"uint64\",\"name\":\"type\",\"desc\":\"an index of the tree type enum from box storage\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Creates two boxes and adds a merkle root\\nusing a `RootKey` to the root box map and also a list type to the\\nmetadata attached to the root in the data box map\",\"events\":[],\"recommendations\":{}},{\"name\":\"deleteRoot\",\"args\":[{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the merkle tree root\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Deletes the merkle root from the root box map\",\"events\":[],\"recommendations\":{}},{\"name\":\"updateRoot\",\"args\":[{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the merkle group data\"},{\"type\":\"byte[32]\",\"name\":\"newRoot\",\"desc\":\"the new 32 byte merkle tree root\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Replaces the merkle root with another\",\"events\":[],\"recommendations\":{}},{\"name\":\"addData\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the merkle tree root\"},{\"type\":\"string\",\"name\":\"key\",\"desc\":\"the metadata key eg. `Royalty`\"},{\"type\":\"string\",\"name\":\"value\",\"desc\":\"the metadata value eg. `5` encoded as a bytestring for 5%\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Registers a key & value in the data box map that\\ncorresponds to a merkle root in the root box map\",\"events\":[],\"recommendations\":{}},{\"name\":\"deleteData\",\"args\":[{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the merkle tree root\"},{\"type\":\"string\",\"name\":\"key\",\"desc\":\"the metadata key you want to remove\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Deletes a metadata key & value pair from the data box map\",\"events\":[],\"recommendations\":{}},{\"name\":\"verify\",\"args\":[{\"type\":\"address\",\"name\":\"address\",\"desc\":\"the address of the merkle tree root creator\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"The name alias of the root\"},{\"type\":\"byte[32]\",\"name\":\"leaf\",\"desc\":\"The hashed leaf to verify\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"The merkle proof\"},{\"type\":\"uint64\",\"name\":\"type\",\"desc\":\"The type check for the lists purpose\"}],\"returns\":{\"type\":\"bool\",\"desc\":\"a boolean indicating whether the proof is valid\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"verify an inclusion in a double sha256 based merkle tree\",\"events\":[],\"recommendations\":{}},{\"name\":\"read\",\"args\":[{\"type\":\"address\",\"name\":\"address\",\"desc\":\"the address of the merkle tree root creator\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the merkle tree root\"},{\"type\":\"string\",\"name\":\"key\",\"desc\":\"the metadata key eg. `Royalty`\"}],\"returns\":{\"type\":\"string\",\"desc\":\"the value set eg. `5` encoded as a bytestring for 5%\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"desc\":\"Fetch a metadata properties\",\"events\":[],\"recommendations\":{}},{\"name\":\"verifiedRead\",\"args\":[{\"type\":\"address\",\"name\":\"address\",\"desc\":\"the address of the merkle tree root creator\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the root\"},{\"type\":\"byte[32]\",\"name\":\"leaf\",\"desc\":\"the leaf node to be verified\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the proof the hash is included\"},{\"type\":\"uint64\",\"name\":\"type\",\"desc\":\"the list type that helps contracts ensure\\nthe lists purpose isn't being misused ( 0 if the caller doesnt care )\"},{\"type\":\"string\",\"name\":\"key\",\"desc\":\"the metadata key eg. `Royalty`\"}],\"returns\":{\"type\":\"string\",\"desc\":\"a string of metadata\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Read metadata from box storage and verify the data provided is included\\nin the merkle tree given a sha256'd 32 byte merkle tree root & a proof\\nthats pre-computed off chain.\\n\\nverify an inclusion in a merkle tree\\n& read an associated key value pair\\n& check against the underlying data's schema\\n& check against the underlying data's list type or purpose\",\"events\":[],\"recommendations\":{}},{\"name\":\"verifiedMustRead\",\"args\":[{\"type\":\"address\",\"name\":\"address\",\"desc\":\"the address of the merkle tree root creator\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the root\"},{\"type\":\"byte[32]\",\"name\":\"leaf\",\"desc\":\"the leaf node to be verified\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the proof the hash is included\"},{\"type\":\"uint64\",\"name\":\"type\",\"desc\":\"the list type that helps contracts ensure\\nthe lists purpose isn't being misused ( 0 if the caller doesnt care )\"},{\"type\":\"string\",\"name\":\"key\",\"desc\":\"the metadata key eg. `Royalty`\"}],\"returns\":{\"type\":\"string\",\"desc\":\"a string of metadata\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Read metadata from box storage and verify the data provided is included\\nin the merkle tree given a sha256'd 32 byte merkle tree root & a proof\\nthats pre-computed off chain.\\n\\nverify an inclusion in a merkle tree\\n& read an associated key value pair\\n& check against the underlying data's schema\\n& check against the underlying data's list type or purpose\",\"events\":[],\"recommendations\":{}},{\"name\":\"addType\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"string\",\"name\":\"description\"},{\"type\":\"uint8[]\",\"name\":\"schemaList\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"rootCosts\",\"args\":[{\"type\":\"string\",\"name\":\"name\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"dataCosts\",\"args\":[{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"key\"},{\"type\":\"string\",\"name\":\"value\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":1,\"bytes\":0},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"typesID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"dHlwZXNfaWQ=\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{\"types\":{\"keyType\":\"uint64\",\"valueType\":\"TypesValue\",\"desc\":\"the types (intents) of merkle trees that exist\",\"prefix\":\"dA==\"},\"roots\":{\"keyType\":\"RootKey\",\"valueType\":\"AVMBytes\",\"desc\":\"the merkle roots we want to attach data to\",\"prefix\":\"cg==\"},\"data\":{\"keyType\":\"DataKey\",\"valueType\":\"AVMString\",\"desc\":\"rootData is the box map for managing the data associated with a group\",\"prefix\":\"ZA==\"}}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[2142,2275,2347],\"errorMessage\":\"Box must have value\"},{\"pc\":[261],\"errorMessage\":\"Cannot add root with name longer than 31 bytes\"},{\"pc\":[364,728],\"errorMessage\":\"Invalid payment\"},{\"pc\":[1333],\"errorMessage\":\"Invalid payment amount\"},{\"pc\":[1323],\"errorMessage\":\"Invalid payment receiver\"},{\"pc\":[208],\"errorMessage\":\"Length must be 16\"},{\"pc\":[52],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[453,531],\"errorMessage\":\"a root with this name does not exist\"},{\"pc\":[1829],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[881],\"errorMessage\":\"data does not exist\"},{\"pc\":[1250],\"errorMessage\":\"failed to verify inclusion\"},{\"pc\":[1358,2239],\"errorMessage\":\"index access is out of bounds\"},{\"pc\":[965,1100,1209],\"errorMessage\":\"invalid number of bytes for (len+uint8[32][])\"},{\"pc\":[1315],\"errorMessage\":\"invalid number of bytes for (len+uint8[])\"},{\"pc\":[232,388,493,558,575,594,800,816,939,1013,1029,1071,1123,1183,1232,1291,1903,1929,1942,1955],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[252,974,1109,1218],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[243,504,926,950,1000,1058,1085,1170,1194],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[303,422,739,830,2084,2299],\"errorMessage\":\"invalid size\"},{\"pc\":[683],\"errorMessage\":\"l. is reserved for internals\"},{\"pc\":[640,1340],\"errorMessage\":\"max data length is 1024 bytes\"},{\"pc\":[633],\"errorMessage\":\"max key length is 32 bytes\"},{\"pc\":[692],\"errorMessage\":\"there must be a root to associate the data to\"},{\"pc\":[335],\"errorMessage\":\"this name is already in use\"},{\"pc\":[219,545,1278],\"errorMessage\":\"transaction type is pay\"},{\"pc\":[273],\"errorMessage\":\"tree type does not exist\"},{\"pc\":[345],\"errorMessage\":\"tree type key already exists for this root\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDIgMzIgNDAwCiAgICBieXRlY2Jsb2NrICIiIDB4MDAxNCAiZCIgMHgxNTFmN2M3NSAweDAwMjIgInIiICJ0eXBlc19pZCIgMHgwMDA2NmMyZTc0Nzk3MDY1IDB4MDY4MTAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6ODcKICAgIC8vIGV4cG9ydCBjbGFzcyBNZXRhTWVya2xlcyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAxNgogICAgcHVzaGJ5dGVzcyAweGEyNGMwNjdjIDB4ZGYyODdhN2QgMHhjNmQzZDcwNCAweDQyZmM3MjAyIDB4MDZkMzg5MDQgMHgyYmYzY2M1YSAweDUwYzM2ZTQxIDB4MGNmMWI5Y2YgMHgxZmY3Yzc0YyAweDM5YzE3ZGVkIDB4NzJiMjU5ODEgMHg3NjgzY2QyNSAvLyBtZXRob2QgImFkZFJvb3QocGF5LHN0cmluZyxieXRlWzMyXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZGVsZXRlUm9vdChzdHJpbmcpdm9pZCIsIG1ldGhvZCAidXBkYXRlUm9vdChzdHJpbmcsYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAiYWRkRGF0YShwYXksc3RyaW5nLHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZGVsZXRlRGF0YShzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInZlcmlmeShhZGRyZXNzLHN0cmluZyxieXRlWzMyXSxieXRlWzMyXVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJyZWFkKGFkZHJlc3Msc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmaWVkUmVhZChhZGRyZXNzLHN0cmluZyxieXRlWzMyXSxieXRlWzMyXVtdLHVpbnQ2NCxzdHJpbmcpc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZmllZE11c3RSZWFkKGFkZHJlc3Msc3RyaW5nLGJ5dGVbMzJdLGJ5dGVbMzJdW10sdWludDY0LHN0cmluZylzdHJpbmciLCBtZXRob2QgImFkZFR5cGUocGF5LHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgInJvb3RDb3N0cyhzdHJpbmcpdWludDY0IiwgbWV0aG9kICJkYXRhQ29zdHMoc3RyaW5nLHN0cmluZyxzdHJpbmcpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYWRkUm9vdCBkZWxldGVSb290IHVwZGF0ZVJvb3QgYWRkRGF0YSBkZWxldGVEYXRhIHZlcmlmeSByZWFkIHZlcmlmaWVkUmVhZCB2ZXJpZmllZE11c3RSZWFkIGFkZFR5cGUgcm9vdENvc3RzIGRhdGFDb3N0cwogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyBleHBvcnQgY2xhc3MgTWV0YU1lcmtsZXMgZXh0ZW5kcyBDb250cmFjdCB7CiAgICBwdXNoYnl0ZXMgMHg0YzVjNjFiYSAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlX3JvdXRlQDE3CiAgICBlcnIKCm1haW5fY3JlYXRlX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjk1CiAgICAvLyB0eXBlc0lEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTWV0YU1lcmtsZXNHbG9iYWxTdGF0ZUtleVR5cGVzSUQgfSkKICAgIGJ5dGVjIDYgLy8gInR5cGVzX2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE0MAogICAgLy8gdGhpcy50eXBlc0lELnZhbHVlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTM4CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9iYXNlLnRzOjpieXRlczE2KHY6IGJ5dGVzKSAtPiBieXRlczoKYnl0ZXMxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9iYXNlLnRzOjcKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBieXRlczE2KHY6IGJ5dGVzKSB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9iYXNlLnRzOjgKICAgIC8vIHJldHVybiB2LnNsaWNlKDAsIDE2KS50b0ZpeGVkKHsgbGVuZ3RoOiAxNiB9KQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMQogICAgPj0KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGRpZyAyCiAgICA+PQogICAgcHVzaGludCAxNiAvLyAxNgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSAxNgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy5hZGRSb290W3JvdXRpbmddKCkgLT4gdm9pZDoKYWRkUm9vdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNTUtMTYwCiAgICAvLyBhZGRSb290KAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIG5hbWU6IHN0cmluZywKICAgIC8vICAgcm9vdDogYnl0ZXM8MzI+LAogICAgLy8gICB0eXBlOiB1aW50NjQKICAgIC8vICk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNjEKICAgIC8vIGFzc2VydChCeXRlcyhuYW1lKS5sZW5ndGggPD0gMzEsICdDYW5ub3QgYWRkIHJvb3Qgd2l0aCBuYW1lIGxvbmdlciB0aGFuIDMxIGJ5dGVzJykKICAgIGRpZyAyCiAgICBsZW4KICAgIGR1cAogICAgcHVzaGludCAzMSAvLyAzMQogICAgPD0KICAgIGFzc2VydCAvLyBDYW5ub3QgYWRkIHJvb3Qgd2l0aCBuYW1lIGxvbmdlciB0aGFuIDMxIGJ5dGVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBhc3NlcnQodGhpcy50eXBlcyh0eXBlKS5leGlzdHMsIEVSUl9OT19UUkVFX1RZUEUpCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTAwCiAgICAvLyB0eXBlcyA9IEJveE1hcDx1aW50NjQsIFR5cGVzVmFsdWU+KHsga2V5UHJlZml4OiBNZXRhTWVya2xlc0JveFByZWZpeFR5cGVzIH0pCiAgICBwdXNoYnl0ZXMgInQiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBhc3NlcnQodGhpcy50eXBlcyh0eXBlKS5leGlzdHMsIEVSUl9OT19UUkVFX1RZUEUpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB0cmVlIHR5cGUgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIGNvbnN0IHRydW5jYXRlZEFkZHJlc3MgPSBieXRlczE2KFR4bi5zZW5kZXIuYnl0ZXMpCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGJ5dGVzMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGNvbnN0IHJvb3RLZXk6IFJvb3RLZXkgPSB7IGFkZHJlc3M6IFR4bi5zZW5kZXIsIG5hbWUgfQogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDUKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgNCAvLyAweDAwMjIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE2NwogICAgLy8gY29uc3QgdHlwZUtleTogRGF0YUtleSA9IHsgYWRkcmVzczogdHJ1bmNhdGVkQWRkcmVzcywgbmFtZSwga2V5OiB0cmVlVHlwZUtleSB9CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18xIC8vIDB4MDAxNAogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWMgNyAvLyAweDAwMDY2YzJlNzQ3OTcwNjUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gcm9vdHMgPSBCb3hNYXA8Um9vdEtleSwgYnl0ZXM8MzI+Pih7IGtleVByZWZpeDogTWV0YU1lcmtsZXNCb3hQcmVmaXhSb290cyB9KQogICAgYnl0ZWMgNSAvLyAiciIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTY5CiAgICAvLyBhc3NlcnQoIXRoaXMucm9vdHMocm9vdEtleSkuZXhpc3RzLCBFUlJfTkFNRV9UQUtFTikKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gdGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdXNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyBkYXRhID0gQm94TWFwPERhdGFLZXksIHN0cmluZz4oeyBrZXlQcmVmaXg6IE1ldGFNZXJrbGVzQm94UHJlZml4RGF0YSB9KQogICAgYnl0ZWNfMiAvLyAiZCIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBhc3NlcnQoIXRoaXMuZGF0YSh0eXBlS2V5KS5leGlzdHMsIEVSUl9UUkVFX1RZUEVfS0VZX0FMUkVBRFlfRVhJU1RTKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyB0cmVlIHR5cGUga2V5IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHJvb3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNzItMTc5CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHRoaXMucm9vdENvc3RzKG5hbWUpLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBkaWcgNQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNzUKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTcyLTE3OQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnJvb3RDb3N0cyhuYW1lKSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIHVuY292ZXIgNgogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTc2CiAgICAvLyBhbW91bnQ6IHRoaXMucm9vdENvc3RzKG5hbWUpLAogICAgdW5jb3ZlciA2CiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucm9vdENvc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTcyLTE3OQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnJvb3RDb3N0cyhuYW1lKSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTgxCiAgICAvLyB0aGlzLnJvb3RzKHJvb3RLZXkpLnZhbHVlID0gcm9vdAogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyB0aGlzLmRhdGEodHlwZUtleSkudmFsdWUgPSBTdHJpbmcoaXRvYih0eXBlKSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTU1LTE2MAogICAgLy8gYWRkUm9vdCgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBuYW1lOiBzdHJpbmcsCiAgICAvLyAgIHJvb3Q6IGJ5dGVzPDMyPiwKICAgIC8vICAgdHlwZTogdWludDY0CiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLmRlbGV0ZVJvb3Rbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGVSb290OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gZGVsZXRlUm9vdChuYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE5MQogICAgLy8gY29uc3QgdHJ1bmNhdGVkQWRkcmVzcyA9IGJ5dGVzMTYoVHhuLnNlbmRlci5ieXRlcykKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgYnl0ZXMxNgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE5MwogICAgLy8gY29uc3Qgcm9vdEtleTogUm9vdEtleSA9IHsgYWRkcmVzczogVHhuLnNlbmRlciwgbmFtZSB9CiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgNCAvLyAweDAwMjIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gY29uc3QgdHlwZUtleTogRGF0YUtleSA9IHsgYWRkcmVzczogdHJ1bmNhdGVkQWRkcmVzcywgbmFtZSwga2V5OiB0cmVlVHlwZUtleSB9CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18xIC8vIDB4MDAxNAogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWMgNyAvLyAweDAwMDY2YzJlNzQ3OTcwNjUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gcm9vdHMgPSBCb3hNYXA8Um9vdEtleSwgYnl0ZXM8MzI+Pih7IGtleVByZWZpeDogTWV0YU1lcmtsZXNCb3hQcmVmaXhSb290cyB9KQogICAgYnl0ZWMgNSAvLyAiciIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBhc3NlcnQodGhpcy5yb290cyhyb290S2V5KS5leGlzdHMsIEVSUl9OT19OQU1FKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBhIHJvb3Qgd2l0aCB0aGlzIG5hbWUgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxOTgKICAgIC8vIHRoaXMucm9vdHMocm9vdEtleSkuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwNAogICAgLy8gZGF0YSA9IEJveE1hcDxEYXRhS2V5LCBzdHJpbmc+KHsga2V5UHJlZml4OiBNZXRhTWVya2xlc0JveFByZWZpeERhdGEgfSkKICAgIGJ5dGVjXzIgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxOTkKICAgIC8vIHRoaXMuZGF0YSh0eXBlS2V5KS5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjAyLTIwNwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnJvb3RDb3N0cyhuYW1lKSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjA0CiAgICAvLyByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMDUKICAgIC8vIGFtb3VudDogdGhpcy5yb290Q29zdHMobmFtZSksCiAgICBzd2FwCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucm9vdENvc3RzCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIwMi0yMDYKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogdGhpcy5yb290Q29zdHMobmFtZSksCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjAyLTIwNwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnJvb3RDb3N0cyhuYW1lKSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gZGVsZXRlUm9vdChuYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnVwZGF0ZVJvb3Rbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVSb290OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gdXBkYXRlUm9vdChuYW1lOiBzdHJpbmcsIG5ld1Jvb3Q6IGJ5dGVzPDMyPik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMTcKICAgIC8vIGNvbnN0IGtleTogUm9vdEtleSA9IHsgYWRkcmVzczogVHhuLnNlbmRlciwgbmFtZSB9CiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDQgLy8gMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gcm9vdHMgPSBCb3hNYXA8Um9vdEtleSwgYnl0ZXM8MzI+Pih7IGtleVByZWZpeDogTWV0YU1lcmtsZXNCb3hQcmVmaXhSb290cyB9KQogICAgYnl0ZWMgNSAvLyAiciIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIxOAogICAgLy8gYXNzZXJ0KHRoaXMucm9vdHMoa2V5KS5leGlzdHMsIEVSUl9OT19OQU1FKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBhIHJvb3Qgd2l0aCB0aGlzIG5hbWUgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMTkKICAgIC8vIHRoaXMucm9vdHMoa2V5KS52YWx1ZSA9IG5ld1Jvb3QKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMTYKICAgIC8vIHVwZGF0ZVJvb3QobmFtZTogc3RyaW5nLCBuZXdSb290OiBieXRlczwzMj4pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLmFkZERhdGFbcm91dGluZ10oKSAtPiB2b2lkOgphZGREYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gYWRkRGF0YShwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIG5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gY29uc3Qgcm9vdEtleTogUm9vdEtleSA9IHsgYWRkcmVzczogVHhuLnNlbmRlciwgbmFtZSB9CiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNAogICAgc3dhcAogICAgYnl0ZWMgNCAvLyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBhc3NlcnQoa2V5Qnl0ZXMubGVuZ3RoIDw9IG1heERhdGFLZXlMZW5ndGgsIEVSUl9LRVlfVE9PX0xPTkcpCiAgICBzd2FwCiAgICBsZW4KICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBwdXNoaW50IDE1IC8vIDE1CiAgICA8PQogICAgYXNzZXJ0IC8vIG1heCBrZXkgbGVuZ3RoIGlzIDMyIGJ5dGVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjM2CiAgICAvLyBhc3NlcnQoQnl0ZXModmFsdWUpLmxlbmd0aCA8PSBtYXhEYXRhTGVuZ3RoLCBFUlJfREFUQV9UT09fTE9ORykKICAgIHN3YXAKICAgIGxlbgogICAgcHVzaGludCAxMDI0IC8vIDEwMjQKICAgIDw9CiAgICBhc3NlcnQgLy8gbWF4IGRhdGEgbGVuZ3RoIGlzIDEwMjQgYnl0ZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMzgKICAgIC8vIGtleUJ5dGVzLmxlbmd0aCA8IDIgfHwgIShrZXlCeXRlcy5zbGljZSgwLCAyKSA9PT0gQnl0ZXMocmVzZXJ2ZWREYXRhS2V5UHJlZml4KSksCiAgICBpbnRjXzIgLy8gMgogICAgPAogICAgYm56IGFkZERhdGFfYm9vbF90cnVlQDMKICAgIGludGNfMCAvLyAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgaW50Y18wIC8vIDAKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18yIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA2CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBwdXNoYnl0ZXMgImwuIgogICAgPT0KICAgIGJueiBhZGREYXRhX2Jvb2xfZmFsc2VANAoKYWRkRGF0YV9ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgphZGREYXRhX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMzctMjQwCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIGtleUJ5dGVzLmxlbmd0aCA8IDIgfHwgIShrZXlCeXRlcy5zbGljZSgwLCAyKSA9PT0gQnl0ZXMocmVzZXJ2ZWREYXRhS2V5UHJlZml4KSksCiAgICAvLyAgIEVSUl9SRVNFUlZFRF9LRVlfUFJFRklYCiAgICAvLyApCiAgICBhc3NlcnQgLy8gbC4gaXMgcmVzZXJ2ZWQgZm9yIGludGVybmFscwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gcm9vdHMgPSBCb3hNYXA8Um9vdEtleSwgYnl0ZXM8MzI+Pih7IGtleVByZWZpeDogTWV0YU1lcmtsZXNCb3hQcmVmaXhSb290cyB9KQogICAgYnl0ZWMgNSAvLyAiciIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNDEKICAgIC8vIGFzc2VydCh0aGlzLnJvb3RzKHJvb3RLZXkpLmV4aXN0cywgRVJSX05PX1JPT1RfRk9SX0RBVEEpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB0aGVyZSBtdXN0IGJlIGEgcm9vdCB0byBhc3NvY2lhdGUgdGhlIGRhdGEgdG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNDMKICAgIC8vIGNvbnN0IGNvc3RzID0gdGhpcy5tYnIoJycsICcnLCBuYW1lLCBrZXksIHZhbHVlKQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICBkaWcgNwogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgZGlnIDgKICAgIGR1cAogICAgY292ZXIgNgogICAgY2FsbHN1YiBtYnIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNDUtMjUyCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGNvc3RzLmRhdGEsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyA5CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjQ4CiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI0NS0yNTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogY29zdHMuZGF0YSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI0OQogICAgLy8gYW1vdW50OiBjb3N0cy5kYXRhLAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI0NS0yNTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogY29zdHMuZGF0YSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjU0CiAgICAvLyBjb25zdCB0cnVuY2F0ZWRBZGRyZXNzID0gYnl0ZXMxNihUeG4uc2VuZGVyLmJ5dGVzKQogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBieXRlczE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjU1CiAgICAvLyBjb25zdCBkYXRhS2V5OiBEYXRhS2V5ID0geyBhZGRyZXNzOiB0cnVuY2F0ZWRBZGRyZXNzLCBuYW1lLCBrZXkgfQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICBieXRlY18xIC8vIDB4MDAxNAogICAgY29uY2F0CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgICsKICAgIGRpZyA1CiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwNAogICAgLy8gZGF0YSA9IEJveE1hcDxEYXRhS2V5LCBzdHJpbmc+KHsga2V5UHJlZml4OiBNZXRhTWVya2xlc0JveFByZWZpeERhdGEgfSkKICAgIGJ5dGVjXzIgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNTcKICAgIC8vIHRoaXMuZGF0YShkYXRhS2V5KS52YWx1ZSA9IHZhbHVlCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gYWRkRGF0YShwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIG5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFkZERhdGFfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYWRkRGF0YV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLmRlbGV0ZURhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGVEYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZGVsZXRlRGF0YShuYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI2NwogICAgLy8gY29uc3QgdHJ1bmNhdGVkQWRkcmVzcyA9IGJ5dGVzMTYoVHhuLnNlbmRlci5ieXRlcykKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgYnl0ZXMxNgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI2OAogICAgLy8gY29uc3QgZGF0YUtleTogRGF0YUtleSA9IHsgYWRkcmVzczogdHJ1bmNhdGVkQWRkcmVzcywgbmFtZSwga2V5IH0KICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjXzEgLy8gMHgwMDE0CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgICsKICAgIGRpZyAzCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMDQKICAgIC8vIGRhdGEgPSBCb3hNYXA8RGF0YUtleSwgc3RyaW5nPih7IGtleVByZWZpeDogTWV0YU1lcmtsZXNCb3hQcmVmaXhEYXRhIH0pCiAgICBieXRlY18yIC8vICJkIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjcwCiAgICAvLyBhc3NlcnQodGhpcy5kYXRhKGRhdGFLZXkpLmV4aXN0cywgRVJSX05PX0RBVEEpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIGRhdGEgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNzMKICAgIC8vIGNvbnN0IGNvc3RzID0gdGhpcy5tYnIoJycsICcnLCBuYW1lLCBrZXksIHRoaXMuZGF0YShkYXRhS2V5KS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgbWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Mjc1CiAgICAvLyB0aGlzLmRhdGEoZGF0YUtleSkuZGVsZXRlKCkKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI3Ny0yODIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogY29zdHMuZGF0YSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Mjc5CiAgICAvLyByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyODAKICAgIC8vIGFtb3VudDogY29zdHMuZGF0YSwKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI3Ny0yODEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogY29zdHMuZGF0YSwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNzctMjgyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IGNvc3RzLmRhdGEsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIGRlbGV0ZURhdGEobmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gdmVyaWZ5KGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywgbGVhZjogTGVhZiwgcHJvb2Y6IFByb29mLCB0eXBlOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4WzMyXVtdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnkKICAgIHBvcAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucmVhZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy5yZWFkCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZpZWRSZWFkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZpZWRSZWFkOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gdmVyaWZpZWRSZWFkKGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywgbGVhZjogTGVhZiwgcHJvb2Y6IFByb29mLCB0eXBlOiB1aW50NjQsIGtleTogc3RyaW5nKTogc3RyaW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAzMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbMzJdW10pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICBjb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzU1CiAgICAvLyBjb25zdCB2ZXJpZmllZCA9IHRoaXMudmVyaWZ5KGFkZHJlc3MsIG5hbWUsIGxlYWYsIHByb29mLCB0eXBlKQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzU2CiAgICAvLyBpZiAoIXZlcmlmaWVkKSB7CiAgICBibnogdmVyaWZpZWRSZWFkX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM1NwogICAgLy8gcmV0dXJuICcnCiAgICBieXRlY18wIC8vICIiCgp2ZXJpZmllZFJlYWRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmaWVkUmVhZEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gdmVyaWZpZWRSZWFkKGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywgbGVhZjogTGVhZiwgcHJvb2Y6IFByb29mLCB0eXBlOiB1aW50NjQsIGtleTogc3RyaW5nKTogc3RyaW5nIHsKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgp2ZXJpZmllZFJlYWRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM1OQogICAgLy8gcmV0dXJuIHRoaXMucmVhZChhZGRyZXNzLCBuYW1lLCBrZXkpCiAgICBkaWcgMgogICAgZGlnIDIKICAgIGRpZyAyCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucmVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gdmVyaWZpZWRSZWFkKGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywgbGVhZjogTGVhZiwgcHJvb2Y6IFByb29mLCB0eXBlOiB1aW50NjQsIGtleTogc3RyaW5nKTogc3RyaW5nIHsKICAgIGIgdmVyaWZpZWRSZWFkX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZmllZFJlYWRANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZpZWRNdXN0UmVhZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmaWVkTXVzdFJlYWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzgxLTM4OAogICAgLy8gdmVyaWZpZWRNdXN0UmVhZCgKICAgIC8vICAgYWRkcmVzczogQWNjb3VudCwKICAgIC8vICAgbmFtZTogc3RyaW5nLAogICAgLy8gICBsZWFmOiBMZWFmLAogICAgLy8gICBwcm9vZjogUHJvb2YsCiAgICAvLyAgIHR5cGU6IHVpbnQ2NCwKICAgIC8vICAga2V5OiBzdHJpbmcKICAgIC8vICk6IHN0cmluZyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1aW50OFszMl1bXSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozODkKICAgIC8vIGFzc2VydCh0aGlzLnZlcmlmeShhZGRyZXNzLCBuYW1lLCBsZWFmLCBwcm9vZiwgdHlwZSksIEVSUl9GQUlMRURfVE9fVkVSSUZZX0lOQ0xVU0lPTikKICAgIGRpZyA1CiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeQogICAgcG9wCiAgICBhc3NlcnQgLy8gZmFpbGVkIHRvIHZlcmlmeSBpbmNsdXNpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozOTAKICAgIC8vIHJldHVybiB0aGlzLnJlYWQoYWRkcmVzcywgbmFtZSwga2V5KQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnJlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozODEtMzg4CiAgICAvLyB2ZXJpZmllZE11c3RSZWFkKAogICAgLy8gICBhZGRyZXNzOiBBY2NvdW50LAogICAgLy8gICBuYW1lOiBzdHJpbmcsCiAgICAvLyAgIGxlYWY6IExlYWYsCiAgICAvLyAgIHByb29mOiBQcm9vZiwKICAgIC8vICAgdHlwZTogdWludDY0LAogICAgLy8gICBrZXk6IHN0cmluZwogICAgLy8gKTogc3RyaW5nIHsKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy5hZGRUeXBlW3JvdXRpbmddKCkgLT4gdm9pZDoKYWRkVHlwZToKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzkzCiAgICAvLyBhZGRUeXBlKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgZGVzY3JpcHRpb246IHN0cmluZywgc2NoZW1hTGlzdDogU2NoZW1hTGlzdCk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4W10pCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Mzk0CiAgICAvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlRfUkVDRUlWRVIpCiAgICBkaWcgMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudCByZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM5NQogICAgLy8gYXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSAxMDBfMDAwXzAwMCwgRVJSX0lOVkFMSURfUEFZTUVOVF9BTU9VTlQpCiAgICBzd2FwCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMTAwMDAwMDAwIC8vIDEwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Mzk2CiAgICAvLyBhc3NlcnQoQnl0ZXMoZGVzY3JpcHRpb24pLmxlbmd0aCA8PSA4MDAsIEVSUl9EQVRBX1RPT19MT05HKQogICAgbGVuCiAgICBkdXAKICAgIHB1c2hpbnQgODAwIC8vIDgwMAogICAgPD0KICAgIGFzc2VydCAvLyBtYXggZGF0YSBsZW5ndGggaXMgMTAyNCBieXRlcwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM5OAogICAgLy8gbGV0IHNjaGVtYTogc3RyaW5nID0gJycKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozOTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBzY2hlbWFMaXN0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAoKYWRkVHlwZV93aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozOTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBzY2hlbWFMaXN0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIGRpZyA0CiAgICA8CiAgICBieiBhZGRUeXBlX2FmdGVyX3doaWxlQDU5CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDAwCiAgICAvLyBzd2l0Y2ggKHNjaGVtYUxpc3RbaV0pIHsKICAgIGRpZyA0CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDAxCiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50ODoKICAgIHB1c2hieXRlcyAweDBhCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQwMS00MDMKICAgIC8vIGNhc2UgU2NoZW1hUGFydFVpbnQ4OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQ4U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQwMgogICAgLy8gc2NoZW1hICs9IFNjaGVtYVBhcnRVaW50OFN0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAidWludDgiCiAgICBjb25jYXQKICAgIGJ1cnkgMgoKYWRkVHlwZV9ibG9ja0A1NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NTQKICAgIC8vIGlmIChzY2hlbWFMaXN0Lmxlbmd0aCA+IDAgJiYgaSAhPT0gc2NoZW1hTGlzdC5sZW5ndGggLSAxKSB7CiAgICBkaWcgMwogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDU4CiAgICBkaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICAhPQogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDU4CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDU1CiAgICAvLyBzY2hlbWEgKz0gJywnCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICIsIgogICAgY29uY2F0CiAgICBidXJ5IDIKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUA1ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozOTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBzY2hlbWFMaXN0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgYWRkVHlwZV93aGlsZV90b3BAMgoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDA0CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50MTY6CiAgICBkaWcgNgogICAgcHVzaGJ5dGVzIDB4MGIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDA0LTQwNgogICAgLy8gY2FzZSBTY2hlbWFQYXJ0VWludDE2OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQxNlN0cmluZwogICAgLy8gICBicmVhawogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MDUKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0VWludDE2U3RyaW5nCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICJ1aW50MTYiCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQwNgogICAgLy8gYnJlYWsKICAgIGIgYWRkVHlwZV9ibG9ja0A1NQoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50MzI6CiAgICBkaWcgNgogICAgcHVzaGJ5dGVzIDB4MGMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDA3LTQwOQogICAgLy8gY2FzZSBTY2hlbWFQYXJ0VWludDMyOgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQzMlN0cmluZwogICAgLy8gICBicmVhawogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDA4CiAgICAvLyBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQzMlN0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAidWludDMyIgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MDkKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIGNhc2UgU2NoZW1hUGFydFVpbnQ2NDoKICAgIGRpZyA2CiAgICBwdXNoYnl0ZXMgMHgwZAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTAtNDEyCiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50NjQ6CiAgICAvLyAgIHNjaGVtYSArPSBTY2hlbWFQYXJ0VWludDY0U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTEKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0VWludDY0U3RyaW5nCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICJ1aW50NjQiCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQxMgogICAgLy8gYnJlYWsKICAgIGIgYWRkVHlwZV9ibG9ja0A1NQoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gY2FzZSBTY2hlbWFQYXJ0VWludDEyODoKICAgIGRpZyA2CiAgICBwdXNoYnl0ZXMgMHgwZQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTMtNDE1CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50MTI4OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQxMjhTdHJpbmcKICAgIC8vICAgYnJlYWsKICAgIGJ6IGFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQxNAogICAgLy8gc2NoZW1hICs9IFNjaGVtYVBhcnRVaW50MTI4U3RyaW5nCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICJ1aW50MTI4IgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTYKICAgIC8vIGNhc2UgU2NoZW1hUGFydFVpbnQyNTY6CiAgICBkaWcgNgogICAgcHVzaGJ5dGVzIDB4MGYKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDE2LTQxOAogICAgLy8gY2FzZSBTY2hlbWFQYXJ0VWludDI1NjoKICAgIC8vICAgc2NoZW1hICs9IFNjaGVtYVBhcnRVaW50MjU2U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTcKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0VWludDI1NlN0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAidWludDI1NiIKICAgIGNvbmNhdAogICAgYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDE4CiAgICAvLyBicmVhawogICAgYiBhZGRUeXBlX2Jsb2NrQDU1CgphZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50NTEyOgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDEwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQxOS00MjEKICAgIC8vIGNhc2UgU2NoZW1hUGFydFVpbnQ1MTI6CiAgICAvLyAgIHNjaGVtYSArPSBTY2hlbWFQYXJ0VWludDUxMlN0cmluZwogICAgLy8gICBicmVhawogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDIwCiAgICAvLyBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQ1MTJTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgInVpbnQ1MTIiCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQyMQogICAgLy8gYnJlYWsKICAgIGIgYWRkVHlwZV9ibG9ja0A1NQoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQyMgogICAgLy8gY2FzZSBTY2hlbWFQYXJ0Qnl0ZXM0OgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDE0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQyMi00MjQKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzNDoKICAgIC8vICAgc2NoZW1hICs9IFNjaGVtYVBhcnRCeXRlczRTdHJpbmcKICAgIC8vICAgYnJlYWsKICAgIGJ6IGFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gc2NoZW1hICs9IFNjaGVtYVBhcnRCeXRlczRTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImJ5dGVzNCIKICAgIGNvbmNhdAogICAgYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDI0CiAgICAvLyBicmVhawogICAgYiBhZGRUeXBlX2Jsb2NrQDU1CgphZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRCeXRlczg6CiAgICBkaWcgNgogICAgcHVzaGJ5dGVzIDB4MTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDI1LTQyNwogICAgLy8gY2FzZSBTY2hlbWFQYXJ0Qnl0ZXM4OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzOFN0cmluZwogICAgLy8gICBicmVhawogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDI2CiAgICAvLyBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzOFN0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAiYnl0ZXM4IgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MjcKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MjgKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMTY6CiAgICBkaWcgNgogICAgcHVzaGJ5dGVzIDB4MTYKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDI4LTQzMAogICAgLy8gY2FzZSBTY2hlbWFQYXJ0Qnl0ZXMxNjoKICAgIC8vICAgc2NoZW1hICs9IFNjaGVtYVBhcnRCeXRlczE2U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MjkKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0Qnl0ZXMxNlN0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAiYnl0ZXMxNiIKICAgIGNvbmNhdAogICAgYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDMwCiAgICAvLyBicmVhawogICAgYiBhZGRUeXBlX2Jsb2NrQDU1CgphZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDMxCiAgICAvLyBjYXNlIFNjaGVtYVBhcnRCeXRlczMyOgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDE3CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQzMS00MzMKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMzI6CiAgICAvLyAgIHNjaGVtYSArPSBTY2hlbWFQYXJ0Qnl0ZXMzMlN0cmluZwogICAgLy8gICBicmVhawogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDMyCiAgICAvLyBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzMzJTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImJ5dGVzMzIiCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQzMwogICAgLy8gYnJlYWsKICAgIGIgYWRkVHlwZV9ibG9ja0A1NQoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQzNAogICAgLy8gY2FzZSBTY2hlbWFQYXJ0Qnl0ZXM2NDoKICAgIGRpZyA2CiAgICBwdXNoYnl0ZXMgMHgxOAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MzQtNDM2CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRCeXRlczY0OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzNjRTdHJpbmcKICAgIC8vICAgYnJlYWsKICAgIGJ6IGFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAzOQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQzNQogICAgLy8gc2NoZW1hICs9IFNjaGVtYVBhcnRCeXRlczY0U3RyaW5nCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICJieXRlczY0IgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MzYKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAzOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MzcKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMTI4OgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDE5CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQzNy00MzkKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMTI4OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzMTI4U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VANDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MzgKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0Qnl0ZXMxMjhTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImJ5dGVzMTI4IgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MzkKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDAKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMjU2OgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDFhCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ0MC00NDIKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMjU2OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzMjU2U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDEKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0Qnl0ZXMyNTZTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImJ5dGVzMjU2IgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDIKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUA0NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDMKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzNTEyOgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDFiCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ0My00NDUKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzNTEyOgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzNTEyU3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VANDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDQKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0Qnl0ZXM1MTJTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImJ5dGVzNTEyIgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDUKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUA0ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDYKICAgIC8vIGNhc2UgU2NoZW1hUGFydFN0cmluZzoKICAgIGRpZyA2CiAgICBwdXNoYnl0ZXMgMHgxZQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDYtNDQ4CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRTdHJpbmc6CiAgICAvLyAgIHNjaGVtYSArPSBTY2hlbWFQYXJ0U3RyaW5nU3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VANTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDcKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0U3RyaW5nU3RyaW5nCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICJzdHJpbmciCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ0OAogICAgLy8gYnJlYWsKICAgIGIgYWRkVHlwZV9ibG9ja0A1NQoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDUxOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ0OQogICAgLy8gY2FzZSBTY2hlbWFQYXJ0QWRkcmVzczoKICAgIGRpZyA2CiAgICBwdXNoYnl0ZXMgMHgyOAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDktNDUxCiAgICAvLyBjYXNlIFNjaGVtYVBhcnRBZGRyZXNzOgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEFkZHJlc3NTdHJpbmcKICAgIC8vICAgYnJlYWsKICAgIGJ6IGFkZFR5cGVfYmxvY2tANTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NTAKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0QWRkcmVzc1N0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAiYWRkcmVzcyIKICAgIGNvbmNhdAogICAgYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDUxCiAgICAvLyBicmVhawogICAgYiBhZGRUeXBlX2Jsb2NrQDU1CgphZGRUeXBlX2FmdGVyX3doaWxlQDU5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEyNAogICAgLy8gY29uc3QgaWQgPSB0aGlzLnR5cGVzSUQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6OTUKICAgIC8vIHR5cGVzSUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBNZXRhTWVya2xlc0dsb2JhbFN0YXRlS2V5VHlwZXNJRCB9KQogICAgYnl0ZWMgNiAvLyAidHlwZXNfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTI0CiAgICAvLyBjb25zdCBpZCA9IHRoaXMudHlwZXNJRC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIHRoaXMudHlwZXNJRC52YWx1ZSArPSAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6OTUKICAgIC8vIHR5cGVzSUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBNZXRhTWVya2xlc0dsb2JhbFN0YXRlS2V5VHlwZXNJRCB9KQogICAgYnl0ZWMgNiAvLyAidHlwZXNfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTI1CiAgICAvLyB0aGlzLnR5cGVzSUQudmFsdWUgKz0gMQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NjEtNDY0CiAgICAvLyB0aGlzLnR5cGVzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLAogICAgLy8gICBzY2hlbWEsCiAgICAvLyB9CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgZGlnIDUKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgOQogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDYxCiAgICAvLyB0aGlzLnR5cGVzKGlkKS52YWx1ZSA9IHsKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMDAKICAgIC8vIHR5cGVzID0gQm94TWFwPHVpbnQ2NCwgVHlwZXNWYWx1ZT4oeyBrZXlQcmVmaXg6IE1ldGFNZXJrbGVzQm94UHJlZml4VHlwZXMgfSkKICAgIHB1c2hieXRlcyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ2MS00NjQKICAgIC8vIHRoaXMudHlwZXMoaWQpLnZhbHVlID0gewogICAgLy8gICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sCiAgICAvLyAgIHNjaGVtYSwKICAgIC8vIH0KICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzkzCiAgICAvLyBhZGRUeXBlKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgZGVzY3JpcHRpb246IHN0cmluZywgc2NoZW1hTGlzdDogU2NoZW1hTGlzdCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucm9vdENvc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKcm9vdENvc3RzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ2OQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy5yb290Q29zdHMKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLmRhdGFDb3N0c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmRhdGFDb3N0czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NzUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ3NwogICAgLy8gY29uc3QgY29zdHMgPSB0aGlzLm1icignJywgJycsIG5hbWUubmF0aXZlLCBrZXkubmF0aXZlLCB2YWx1ZS5uYXRpdmUpCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGNvdmVyIDQKICAgIGNhbGxzdWIgbWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDc4CiAgICAvLyByZXR1cm4gY29zdHMuZGF0YQogICAgZXh0cmFjdCAxNiA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDc1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLm1icih0eXBlRGVzY3JpcHRpb246IGJ5dGVzLCBzY2hlbWE6IGJ5dGVzLCByb290TmFtZTogYnl0ZXMsIGRhdGFLZXk6IGJ5dGVzLCBkYXRhVmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKbWJyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwOS0xMTUKICAgIC8vIHByaXZhdGUgbWJyKAogICAgLy8gICB0eXBlRGVzY3JpcHRpb246IHN0cmluZywKICAgIC8vICAgc2NoZW1hOiBzdHJpbmcsCiAgICAvLyAgIHJvb3ROYW1lOiBzdHJpbmcsCiAgICAvLyAgIGRhdGFLZXk6IHN0cmluZywKICAgIC8vICAgZGF0YVZhbHVlOiBzdHJpbmcKICAgIC8vICk6IE1ldGFNZXJrbGVzTUJSRGF0YSB7CiAgICBwcm90byA1IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMTcKICAgIC8vIHR5cGVzOiBNaW5UeXBlc01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIEJ5dGVzKHR5cGVEZXNjcmlwdGlvbikubGVuZ3RoICsgQnl0ZXMoc2NoZW1hKS5sZW5ndGgpLAogICAgZnJhbWVfZGlnIC01CiAgICBsZW4KICAgIGludGMgNCAvLyA0MDAKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgbGVuCiAgICArCiAgICBwdXNoaW50IDkzMDAgLy8gOTMwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gcm9vdHM6IE1pblJvb3RzTUJSICsgKEJveENvc3RQZXJCeXRlICogQnl0ZXMocm9vdE5hbWUpLmxlbmd0aCksCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaW50YyA0IC8vIDQwMAogICAgZGlnIDEKICAgICoKICAgIHB1c2hpbnQgMzAxMDAgLy8gMzAxMDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMTkKICAgIC8vIGRhdGE6IE1pbkRhdGFNQlIgKyAoQm94Q29zdFBlckJ5dGUgKiAoQnl0ZXMocm9vdE5hbWUpLmxlbmd0aCArIEJ5dGVzKGRhdGFLZXkpLmxlbmd0aCArIEJ5dGVzKGRhdGFWYWx1ZSkubGVuZ3RoKSksCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgKwogICAgaW50YyA0IC8vIDQwMAogICAgKgogICAgcHVzaGludCAxMjUwMCAvLyAxMjUwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjExNi0xMjAKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIHR5cGVzOiBNaW5UeXBlc01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIEJ5dGVzKHR5cGVEZXNjcmlwdGlvbikubGVuZ3RoICsgQnl0ZXMoc2NoZW1hKS5sZW5ndGgpLAogICAgLy8gICByb290czogTWluUm9vdHNNQlIgKyAoQm94Q29zdFBlckJ5dGUgKiBCeXRlcyhyb290TmFtZSkubGVuZ3RoKSwKICAgIC8vICAgZGF0YTogTWluRGF0YU1CUiArIChCb3hDb3N0UGVyQnl0ZSAqIChCeXRlcyhyb290TmFtZSkubGVuZ3RoICsgQnl0ZXMoZGF0YUtleSkubGVuZ3RoICsgQnl0ZXMoZGF0YVZhbHVlKS5sZW5ndGgpKSwKICAgIC8vIH0KICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnkoYWRkcmVzczogYnl0ZXMsIG5hbWU6IGJ5dGVzLCBsZWFmOiBieXRlcywgcHJvb2Y6IGJ5dGVzLCB0eXBlOiB1aW50NjQpIC0+IHVpbnQ2NCwgYnl0ZXM6CnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gdmVyaWZ5KGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywgbGVhZjogTGVhZiwgcHJvb2Y6IFByb29mLCB0eXBlOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDUgMgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Mjk3CiAgICAvLyBjb25zdCB0cnVuY2F0ZWRBZGRyZXNzID0gYnl0ZXMxNihhZGRyZXNzLmJ5dGVzKQogICAgZnJhbWVfZGlnIC01CiAgICBjYWxsc3ViIGJ5dGVzMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyOTkKICAgIC8vIGNvbnN0IHJvb3RLZXk6IFJvb3RLZXkgPSB7IGFkZHJlc3MsIG5hbWUgfQogICAgZnJhbWVfZGlnIC00CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC01CiAgICBieXRlYyA0IC8vIDB4MDAyMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzAwCiAgICAvLyBjb25zdCB0eXBlS2V5OiBEYXRhS2V5ID0geyBhZGRyZXNzOiB0cnVuY2F0ZWRBZGRyZXNzLCBuYW1lLCBrZXk6IHRyZWVUeXBlS2V5IH0KICAgIGRpZyAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzEgLy8gMHgwMDE0CiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlYyA3IC8vIDB4MDAwNjZjMmU3NDc5NzA2NQogICAgY29uY2F0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyByb290cyA9IEJveE1hcDxSb290S2V5LCBieXRlczwzMj4+KHsga2V5UHJlZml4OiBNZXRhTWVya2xlc0JveFByZWZpeFJvb3RzIH0pCiAgICBieXRlYyA1IC8vICJyIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozMDIKICAgIC8vIGlmICghdGhpcy5yb290cyhyb290S2V5KS5leGlzdHMgfHwgIXRoaXMuZGF0YSh0eXBlS2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfaWZfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyBkYXRhID0gQm94TWFwPERhdGFLZXksIHN0cmluZz4oeyBrZXlQcmVmaXg6IE1ldGFNZXJrbGVzQm94UHJlZml4RGF0YSB9KQogICAgYnl0ZWNfMiAvLyAiZCIKICAgIGZyYW1lX2RpZyA2CiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzAyCiAgICAvLyBpZiAoIXRoaXMucm9vdHMocm9vdEtleSkuZXhpc3RzIHx8ICF0aGlzLmRhdGEodHlwZUtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeV9hZnRlcl9pZl9lbHNlQDMKCnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5X2lmX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozMDMKICAgIC8vIHJldHVybiBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMwNgogICAgLy8gY29uc3QgdHJlZVR5cGUgPSBidG9pKEJ5dGVzKHRoaXMuZGF0YSh0eXBlS2V5KS52YWx1ZSkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gaWYgKHR5cGUgIT09IE1lcmtsZVRyZWVUeXBlVW5zcGVjaWZpZWQgJiYgdHJlZVR5cGUgIT09IHR5cGUpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIC0xCiAgICAhPQogICAgYnogc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzA4CiAgICAvLyByZXR1cm4gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozMTEKICAgIC8vIGVuc3VyZUJ1ZGdldChwcm9vZi5sZW5ndGggKiA1MCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgcHVzaGludCA1MCAvLyA1MAogICAgKgogICAgcHVzaGludCAxMCAvLyAxMAogICAgKwogICAgZnJhbWVfYnVyeSA0CgpzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeV93aGlsZV90b3BAMTU6CiAgICBmcmFtZV9kaWcgNAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfd2hpbGVAMjAKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA4IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgOCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeV93aGlsZV90b3BAMTUKCnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5X2FmdGVyX3doaWxlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHByb29mLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2J1cnkgMQoKc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfd2hpbGVfdG9wQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzE0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcHJvb2YubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfd2hpbGVAOQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gaGFzaCA9IHRoaXMuaGFzaChwcm9vZltpXSwgaGFzaCkKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGlmIChCaWdVaW50KGEpID4gQmlnVWludChiKSkgewogICAgZnJhbWVfZGlnIDEKICAgIGI+CiAgICBieiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeV9hZnRlcl9pZl9lbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyByZXR1cm4gc2hhMjU2KGIuY29uY2F0KGEpKQogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICBmcmFtZV9idXJ5IDEKCnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy5oYXNoQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHByb29mLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeV93aGlsZV90b3BANwoKc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMzMKICAgIC8vIHJldHVybiBzaGEyNTYoYS5jb25jYXQoYikpCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gaGFzaCA9IHRoaXMuaGFzaChwcm9vZltpXSwgaGFzaCkKICAgIGIgc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLmhhc2hAMTMKCnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5X2FmdGVyX3doaWxlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyByZXR1cm4gaGFzaCA9PT0gdGhpcy5yb290cyhyb290S2V5KS52YWx1ZQogICAgZnJhbWVfZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgPT0KICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucmVhZChhZGRyZXNzOiBieXRlcywgbmFtZTogYnl0ZXMsIGtleTogYnl0ZXMpIC0+IGJ5dGVzOgpzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnJlYWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzI5LTMzMAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyByZWFkKGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyBjb25zdCB0cnVuY2F0ZWRBZGRyZXNzID0gYnl0ZXMxNihhZGRyZXNzLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIGJ5dGVzMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozMzIKICAgIC8vIHJldHVybiB0aGlzLmRhdGEoeyBhZGRyZXNzOiB0cnVuY2F0ZWRBZGRyZXNzLCBuYW1lLCBrZXkgfSkudmFsdWUKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWNfMSAvLyAweDAwMTQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAyMCAvLyAyMAogICAgKwogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyBkYXRhID0gQm94TWFwPERhdGFLZXksIHN0cmluZz4oeyBrZXlQcmVmaXg6IE1ldGFNZXJrbGVzQm94UHJlZml4RGF0YSB9KQogICAgYnl0ZWNfMiAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMzMgogICAgLy8gcmV0dXJuIHRoaXMuZGF0YSh7IGFkZHJlc3M6IHRydW5jYXRlZEFkZHJlc3MsIG5hbWUsIGtleSB9KS52YWx1ZQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucm9vdENvc3RzKG5hbWU6IGJ5dGVzKSAtPiB1aW50NjQ6CnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucm9vdENvc3RzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ2OS00NzAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gcm9vdENvc3RzKG5hbWU6IHN0cmluZyk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NzEKICAgIC8vIGNvbnN0IGNvc3RzID0gdGhpcy5tYnIoJycsICcnLCBuYW1lLCB0cmVlVHlwZUtleSwgU3RyaW5nKGl0b2IoMCkpKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgImwudHlwZSIKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiBtYnIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NzIKICAgIC8vIHJldHVybiBjb3N0cy5yb290cyArIGNvc3RzLmRhdGEKICAgIGR1cAogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgKwogICAgcmV0c3ViCg==\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type DataKey = {\n address: Uint8Array,\n name: string,\n key: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a DataKey to the struct representation\n */\nexport function DataKeyFromTuple(abiTuple: [Uint8Array, string, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.DataKey, APP_SPEC.structs) as DataKey\n}\n\nexport type RootKey = {\n address: string,\n name: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a RootKey to the struct representation\n */\nexport function RootKeyFromTuple(abiTuple: [string, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.RootKey, APP_SPEC.structs) as RootKey\n}\n\nexport type TypesValue = {\n schema: string,\n description: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a TypesValue to the struct representation\n */\nexport function TypesValueFromTuple(abiTuple: [string, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.TypesValue, APP_SPEC.structs) as TypesValue\n}\n\n/**\n * The argument types for the MetaMerkles contract\n */\nexport type MetaMerklesArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create()void': Record<string, never>\n 'addRoot(pay,string,byte[32],uint64)void': {\n payment: AppMethodCallTransactionArgument\n /**\n * the name alias of the root being added\n */\n name: string\n /**\n * a merkle tree root\n */\n root: Uint8Array\n /**\n * an index of the tree type enum from box storage\n */\n type: bigint | number\n }\n 'deleteRoot(string)void': {\n /**\n * the name of the merkle tree root\n */\n name: string\n }\n 'updateRoot(string,byte[32])void': {\n /**\n * the name of the merkle group data\n */\n name: string\n /**\n * the new 32 byte merkle tree root\n */\n newRoot: Uint8Array\n }\n 'addData(pay,string,string,string)void': {\n payment: AppMethodCallTransactionArgument\n /**\n * the name of the merkle tree root\n */\n name: string\n /**\n * the metadata key eg. `Royalty`\n */\n key: string\n /**\n * the metadata value eg. `5` encoded as a bytestring for 5%\n */\n value: string\n }\n 'deleteData(string,string)void': {\n /**\n * the name of the merkle tree root\n */\n name: string\n /**\n * the metadata key you want to remove\n */\n key: string\n }\n 'verify(address,string,byte[32],byte[32][],uint64)bool': {\n /**\n * the address of the merkle tree root creator\n */\n address: string\n /**\n * The name alias of the root\n */\n name: string\n /**\n * The hashed leaf to verify\n */\n leaf: Uint8Array\n /**\n * The merkle proof\n */\n proof: Uint8Array[]\n /**\n * The type check for the lists purpose\n */\n type: bigint | number\n }\n 'read(address,string,string)string': {\n /**\n * the address of the merkle tree root creator\n */\n address: string\n /**\n * the name of the merkle tree root\n */\n name: string\n /**\n * the metadata key eg. `Royalty`\n */\n key: string\n }\n 'verifiedRead(address,string,byte[32],byte[32][],uint64,string)string': {\n /**\n * the address of the merkle tree root creator\n */\n address: string\n /**\n * the name of the root\n */\n name: string\n /**\n * the leaf node to be verified\n */\n leaf: Uint8Array\n /**\n * the proof the hash is included\n */\n proof: Uint8Array[]\n /**\n * the list type that helps contracts ensure\n the lists purpose isn't being misused ( 0 if the caller doesnt care )\n\n */\n type: bigint | number\n /**\n * the metadata key eg. `Royalty`\n */\n key: string\n }\n 'verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string': {\n /**\n * the address of the merkle tree root creator\n */\n address: string\n /**\n * the name of the root\n */\n name: string\n /**\n * the leaf node to be verified\n */\n leaf: Uint8Array\n /**\n * the proof the hash is included\n */\n proof: Uint8Array[]\n /**\n * the list type that helps contracts ensure\n the lists purpose isn't being misused ( 0 if the caller doesnt care )\n\n */\n type: bigint | number\n /**\n * the metadata key eg. `Royalty`\n */\n key: string\n }\n 'addType(pay,string,uint8[])void': {\n payment: AppMethodCallTransactionArgument\n description: string\n schemaList: bigint[] | number[]\n }\n 'rootCosts(string)uint64': {\n name: string\n }\n 'dataCosts(string,string,string)uint64': {\n name: string\n key: string\n value: string\n }\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create()void': []\n 'addRoot(pay,string,byte[32],uint64)void': [payment: AppMethodCallTransactionArgument, name: string, root: Uint8Array, type: bigint | number]\n 'deleteRoot(string)void': [name: string]\n 'updateRoot(string,byte[32])void': [name: string, newRoot: Uint8Array]\n 'addData(pay,string,string,string)void': [payment: AppMethodCallTransactionArgument, name: string, key: string, value: string]\n 'deleteData(string,string)void': [name: string, key: string]\n 'verify(address,string,byte[32],byte[32][],uint64)bool': [address: string, name: string, leaf: Uint8Array, proof: Uint8Array[], type: bigint | number]\n 'read(address,string,string)string': [address: string, name: string, key: string]\n 'verifiedRead(address,string,byte[32],byte[32][],uint64,string)string': [address: string, name: string, leaf: Uint8Array, proof: Uint8Array[], type: bigint | number, key: string]\n 'verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string': [address: string, name: string, leaf: Uint8Array, proof: Uint8Array[], type: bigint | number, key: string]\n 'addType(pay,string,uint8[])void': [payment: AppMethodCallTransactionArgument, description: string, schemaList: bigint[] | number[]]\n 'rootCosts(string)uint64': [name: string]\n 'dataCosts(string,string,string)uint64': [name: string, key: string, value: string]\n }\n}\n\n/**\n * The return type for each method\n */\nexport type MetaMerklesReturns = {\n 'create()void': void\n 'addRoot(pay,string,byte[32],uint64)void': void\n 'deleteRoot(string)void': void\n 'updateRoot(string,byte[32])void': void\n 'addData(pay,string,string,string)void': void\n 'deleteData(string,string)void': void\n 'verify(address,string,byte[32],byte[32][],uint64)bool': boolean\n 'read(address,string,string)string': string\n 'verifiedRead(address,string,byte[32],byte[32][],uint64,string)string': string\n 'verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string': string\n 'addType(pay,string,uint8[])void': void\n 'rootCosts(string)uint64': bigint\n 'dataCosts(string,string,string)uint64': bigint\n}\n\n/**\n * Defines the types of available calls and state of the MetaMerkles smart contract.\n */\nexport type MetaMerklesTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create()void' | 'create', {\n argsObj: MetaMerklesArgs['obj']['create()void']\n argsTuple: MetaMerklesArgs['tuple']['create()void']\n returns: MetaMerklesReturns['create()void']\n }>\n & Record<'addRoot(pay,string,byte[32],uint64)void' | 'addRoot', {\n argsObj: MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void']\n argsTuple: MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']\n returns: MetaMerklesReturns['addRoot(pay,string,byte[32],uint64)void']\n }>\n & Record<'deleteRoot(string)void' | 'deleteRoot', {\n argsObj: MetaMerklesArgs['obj']['deleteRoot(string)void']\n argsTuple: MetaMerklesArgs['tuple']['deleteRoot(string)void']\n returns: MetaMerklesReturns['deleteRoot(string)void']\n }>\n & Record<'updateRoot(string,byte[32])void' | 'updateRoot', {\n argsObj: MetaMerklesArgs['obj']['updateRoot(string,byte[32])void']\n argsTuple: MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']\n returns: MetaMerklesReturns['updateRoot(string,byte[32])void']\n }>\n & Record<'addData(pay,string,string,string)void' | 'addData', {\n argsObj: MetaMerklesArgs['obj']['addData(pay,string,string,string)void']\n argsTuple: MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']\n returns: MetaMerklesReturns['addData(pay,string,string,string)void']\n }>\n & Record<'deleteData(string,string)void' | 'deleteData', {\n argsObj: MetaMerklesArgs['obj']['deleteData(string,string)void']\n argsTuple: MetaMerklesArgs['tuple']['deleteData(string,string)void']\n returns: MetaMerklesReturns['deleteData(string,string)void']\n }>\n & Record<'verify(address,string,byte[32],byte[32][],uint64)bool' | 'verify', {\n argsObj: MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool']\n argsTuple: MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']\n /**\n * a boolean indicating whether the proof is valid\n */\n returns: MetaMerklesReturns['verify(address,string,byte[32],byte[32][],uint64)bool']\n }>\n & Record<'read(address,string,string)string' | 'read', {\n argsObj: MetaMerklesArgs['obj']['read(address,string,string)string']\n argsTuple: MetaMerklesArgs['tuple']['read(address,string,string)string']\n /**\n * the value set eg. `5` encoded as a bytestring for 5%\n */\n returns: MetaMerklesReturns['read(address,string,string)string']\n }>\n & Record<'verifiedRead(address,string,byte[32],byte[32][],uint64,string)string' | 'verifiedRead', {\n argsObj: MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']\n argsTuple: MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']\n /**\n * a string of metadata\n */\n returns: MetaMerklesReturns['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']\n }>\n & Record<'verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string' | 'verifiedMustRead', {\n argsObj: MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']\n argsTuple: MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']\n /**\n * a string of metadata\n */\n returns: MetaMerklesReturns['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']\n }>\n & Record<'addType(pay,string,uint8[])void' | 'addType', {\n argsObj: MetaMerklesArgs['obj']['addType(pay,string,uint8[])void']\n argsTuple: MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']\n returns: MetaMerklesReturns['addType(pay,string,uint8[])void']\n }>\n & Record<'rootCosts(string)uint64' | 'rootCosts', {\n argsObj: MetaMerklesArgs['obj']['rootCosts(string)uint64']\n argsTuple: MetaMerklesArgs['tuple']['rootCosts(string)uint64']\n returns: MetaMerklesReturns['rootCosts(string)uint64']\n }>\n & Record<'dataCosts(string,string,string)uint64' | 'dataCosts', {\n argsObj: MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64']\n argsTuple: MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']\n returns: MetaMerklesReturns['dataCosts(string,string,string)uint64']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n typesId: bigint\n }\n maps: {}\n }\n box: {\n keys: {}\n maps: {\n /**\n * the types (intents) of merkle trees that exist\n */\n types: Map<bigint | number, TypesValue>\n /**\n * the merkle roots we want to attach data to\n */\n roots: Map<RootKey, Uint8Array>\n /**\n * rootData is the box map for managing the data associated with a group\n */\n data: Map<DataKey, string>\n }\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type MetaMerklesSignatures = keyof MetaMerklesTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type MetaMerklesNonVoidMethodSignatures = keyof MetaMerklesTypes['methods'] extends infer T ? T extends keyof MetaMerklesTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the MetaMerkles smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends MetaMerklesSignatures> = MetaMerklesTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the MetaMerkles smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends MetaMerklesSignatures> = MetaMerklesTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = MetaMerklesTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = MetaMerklesTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type MetaMerklesCreateCallParams =\n | Expand<CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & {method: 'create()void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type MetaMerklesDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n createParams?: MetaMerklesCreateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the MetaMerkles smart contract\n */\nexport abstract class MetaMerklesParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends MetaMerklesCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create()void':\n return MetaMerklesParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the MetaMerkles smart contract using the create()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the addRoot(pay,string,byte[32],uint64)void ABI method\n *\n * Creates two boxes and adds a merkle root\n using a `RootKey` to the root box map and also a list type to the\n metadata attached to the root in the data box map\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static addRoot(params: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'addRoot(pay,string,byte[32],uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.name, params.args.root, params.args.type],\n }\n }\n /**\n * Constructs a no op call for the deleteRoot(string)void ABI method\n *\n * Deletes the merkle root from the root box map\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deleteRoot(params: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deleteRoot(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.name],\n }\n }\n /**\n * Constructs a no op call for the updateRoot(string,byte[32])void ABI method\n *\n * Replaces the merkle root with another\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateRoot(params: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateRoot(string,byte[32])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.name, params.args.newRoot],\n }\n }\n /**\n * Constructs a no op call for the addData(pay,string,string,string)void ABI method\n *\n * Registers a key & value in the data box map that\n corresponds to a merkle root in the root box map\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static addData(params: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'addData(pay,string,string,string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.name, params.args.key, params.args.value],\n }\n }\n /**\n * Constructs a no op call for the deleteData(string,string)void ABI method\n *\n * Deletes a metadata key & value pair from the data box map\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deleteData(params: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deleteData(string,string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.name, params.args.key],\n }\n }\n /**\n * Constructs a no op call for the verify(address,string,byte[32],byte[32][],uint64)bool ABI method\n *\n * verify an inclusion in a double sha256 based merkle tree\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static verify(params: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'verify(address,string,byte[32],byte[32][],uint64)bool' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.name, params.args.leaf, params.args.proof, params.args.type],\n }\n }\n /**\n * Constructs a no op call for the read(address,string,string)string ABI method\n *\n * Fetch a metadata properties\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static read(params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'read(address,string,string)string' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.name, params.args.key],\n }\n }\n /**\n * Constructs a no op call for the verifiedRead(address,string,byte[32],byte[32][],uint64,string)string ABI method\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static verifiedRead(params: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'verifiedRead(address,string,byte[32],byte[32][],uint64,string)string' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.name, params.args.leaf, params.args.proof, params.args.type, params.args.key],\n }\n }\n /**\n * Constructs a no op call for the verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string ABI method\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static verifiedMustRead(params: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.name, params.args.leaf, params.args.proof, params.args.type, params.args.key],\n }\n }\n /**\n * Constructs a no op call for the addType(pay,string,uint8[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static addType(params: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'addType(pay,string,uint8[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.description, params.args.schemaList],\n }\n }\n /**\n * Constructs a no op call for the rootCosts(string)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static rootCosts(params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'rootCosts(string)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.name],\n }\n }\n /**\n * Constructs a no op call for the dataCosts(string,string,string)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static dataCosts(params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'dataCosts(string,string,string)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.name, params.args.key, params.args.value],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the MetaMerkles smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class MetaMerklesFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `MetaMerklesFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new MetaMerklesClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new MetaMerklesClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the MetaMerkles smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: MetaMerklesDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? MetaMerklesParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (MetaMerklesCreateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new MetaMerklesClient(result.appClient) }\n }\n\n /**\n * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the MetaMerkles smart contract using the create()void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appFactory.params.create(MetaMerklesParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the MetaMerkles smart contract using the create()void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appFactory.createTransaction.create(MetaMerklesParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the MetaMerkles smart contract using an ABI method call using the create()void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appFactory.send.create(MetaMerklesParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | MetaMerklesReturns['create()void']) }, appClient: new MetaMerklesClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the MetaMerkles smart contract\n */\nexport class MetaMerklesClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `MetaMerklesClient`\n *\n * @param appClient An `AppClient` instance which has been created with the MetaMerkles app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `MetaMerklesClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Checks for decode errors on the given return value and maps the return value to the return type for the given method\n * @returns The typed return value or undefined if there was no value\n */\n decodeReturnValue<TSignature extends MetaMerklesNonVoidMethodSignatures>(method: TSignature, returnValue: ABIReturn | undefined) {\n return returnValue !== undefined ? getArc56ReturnValue<MethodReturn<TSignature>>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined\n }\n\n /**\n * Returns a new `MetaMerklesClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<MetaMerklesClient> {\n return new MetaMerklesClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `MetaMerklesClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<MetaMerklesClient> {\n return new MetaMerklesClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Makes a clear_state call to an existing instance of the MetaMerkles smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addRoot(pay,string,byte[32],uint64)void` ABI method.\n *\n * Creates two boxes and adds a merkle root\n using a `RootKey` to the root box map and also a list type to the\n metadata attached to the root in the data box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n addRoot: (params: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.addRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteRoot(string)void` ABI method.\n *\n * Deletes the merkle root from the root box map\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deleteRoot: (params: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.deleteRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `updateRoot(string,byte[32])void` ABI method.\n *\n * Replaces the merkle root with another\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateRoot: (params: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.updateRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addData(pay,string,string,string)void` ABI method.\n *\n * Registers a key & value in the data box map that\n corresponds to a merkle root in the root box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n addData: (params: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.addData(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteData(string,string)void` ABI method.\n *\n * Deletes a metadata key & value pair from the data box map\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deleteData: (params: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.deleteData(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verify(address,string,byte[32],byte[32][],uint64)bool` ABI method.\n *\n * verify an inclusion in a double sha256 based merkle tree\n *\n * @param params The params for the smart contract call\n * @returns The call params: a boolean indicating whether the proof is valid\n */\n verify: (params: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.verify(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `read(address,string,string)string` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Fetch a metadata properties\n *\n * @param params The params for the smart contract call\n * @returns The call params: the value set eg. `5` encoded as a bytestring for 5%\n */\n read: (params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.read(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call params: a string of metadata\n */\n verifiedRead: (params: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.verifiedRead(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call params: a string of metadata\n */\n verifiedMustRead: (params: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.verifiedMustRead(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addType(pay,string,uint8[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n addType: (params: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.addType(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `rootCosts(string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n rootCosts: (params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.rootCosts(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `dataCosts(string,string,string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n dataCosts: (params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.dataCosts(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Makes a clear_state call to an existing instance of the MetaMerkles smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addRoot(pay,string,byte[32],uint64)void` ABI method.\n *\n * Creates two boxes and adds a merkle root\n using a `RootKey` to the root box map and also a list type to the\n metadata attached to the root in the data box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n addRoot: (params: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.addRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteRoot(string)void` ABI method.\n *\n * Deletes the merkle root from the root box map\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deleteRoot: (params: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.deleteRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `updateRoot(string,byte[32])void` ABI method.\n *\n * Replaces the merkle root with another\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateRoot: (params: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.updateRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addData(pay,string,string,string)void` ABI method.\n *\n * Registers a key & value in the data box map that\n corresponds to a merkle root in the root box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n addData: (params: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.addData(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteData(string,string)void` ABI method.\n *\n * Deletes a metadata key & value pair from the data box map\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deleteData: (params: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.deleteData(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verify(address,string,byte[32],byte[32][],uint64)bool` ABI method.\n *\n * verify an inclusion in a double sha256 based merkle tree\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a boolean indicating whether the proof is valid\n */\n verify: (params: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.verify(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `read(address,string,string)string` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Fetch a metadata properties\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: the value set eg. `5` encoded as a bytestring for 5%\n */\n read: (params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.read(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a string of metadata\n */\n verifiedRead: (params: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.verifiedRead(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a string of metadata\n */\n verifiedMustRead: (params: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.verifiedMustRead(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addType(pay,string,uint8[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n addType: (params: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.addType(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `rootCosts(string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n rootCosts: (params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.rootCosts(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `dataCosts(string,string,string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n dataCosts: (params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.dataCosts(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Makes a clear_state call to an existing instance of the MetaMerkles smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addRoot(pay,string,byte[32],uint64)void` ABI method.\n *\n * Creates two boxes and adds a merkle root\n using a `RootKey` to the root box map and also a list type to the\n metadata attached to the root in the data box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n addRoot: async (params: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.addRoot(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['addRoot(pay,string,byte[32],uint64)void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteRoot(string)void` ABI method.\n *\n * Deletes the merkle root from the root box map\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deleteRoot: async (params: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.deleteRoot(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['deleteRoot(string)void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `updateRoot(string,byte[32])void` ABI method.\n *\n * Replaces the merkle root with another\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateRoot: async (params: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.updateRoot(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['updateRoot(string,byte[32])void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addData(pay,string,string,string)void` ABI method.\n *\n * Registers a key & value in the data box map that\n corresponds to a merkle root in the root box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n addData: async (params: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.addData(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['addData(pay,string,string,string)void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteData(string,string)void` ABI method.\n *\n * Deletes a metadata key & value pair from the data box map\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deleteData: async (params: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.deleteData(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['deleteData(string,string)void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verify(address,string,byte[32],byte[32][],uint64)bool` ABI method.\n *\n * verify an inclusion in a double sha256 based merkle tree\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean indicating whether the proof is valid\n */\n verify: async (params: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.verify(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['verify(address,string,byte[32],byte[32][],uint64)bool'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `read(address,string,string)string` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Fetch a metadata properties\n *\n * @param params The params for the smart contract call\n * @returns The call result: the value set eg. `5` encoded as a bytestring for 5%\n */\n read: async (params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.read(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['read(address,string,string)string'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call result: a string of metadata\n */\n verifiedRead: async (params: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.verifiedRead(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call result: a string of metadata\n */\n verifiedMustRead: async (params: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.verifiedMustRead(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addType(pay,string,uint8[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n addType: async (params: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.addType(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['addType(pay,string,uint8[])void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `rootCosts(string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n rootCosts: async (params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.rootCosts(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['rootCosts(string)uint64'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `dataCosts(string,string,string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n dataCosts: async (params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.dataCosts(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['dataCosts(string,string,string)uint64'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new MetaMerklesClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the MetaMerkles smart contract using the `read(address,string,string)string` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Fetch a metadata properties\n *\n * @param params The params for the smart contract call\n * @returns The call result: the value set eg. `5` encoded as a bytestring for 5%\n */\n async read(params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']>) {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.read(params))\n return result.return as unknown as MetaMerklesReturns['read(address,string,string)string']\n }\n\n /**\n * Makes a readonly (simulated) call to the MetaMerkles smart contract using the `rootCosts(string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async rootCosts(params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']>) {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.rootCosts(params))\n return result.return as unknown as MetaMerklesReturns['rootCosts(string)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the MetaMerkles smart contract using the `dataCosts(string,string,string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async dataCosts(params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']>) {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.dataCosts(params))\n return result.return as unknown as MetaMerklesReturns['dataCosts(string,string,string)uint64']\n }\n\n /**\n * Methods to access state for the current MetaMerkles app\n */\n state = {\n /**\n * Methods to access global state for the current MetaMerkles app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n typesId: result.typesID,\n }\n },\n /**\n * Get the current value of the typesID key in global state\n */\n typesId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"typesID\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current MetaMerkles app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n }\n },\n /**\n * Get values from the types map in box state\n */\n types: {\n /**\n * Get all current values of the types map in box state\n */\n getMap: async (): Promise<Map<bigint, TypesValue>> => { return (await this.appClient.state.box.getMap(\"types\")) as Map<bigint, TypesValue> },\n /**\n * Get a current value of the types map by key from box state\n */\n value: async (key: bigint | number): Promise<TypesValue | undefined> => { return await this.appClient.state.box.getMapValue(\"types\", key) as TypesValue | undefined },\n },\n /**\n * Get values from the roots map in box state\n */\n roots: {\n /**\n * Get all current values of the roots map in box state\n */\n getMap: async (): Promise<Map<RootKey, Uint8Array>> => { return (await this.appClient.state.box.getMap(\"roots\")) as Map<RootKey, Uint8Array> },\n /**\n * Get a current value of the roots map by key from box state\n */\n value: async (key: RootKey): Promise<Uint8Array | undefined> => { return await this.appClient.state.box.getMapValue(\"roots\", key) as Uint8Array | undefined },\n },\n /**\n * Get values from the data map in box state\n */\n data: {\n /**\n * Get all current values of the data map in box state\n */\n getMap: async (): Promise<Map<DataKey, string>> => { return (await this.appClient.state.box.getMap(\"data\")) as Map<DataKey, string> },\n /**\n * Get a current value of the data map by key from box state\n */\n value: async (key: DataKey): Promise<string | undefined> => { return await this.appClient.state.box.getMapValue(\"data\", key) as string | undefined },\n },\n },\n }\n\n public newGroup(): MetaMerklesComposer {\n const client = this\n const composer = this.algorand.newGroup()\n let promiseChain:Promise<unknown> = Promise.resolve()\n const resultMappers: Array<undefined | ((x: ABIReturn | undefined) => any)> = []\n return {\n /**\n * Add a addRoot(pay,string,byte[32],uint64)void method call against the MetaMerkles contract\n */\n addRoot(params: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addRoot(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a deleteRoot(string)void method call against the MetaMerkles contract\n */\n deleteRoot(params: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteRoot(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateRoot(string,byte[32])void method call against the MetaMerkles contract\n */\n updateRoot(params: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateRoot(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a addData(pay,string,string,string)void method call against the MetaMerkles contract\n */\n addData(params: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addData(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a deleteData(string,string)void method call against the MetaMerkles contract\n */\n deleteData(params: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteData(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a verify(address,string,byte[32],byte[32][],uint64)bool method call against the MetaMerkles contract\n */\n verify(params: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verify(params)))\n resultMappers.push((v) => client.decodeReturnValue('verify(address,string,byte[32],byte[32][],uint64)bool', v))\n return this\n },\n /**\n * Add a read(address,string,string)string method call against the MetaMerkles contract\n */\n read(params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.read(params)))\n resultMappers.push((v) => client.decodeReturnValue('read(address,string,string)string', v))\n return this\n },\n /**\n * Add a verifiedRead(address,string,byte[32],byte[32][],uint64,string)string method call against the MetaMerkles contract\n */\n verifiedRead(params: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifiedRead(params)))\n resultMappers.push((v) => client.decodeReturnValue('verifiedRead(address,string,byte[32],byte[32][],uint64,string)string', v))\n return this\n },\n /**\n * Add a verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string method call against the MetaMerkles contract\n */\n verifiedMustRead(params: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifiedMustRead(params)))\n resultMappers.push((v) => client.decodeReturnValue('verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string', v))\n return this\n },\n /**\n * Add a addType(pay,string,uint8[])void method call against the MetaMerkles contract\n */\n addType(params: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addType(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a rootCosts(string)uint64 method call against the MetaMerkles contract\n */\n rootCosts(params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.rootCosts(params)))\n resultMappers.push((v) => client.decodeReturnValue('rootCosts(string)uint64', v))\n return this\n },\n /**\n * Add a dataCosts(string,string,string)uint64 method call against the MetaMerkles contract\n */\n dataCosts(params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.dataCosts(params)))\n resultMappers.push((v) => client.decodeReturnValue('dataCosts(string,string,string)uint64', v))\n return this\n },\n /**\n * Add a clear state call to the MetaMerkles contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n }\n } as unknown as MetaMerklesComposer\n }\n}\nexport type MetaMerklesComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the addRoot(pay,string,byte[32],uint64)void ABI method.\n *\n * Creates two boxes and adds a merkle root\n using a `RootKey` to the root box map and also a list type to the\n metadata attached to the root in the data box map\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n addRoot(params?: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['addRoot(pay,string,byte[32],uint64)void'] | undefined]>\n\n /**\n * Calls the deleteRoot(string)void ABI method.\n *\n * Deletes the merkle root from the root box map\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deleteRoot(params?: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['deleteRoot(string)void'] | undefined]>\n\n /**\n * Calls the updateRoot(string,byte[32])void ABI method.\n *\n * Replaces the merkle root with another\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateRoot(params?: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['updateRoot(string,byte[32])void'] | undefined]>\n\n /**\n * Calls the addData(pay,string,string,string)void ABI method.\n *\n * Registers a key & value in the data box map that\n corresponds to a merkle root in the root box map\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n addData(params?: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['addData(pay,string,string,string)void'] | undefined]>\n\n /**\n * Calls the deleteData(string,string)void ABI method.\n *\n * Deletes a metadata key & value pair from the data box map\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deleteData(params?: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['deleteData(string,string)void'] | undefined]>\n\n /**\n * Calls the verify(address,string,byte[32],byte[32][],uint64)bool ABI method.\n *\n * verify an inclusion in a double sha256 based merkle tree\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n verify(params?: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['verify(address,string,byte[32],byte[32][],uint64)bool'] | undefined]>\n\n /**\n * Calls the read(address,string,string)string ABI method.\n *\n * Fetch a metadata properties\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n read(params?: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['read(address,string,string)string'] | undefined]>\n\n /**\n * Calls the verifiedRead(address,string,byte[32],byte[32][],uint64,string)string ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n verifiedRead(params?: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | undefined]>\n\n /**\n * Calls the verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n verifiedMustRead(params?: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | undefined]>\n\n /**\n * Calls the addType(pay,string,uint8[])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n addType(params?: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['addType(pay,string,uint8[])void'] | undefined]>\n\n /**\n * Calls the rootCosts(string)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n rootCosts(params?: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['rootCosts(string)uint64'] | undefined]>\n\n /**\n * Calls the dataCosts(string,string,string)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n dataCosts(params?: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['dataCosts(string,string,string)uint64'] | undefined]>\n\n /**\n * Makes a clear_state call to an existing instance of the MetaMerkles smart contract.\n *\n * @param args The arguments for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): MetaMerklesComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): MetaMerklesComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<MetaMerklesComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<MetaMerklesComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<MetaMerklesComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<MetaMerklesComposerResults<TReturns>>\n}\nexport type MetaMerklesComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { MaybeSigner } from \"../types\";\nimport {\n MetaMerklesArgs,\n} from '../generated/MetaMerklesClient';\n\n// Re-export types from generated client for convenience\n// Note: TypesValue, RootKey, DataKey are exported from the generated client through index.ts\n\ntype ContractArgs = MetaMerklesArgs[\"obj\"];\n\n// ========== Schema Part Constants ==========\n\n/** Schema part type enum for building leaf schemas */\nexport enum SchemaPart {\n Uint8 = 10,\n Uint16 = 11,\n Uint32 = 12,\n Uint64 = 13,\n Uint128 = 14,\n Uint256 = 15,\n Uint512 = 16,\n Bytes4 = 20,\n Bytes8 = 21,\n Bytes16 = 22,\n Bytes32 = 23,\n Bytes64 = 24,\n Bytes128 = 25,\n Bytes256 = 26,\n Bytes512 = 27,\n String = 30,\n Address = 40,\n}\n\n/** Merkle tree type constants */\nexport enum MerkleTreeType {\n Unspecified = 0,\n Collection = 1,\n Trait = 2,\n Trade = 3,\n Whitelist = 4,\n Addresses = 5,\n}\n\n// ========== Global State Type ==========\n\nexport type MetaMerklesGlobalState = {\n /** The current types ID cursor */\n typesId: bigint;\n};\n\n// ========== Read Method Params ==========\n\nexport type GetRootParams = {\n /** The address of the root creator */\n address: string;\n /** The name of the merkle tree root */\n name: string;\n};\n\nexport type GetDataParams = {\n /** The address of the root creator */\n address: string;\n /** The name of the merkle tree root */\n name: string;\n /** The metadata key */\n key: string;\n};\n\nexport type GetTypeParams = {\n /** The type ID */\n id: bigint | number;\n};\n\nexport type RootCostsParams = Pick<ContractArgs['rootCosts(string)uint64'], 'name'>;\n\nexport type DataCostsParams = {\n /** The name of the merkle tree root */\n name: string;\n /** The metadata key */\n key: string;\n /** The metadata value */\n value: string;\n};\n\n// ========== Verify Method Params ==========\n\nexport type VerifyParams = {\n /** The address of the merkle tree root creator */\n address: string;\n /** The name alias of the root */\n name: string;\n /** The hashed leaf to verify (32 bytes) */\n leaf: Uint8Array;\n /** The merkle proof - array of 32-byte hashes */\n proof: Uint8Array[];\n /** The type check for the list's purpose (0 if caller doesn't care) */\n type: bigint | number;\n};\n\nexport type ReadParams = {\n /** The address of the merkle tree root creator */\n address: string;\n /** The name of the merkle tree root */\n name: string;\n /** The metadata key */\n key: string;\n};\n\nexport type VerifiedReadParams = VerifyParams & {\n /** The metadata key to read */\n key: string;\n};\n\n// ========== Write Method Params ==========\n\nexport type AddRootParams = MaybeSigner & {\n /** The name alias of the root being added (max 31 bytes) */\n name: string;\n /** The merkle tree root (32 bytes) */\n root: Uint8Array;\n /** The index of the tree type from box storage */\n type: bigint | number;\n};\n\nexport type UpdateRootParams = MaybeSigner & {\n /** The name of the merkle group data */\n name: string;\n /** The new 32 byte merkle tree root */\n newRoot: Uint8Array;\n};\n\nexport type DeleteRootParams = MaybeSigner & {\n /** The name of the merkle tree root */\n name: string;\n};\n\nexport type AddDataParams = MaybeSigner & {\n /** The name of the merkle tree root */\n name: string;\n /** The metadata key (max 15 bytes) */\n key: string;\n /** The metadata value (max 1024 bytes) */\n value: string;\n};\n\nexport type DeleteDataParams = MaybeSigner & {\n /** The name of the merkle tree root */\n name: string;\n /** The metadata key to delete */\n key: string;\n};\n\nexport type AddTypeParams = MaybeSigner & {\n /** Description of the tree type (max 800 bytes) */\n description: string;\n /** The schema list defining the leaf structure */\n schemaList: SchemaPart[];\n};\n\n","import { sha256 } from '@noble/hashes/sha256';\nimport { SchemaPart } from './types';\n\n/**\n * A merkle tree implementation compatible with the MetaMerkles contract.\n * Uses SHA256 for hashing (same as the on-chain contract).\n */\n\n// ========== Types ==========\n\nexport type HexString = `0x${string}`;\n\nexport interface MerkleTreeDump<T> {\n format: 'standard-v1';\n tree: string[];\n values: { value: T; treeIndex: number }[];\n leafEncoding: string;\n}\n\n// ========== Utility Functions ==========\n\n/**\n * Converts a Uint8Array to a hex string prefixed with 0x\n */\nexport function bytesToHex(bytes: Uint8Array): HexString {\n return `0x${Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')}`;\n}\n\n/**\n * Converts a hex string (with or without 0x prefix) to Uint8Array\n */\nexport function hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Compares two byte arrays for sorting (used in merkle tree hashing)\n */\nfunction compareBytes(a: Uint8Array, b: Uint8Array): number {\n const len = Math.min(a.length, b.length);\n for (let i = 0; i < len; i++) {\n if (a[i] !== b[i]) {\n return a[i] - b[i];\n }\n }\n return a.length - b.length;\n}\n\n/**\n * Hash two nodes together, sorting them first (sorted pair hashing)\n * This matches the contract's hash function behavior\n */\nfunction hashPair(a: Uint8Array, b: Uint8Array): Uint8Array {\n // Sort the pair - larger value second (same as contract: if BigUint(a) > BigUint(b) then sha256(b.concat(a)))\n if (compareBytes(a, b) > 0) {\n return sha256(new Uint8Array([...b, ...a]));\n }\n return sha256(new Uint8Array([...a, ...b]));\n}\n\n// ========== Leaf Encoding Functions ==========\n\n/**\n * Encodes a value as bytes according to a schema part type.\n */\nexport function encodeValue(value: unknown, schemaPart: SchemaPart): Uint8Array {\n switch (schemaPart) {\n case SchemaPart.Uint8: {\n const buf = new Uint8Array(1);\n buf[0] = Number(value) & 0xff;\n return buf;\n }\n case SchemaPart.Uint16: {\n const buf = new Uint8Array(2);\n const view = new DataView(buf.buffer);\n view.setUint16(0, Number(value), false);\n return buf;\n }\n case SchemaPart.Uint32: {\n const buf = new Uint8Array(4);\n const view = new DataView(buf.buffer);\n view.setUint32(0, Number(value), false);\n return buf;\n }\n case SchemaPart.Uint64: {\n const buf = new Uint8Array(8);\n const view = new DataView(buf.buffer);\n view.setBigUint64(0, BigInt(value as bigint | number), false);\n return buf;\n }\n case SchemaPart.Uint128: {\n const buf = new Uint8Array(16);\n let n = BigInt(value as bigint | number);\n for (let i = 15; i >= 0; i--) {\n buf[i] = Number(n & 0xffn);\n n >>= 8n;\n }\n return buf;\n }\n case SchemaPart.Uint256: {\n const buf = new Uint8Array(32);\n let n = BigInt(value as bigint | number);\n for (let i = 31; i >= 0; i--) {\n buf[i] = Number(n & 0xffn);\n n >>= 8n;\n }\n return buf;\n }\n case SchemaPart.Uint512: {\n const buf = new Uint8Array(64);\n let n = BigInt(value as bigint | number);\n for (let i = 63; i >= 0; i--) {\n buf[i] = Number(n & 0xffn);\n n >>= 8n;\n }\n return buf;\n }\n case SchemaPart.Bytes4:\n case SchemaPart.Bytes8:\n case SchemaPart.Bytes16:\n case SchemaPart.Bytes32:\n case SchemaPart.Bytes64:\n case SchemaPart.Bytes128:\n case SchemaPart.Bytes256:\n case SchemaPart.Bytes512: {\n const sizes: Record<number, number> = {\n [SchemaPart.Bytes4]: 4,\n [SchemaPart.Bytes8]: 8,\n [SchemaPart.Bytes16]: 16,\n [SchemaPart.Bytes32]: 32,\n [SchemaPart.Bytes64]: 64,\n [SchemaPart.Bytes128]: 128,\n [SchemaPart.Bytes256]: 256,\n [SchemaPart.Bytes512]: 512,\n };\n const size = sizes[schemaPart];\n if (value instanceof Uint8Array) {\n if (value.length !== size) {\n throw new Error(`Expected ${size} bytes, got ${value.length}`);\n }\n return value;\n }\n // Handle hex string\n const bytes = hexToBytes(value as string);\n if (bytes.length !== size) {\n throw new Error(`Expected ${size} bytes, got ${bytes.length}`);\n }\n return bytes;\n }\n case SchemaPart.String: {\n return new TextEncoder().encode(value as string);\n }\n case SchemaPart.Address: {\n // Algorand addresses are 32 bytes when decoded from base32\n const addr = value as string;\n // Use algosdk-style decoding or raw bytes\n if (addr.length === 58) {\n // Base32 encoded Algorand address - decode it\n // For simplicity, if you have algosdk available, use decodeAddress\n // Here we'll just use raw bytes if provided as Uint8Array\n throw new Error('Please provide address as Uint8Array (32 bytes) or use decodeAlgorandAddress helper');\n }\n if (value instanceof Uint8Array && value.length === 32) {\n return value;\n }\n throw new Error('Address must be 32 bytes');\n }\n default:\n throw new Error(`Unknown schema part: ${schemaPart}`);\n }\n}\n\n/**\n * Encodes a leaf value using the given schema.\n * For single values, pass a single-element array schema.\n * For tuples, pass values and schema arrays of matching length.\n */\nexport function encodeLeaf(values: unknown[], schema: SchemaPart[]): Uint8Array {\n if (values.length !== schema.length) {\n throw new Error(`Values length (${values.length}) must match schema length (${schema.length})`);\n }\n \n const encoded = values.map((v, i) => encodeValue(v, schema[i]));\n const totalLength = encoded.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(totalLength);\n \n let offset = 0;\n for (const arr of encoded) {\n result.set(arr, offset);\n offset += arr.length;\n }\n \n return result;\n}\n\n/**\n * Hashes a leaf value using SHA256.\n * The leaf is double-hashed: sha256(sha256(encoded_value))\n * This is the standard \"leaf prefix\" technique to prevent second preimage attacks.\n */\nexport function hashLeaf(encodedLeaf: Uint8Array): Uint8Array {\n // Double hash for leaf nodes (standard merkle tree practice)\n return sha256(sha256(encodedLeaf));\n}\n\n// ========== Merkle Tree Class ==========\n\n/**\n * A standard merkle tree implementation for use with MetaMerkles contract.\n * \n * @example\n * ```ts\n * // Create a tree of uint64 values\n * const tree = MerkleTree.of([1n, 2n, 3n], [SchemaPart.Uint64]);\n * \n * // Get the root to store on-chain\n * const root = tree.root;\n * \n * // Get proof for a specific value\n * const proof = tree.getProof(0); // proof for value at index 0\n * \n * // Verify a proof locally\n * const isValid = tree.verify(0, proof);\n * ```\n */\nexport class MerkleTree<T extends unknown[]> {\n private readonly tree: Uint8Array[];\n private readonly values: T[];\n private readonly schema: SchemaPart[];\n private readonly leafIndices: Map<number, number>; // value index -> tree index\n\n private constructor(values: T[], schema: SchemaPart[]) {\n this.values = values;\n this.schema = schema;\n this.leafIndices = new Map();\n this.tree = this.buildTree();\n }\n\n /**\n * Creates a new merkle tree from an array of values.\n * \n * For single-value leaves (e.g., uint64[]), pass each value as an array: [[1n], [2n], [3n]]\n * Or use the convenience form with a single-element schema.\n * \n * @param values - Array of leaf values (each value is an array matching the schema)\n * @param schema - The schema defining how to encode each leaf\n */\n static of<T extends unknown[]>(values: T[], schema: SchemaPart[]): MerkleTree<T> {\n if (values.length === 0) {\n throw new Error('Cannot create merkle tree with no values');\n }\n return new MerkleTree(values, schema);\n }\n\n /**\n * Creates a merkle tree for simple single-type values.\n * \n * @example\n * ```ts\n * // Tree of addresses\n * const tree = MerkleTree.ofSimple(addresses, SchemaPart.Address);\n * \n * // Tree of uint64 values\n * const tree = MerkleTree.ofSimple([1n, 2n, 3n], SchemaPart.Uint64);\n * ```\n */\n static ofSimple<T>(values: T[], schemaPart: SchemaPart): MerkleTree<[T]> {\n return MerkleTree.of(values.map(v => [v] as [T]), [schemaPart]);\n }\n\n /**\n * Loads a merkle tree from a dump (useful for persistence).\n */\n static load<T extends unknown[]>(dump: MerkleTreeDump<T>, schema: SchemaPart[]): MerkleTree<T> {\n const values = dump.values.map(v => v.value);\n return MerkleTree.of(values, schema);\n }\n\n private buildTree(): Uint8Array[] {\n const leaves = this.values.map(v => hashLeaf(encodeLeaf(v, this.schema)));\n \n // Handle power of 2 padding\n const n = leaves.length;\n const treeSize = 2 * n - 1;\n const tree: Uint8Array[] = new Array(treeSize);\n \n // Place leaves at the end of the tree array\n for (let i = 0; i < n; i++) {\n tree[treeSize - n + i] = leaves[i];\n this.leafIndices.set(i, treeSize - n + i);\n }\n \n // Build internal nodes from bottom up\n for (let i = treeSize - n - 1; i >= 0; i--) {\n const left = tree[2 * i + 1];\n const right = tree[2 * i + 2];\n tree[i] = right ? hashPair(left, right) : left;\n }\n \n return tree;\n }\n\n /**\n * The merkle root as a 32-byte Uint8Array.\n */\n get root(): Uint8Array {\n return this.tree[0];\n }\n\n /**\n * The merkle root as a hex string (0x prefixed).\n */\n get rootHex(): HexString {\n return bytesToHex(this.root);\n }\n\n /**\n * Number of leaves in the tree.\n */\n get length(): number {\n return this.values.length;\n }\n\n /**\n * Gets the proof for a leaf at the given index.\n * @param index - The index of the leaf value\n * @returns Array of 32-byte proof elements\n */\n getProof(index: number): Uint8Array[] {\n if (index < 0 || index >= this.values.length) {\n throw new Error(`Index ${index} out of bounds [0, ${this.values.length})`);\n }\n \n const proof: Uint8Array[] = [];\n let treeIndex = this.leafIndices.get(index)!;\n \n while (treeIndex > 0) {\n const siblingIndex = treeIndex % 2 === 0 ? treeIndex - 1 : treeIndex + 1;\n if (siblingIndex < this.tree.length && this.tree[siblingIndex]) {\n proof.push(this.tree[siblingIndex]);\n }\n treeIndex = Math.floor((treeIndex - 1) / 2);\n }\n \n return proof;\n }\n\n /**\n * Gets the proof for a leaf at the given index as hex strings.\n */\n getProofHex(index: number): HexString[] {\n return this.getProof(index).map(bytesToHex);\n }\n\n /**\n * Gets the leaf hash at the given index.\n */\n getLeafHash(index: number): Uint8Array {\n if (index < 0 || index >= this.values.length) {\n throw new Error(`Index ${index} out of bounds [0, ${this.values.length})`);\n }\n const treeIndex = this.leafIndices.get(index)!;\n return this.tree[treeIndex];\n }\n\n /**\n * Gets the leaf hash at the given index as a hex string.\n */\n getLeafHashHex(index: number): HexString {\n return bytesToHex(this.getLeafHash(index));\n }\n\n /**\n * Verifies a proof locally (without calling the contract).\n * @param index - The index of the leaf value to verify\n * @param proof - The proof array (optional, will be computed if not provided)\n * @returns true if the proof is valid\n */\n verify(index: number, proof?: Uint8Array[]): boolean {\n const actualProof = proof ?? this.getProof(index);\n let hash = this.getLeafHash(index);\n \n for (const sibling of actualProof) {\n hash = hashPair(hash, sibling);\n }\n \n return this.compareBytes(hash, this.root);\n }\n\n private compareBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }\n\n /**\n * Iterates over all values with their indices.\n */\n *entries(): Generator<[number, T]> {\n for (let i = 0; i < this.values.length; i++) {\n yield [i, this.values[i]];\n }\n }\n\n /**\n * Gets the value at the given index.\n */\n getValue(index: number): T {\n if (index < 0 || index >= this.values.length) {\n throw new Error(`Index ${index} out of bounds [0, ${this.values.length})`);\n }\n return this.values[index];\n }\n\n /**\n * Finds the index of a value in the tree.\n * @param predicate - Function to test each value\n * @returns The index of the first matching value, or -1 if not found\n */\n findIndex(predicate: (value: T, index: number) => boolean): number {\n for (let i = 0; i < this.values.length; i++) {\n if (predicate(this.values[i], i)) {\n return i;\n }\n }\n return -1;\n }\n\n /**\n * Gets proof for a value matching the predicate.\n */\n getProofFor(predicate: (value: T, index: number) => boolean): { index: number; proof: Uint8Array[] } | null {\n const index = this.findIndex(predicate);\n if (index === -1) return null;\n return { index, proof: this.getProof(index) };\n }\n\n /**\n * Renders the tree as a string for debugging.\n */\n render(): string {\n const lines: string[] = ['Merkle Tree:'];\n lines.push(` Root: ${this.rootHex}`);\n lines.push(` Leaves: ${this.values.length}`);\n lines.push(' Values:');\n for (let i = 0; i < this.values.length; i++) {\n lines.push(` [${i}] ${JSON.stringify(this.values[i])} -> ${this.getLeafHashHex(i)}`);\n }\n return lines.join('\\n');\n }\n\n /**\n * Dumps the tree to a JSON-serializable format.\n */\n dump(): MerkleTreeDump<T> {\n return {\n format: 'standard-v1',\n tree: this.tree.map(bytesToHex),\n values: this.values.map((value, i) => ({\n value,\n treeIndex: this.leafIndices.get(i)!,\n })),\n leafEncoding: this.schema.map(s => SchemaPart[s]).join(','),\n };\n }\n}\n\n// ========== Helper Functions for Common Use Cases ==========\n\n/**\n * Creates a merkle tree of Algorand addresses.\n * @param addresses - Array of Algorand addresses as Uint8Array (32 bytes each)\n */\nexport function createAddressTree(addresses: Uint8Array[]): MerkleTree<[Uint8Array]> {\n return MerkleTree.ofSimple(addresses, SchemaPart.Address);\n}\n\n/**\n * Creates a merkle tree of uint64 values.\n */\nexport function createUint64Tree(values: (bigint | number)[]): MerkleTree<[bigint | number]> {\n return MerkleTree.ofSimple(values, SchemaPart.Uint64);\n}\n\n/**\n * Creates a merkle tree of asset IDs (uint64).\n */\nexport function createAssetTree(assetIds: (bigint | number)[]): MerkleTree<[bigint | number]> {\n return createUint64Tree(assetIds);\n}\n\n/**\n * Verifies a merkle proof against a root.\n * @param root - The expected merkle root (32 bytes)\n * @param leaf - The leaf hash to verify (32 bytes)\n * @param proof - Array of proof elements (each 32 bytes)\n * @returns true if the proof is valid\n */\nexport function verifyProof(root: Uint8Array, leaf: Uint8Array, proof: Uint8Array[]): boolean {\n let hash = leaf;\n for (const sibling of proof) {\n hash = hashPair(hash, sibling);\n }\n \n if (root.length !== hash.length) return false;\n for (let i = 0; i < root.length; i++) {\n if (root[i] !== hash[i]) return false;\n }\n return true;\n}\n\n"]}
1
+ {"version":3,"sources":["/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-GVPFBZMF.js","../src/meta-merkles/index.ts","../src/generated/MetaMerklesClient.ts","../src/meta-merkles/types.ts","../src/meta-merkles/tree.ts"],"names":["SchemaPart","MerkleTreeType"],"mappings":"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","file":"/Users/kylebreeding/akita/akita-sc/projects/akita-sdk/dist/chunk-GVPFBZMF.js","sourcesContent":[null,"import { microAlgo } from \"@algorandfoundation/algokit-utils\";\nimport { BaseSDK } from \"../base\";\nimport { ENV_VAR_NAMES } from \"../config\";\nimport {\n MetaMerklesClient,\n MetaMerklesFactory,\n TypesValue,\n RootKey,\n} from '../generated/MetaMerklesClient';\nimport { NewContractSDKParams, MaybeSigner } from \"../types\";\nimport {\n AddRootParams,\n UpdateRootParams,\n DeleteRootParams,\n AddDataParams,\n DeleteDataParams,\n AddTypeParams,\n GetRootParams,\n GetDataParams,\n GetTypeParams,\n VerifyParams,\n ReadParams,\n VerifiedReadParams,\n RootCostsParams,\n DataCostsParams,\n MetaMerklesGlobalState,\n SchemaPart,\n} from \"./types\";\nimport { MerkleTree } from \"./tree\";\n\nexport * from \"./types\";\nexport * from \"./tree\";\n\n/** Cost in microAlgo for adding a new tree type */\nconst ADD_TYPE_COST = 100_000_000n;\n\n/**\n * SDK for interacting with the MetaMerkles contract.\n * Use this to manage merkle tree roots, metadata, and verify merkle proofs.\n */\nexport class MetaMerklesSDK extends BaseSDK<MetaMerklesClient> {\n\n constructor(params: NewContractSDKParams) {\n super({ factory: MetaMerklesFactory, ...params }, ENV_VAR_NAMES.META_MERKLES_APP_ID);\n }\n\n // ========== Read Methods ==========\n\n /**\n * Gets the current global state of the MetaMerkles contract.\n */\n async getState(): Promise<MetaMerklesGlobalState> {\n const state = await this.client.state.global.getAll();\n\n return {\n typesId: state.typesId ?? 0n,\n };\n }\n\n /**\n * Gets a merkle root by address and name.\n * @returns The 32-byte merkle root or undefined if not found\n */\n async getRoot({ address, name }: GetRootParams): Promise<Uint8Array | undefined> {\n const rootKey: RootKey = { address, name };\n try {\n return await this.client.state.box.roots.value(rootKey);\n } catch (error) {\n // Box doesn't exist - return undefined\n if (error instanceof Error && error.message.includes('box not found')) {\n return undefined;\n }\n throw error;\n }\n }\n\n /**\n * Checks if a merkle root exists.\n */\n async hasRoot({ address, name }: GetRootParams): Promise<boolean> {\n const root = await this.getRoot({ address, name });\n return root !== undefined;\n }\n\n /**\n * Gets all merkle roots as a map.\n */\n async getRoots(): Promise<Map<RootKey, Uint8Array>> {\n return await this.client.state.box.roots.getMap();\n }\n\n /**\n * Gets metadata associated with a merkle root.\n * @returns The metadata value or undefined if not found\n */\n async getData({ address, name, key }: GetDataParams): Promise<string | undefined> {\n // Truncate address to first 16 bytes for the data key\n const addressBytes = Uint8Array.from(Buffer.from(address.slice(0, 32), 'base64'));\n const truncatedAddress = addressBytes.slice(0, 16);\n\n try {\n return await this.client.state.box.data.value({\n address: truncatedAddress,\n name,\n key,\n });\n } catch (error) {\n // Box doesn't exist - return undefined\n if (error instanceof Error && error.message.includes('box not found')) {\n return undefined;\n }\n throw error;\n }\n }\n\n /**\n * Gets a tree type by ID.\n * @returns The type value (schema and description) or undefined if not found\n */\n async getType({ id }: GetTypeParams): Promise<TypesValue | undefined> {\n return await this.client.state.box.types.value(id);\n }\n\n /**\n * Gets all tree types as a map.\n */\n async getTypes(): Promise<Map<bigint, TypesValue>> {\n return await this.client.state.box.types.getMap();\n }\n\n /**\n * Gets the cost in microAlgo for creating a merkle root with the given name.\n */\n async rootCosts({ name }: RootCostsParams): Promise<bigint> {\n return await this.client.rootCosts({ args: { name } });\n }\n\n /**\n * Gets the cost in microAlgo for adding data with the given parameters.\n */\n async dataCosts({ name, key, value }: DataCostsParams): Promise<bigint> {\n return await this.client.dataCosts({ args: { name, key, value } });\n }\n\n // ========== Verify Methods ==========\n\n /**\n * Verifies a leaf is included in a merkle tree.\n * @returns true if the proof is valid\n */\n async verify({ address, name, leaf, proof, type }: VerifyParams): Promise<boolean> {\n // Convert proof array to format expected by contract\n const formattedProof = proof.map(p => {\n if (p.length !== 32) {\n throw new Error('Each proof element must be exactly 32 bytes');\n }\n return p;\n });\n\n const { return: result } = await this.client.send.verify({\n args: {\n address,\n name,\n leaf,\n proof: formattedProof,\n type,\n },\n });\n\n return result ?? false;\n }\n\n /**\n * Reads metadata from a merkle root.\n */\n async read({ address, name, key }: ReadParams): Promise<string> {\n return await this.client.read({\n args: { address, name, key },\n });\n }\n\n /**\n * Verifies inclusion and reads metadata if verified.\n * @returns The metadata value, or empty string if verification fails\n */\n async verifiedRead({ address, name, leaf, proof, type, key }: VerifiedReadParams): Promise<string> {\n const formattedProof = proof.map(p => {\n if (p.length !== 32) {\n throw new Error('Each proof element must be exactly 32 bytes');\n }\n return p;\n });\n\n const { return: result } = await this.client.send.verifiedRead({\n args: {\n address,\n name,\n leaf,\n proof: formattedProof,\n type,\n key,\n },\n });\n\n return result ?? '';\n }\n\n /**\n * Verifies inclusion and reads metadata. Throws if verification fails.\n * @returns The metadata value\n */\n async verifiedMustRead({ address, name, leaf, proof, type, key }: VerifiedReadParams): Promise<string> {\n const formattedProof = proof.map(p => {\n if (p.length !== 32) {\n throw new Error('Each proof element must be exactly 32 bytes');\n }\n return p;\n });\n\n const { return: result } = await this.client.send.verifiedMustRead({\n args: {\n address,\n name,\n leaf,\n proof: formattedProof,\n type,\n key,\n },\n });\n\n if (result === undefined) {\n throw new Error('Failed to read verified data');\n }\n\n return result;\n }\n\n // ========== Write Methods ==========\n\n /**\n * Adds a new merkle root.\n * @param name - The name alias of the root (max 31 bytes)\n * @param root - The 32-byte merkle tree root\n * @param type - The index of the tree type from box storage\n */\n async addRoot({ sender, signer, name, root, type }: AddRootParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n if (root.length !== 32) {\n throw new Error('Root must be exactly 32 bytes');\n }\n\n const cost = await this.rootCosts({ name });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.addRoot({\n ...sendParams,\n args: {\n payment,\n name,\n root,\n type,\n },\n });\n }\n\n /**\n * Updates an existing merkle root.\n * @param name - The name of the merkle group data\n * @param newRoot - The new 32-byte merkle tree root\n */\n async updateRoot({ sender, signer, name, newRoot }: UpdateRootParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n if (newRoot.length !== 32) {\n throw new Error('New root must be exactly 32 bytes');\n }\n\n await this.client.send.updateRoot({\n ...sendParams,\n args: {\n name,\n newRoot,\n },\n });\n }\n\n /**\n * Deletes a merkle root and returns the MBR to the sender.\n * Only the original creator can delete the root.\n */\n async deleteRoot({ sender, signer, name }: DeleteRootParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.deleteRoot({\n ...sendParams,\n // Extra fee for inner payment to return MBR\n extraFee: microAlgo(1000),\n args: { name },\n });\n }\n\n /**\n * Adds metadata to an existing merkle root.\n * @param name - The name of the merkle tree root\n * @param key - The metadata key (max 15 bytes, cannot start with \"l.\")\n * @param value - The metadata value (max 1024 bytes)\n */\n async addData({ sender, signer, name, key, value }: AddDataParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const cost = await this.dataCosts({ name, key, value });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(cost),\n receiver: this.client.appAddress,\n });\n\n await this.client.send.addData({\n ...sendParams,\n args: {\n payment,\n name,\n key,\n value,\n },\n });\n }\n\n /**\n * Deletes metadata from a merkle root and returns the MBR to the sender.\n * Only the original creator can delete data.\n */\n async deleteData({ sender, signer, name, key }: DeleteDataParams): Promise<void> {\n const sendParams = this.getSendParams({ sender, signer });\n\n await this.client.send.deleteData({\n ...sendParams,\n // Extra fee for inner payment to return MBR\n extraFee: microAlgo(1000),\n args: { name, key },\n });\n }\n\n /**\n * Adds a new tree type definition.\n * Requires a 100 ALGO payment.\n * @param description - Description of the tree type (max 800 bytes)\n * @param schemaList - The schema parts defining the leaf structure\n */\n async addType({ sender, signer, description, schemaList }: AddTypeParams): Promise<void> {\n const sendParams = this.getRequiredSendParams({ sender, signer });\n\n const payment = await this.client.algorand.createTransaction.payment({\n ...sendParams,\n amount: microAlgo(ADD_TYPE_COST),\n receiver: this.client.appAddress,\n });\n\n // Convert SchemaPart enum values to numbers for the contract\n const schemaListNumbers = schemaList.map(part => part as number);\n\n await this.client.send.addType({\n ...sendParams,\n args: {\n payment,\n description,\n schemaList: schemaListNumbers,\n },\n });\n }\n\n // ========== High-Level Merkle Tree Methods ==========\n\n /**\n * Adds a merkle root from a MerkleTree instance.\n * This is a convenience method that extracts the root from the tree.\n * \n * @example\n * ```ts\n * const tree = MerkleTree.ofSimple([1n, 2n, 3n], SchemaPart.Uint64);\n * await sdk.addRootFromTree({ name: 'my-tree', tree, type: 1n });\n * ```\n */\n async addRootFromTree<T extends unknown[]>({\n sender,\n signer,\n name,\n tree,\n type,\n }: MaybeSigner & {\n name: string;\n tree: MerkleTree<T>;\n type: bigint | number;\n }): Promise<void> {\n return this.addRoot({\n sender,\n signer,\n name,\n root: tree.root,\n type,\n });\n }\n\n /**\n * Verifies a leaf from a MerkleTree instance.\n * This is a convenience method that extracts the leaf hash and proof from the tree.\n * \n * @example\n * ```ts\n * const tree = MerkleTree.ofSimple([1n, 2n, 3n], SchemaPart.Uint64);\n * const isValid = await sdk.verifyFromTree({\n * address: creatorAddress,\n * name: 'my-tree',\n * tree,\n * index: 0, // verify the first leaf\n * type: 1n,\n * });\n * ```\n */\n async verifyFromTree<T extends unknown[]>({\n address,\n name,\n tree,\n index,\n type,\n }: {\n address: string;\n name: string;\n tree: MerkleTree<T>;\n index: number;\n type: bigint | number;\n }): Promise<boolean> {\n return this.verify({\n address,\n name,\n leaf: tree.getLeafHash(index),\n proof: tree.getProof(index),\n type,\n });\n }\n\n /**\n * Verifies and reads metadata using a MerkleTree instance.\n * \n * @example\n * ```ts\n * const tree = MerkleTree.ofSimple([1n, 2n, 3n], SchemaPart.Uint64);\n * const royalty = await sdk.verifiedReadFromTree({\n * address: creatorAddress,\n * name: 'my-tree',\n * tree,\n * index: 0,\n * type: 1n,\n * key: 'royalty',\n * });\n * ```\n */\n async verifiedReadFromTree<T extends unknown[]>({\n address,\n name,\n tree,\n index,\n type,\n key,\n }: {\n address: string;\n name: string;\n tree: MerkleTree<T>;\n index: number;\n type: bigint | number;\n key: string;\n }): Promise<string> {\n return this.verifiedRead({\n address,\n name,\n leaf: tree.getLeafHash(index),\n proof: tree.getProof(index),\n type,\n key,\n });\n }\n\n /**\n * Verifies inclusion and reads metadata using a MerkleTree instance.\n * Throws if verification fails.\n */\n async verifiedMustReadFromTree<T extends unknown[]>({\n address,\n name,\n tree,\n index,\n type,\n key,\n }: {\n address: string;\n name: string;\n tree: MerkleTree<T>;\n index: number;\n type: bigint | number;\n key: string;\n }): Promise<string> {\n return this.verifiedMustRead({\n address,\n name,\n leaf: tree.getLeafHash(index),\n proof: tree.getProof(index),\n type,\n key,\n });\n }\n}\n\n","/* eslint-disable */\n/**\n * This file was automatically generated by @algorandfoundation/algokit-client-generator.\n * DO NOT MODIFY IT BY HAND.\n * requires: @algorandfoundation/algokit-utils: ^7\n */\nimport { type AlgorandClient } from '@algorandfoundation/algokit-utils/types/algorand-client'\nimport { ABIReturn, AppReturn, SendAppTransactionResult } from '@algorandfoundation/algokit-utils/types/app'\nimport { Arc56Contract, getArc56ReturnValue, getABIStructFromABITuple } from '@algorandfoundation/algokit-utils/types/app-arc56'\nimport {\n AppClient as _AppClient,\n AppClientMethodCallParams,\n AppClientParams,\n AppClientBareCallParams,\n CallOnComplete,\n AppClientCompilationParams,\n ResolveAppClientByCreatorAndName,\n ResolveAppClientByNetwork,\n CloneAppClientParams,\n} from '@algorandfoundation/algokit-utils/types/app-client'\nimport { AppFactory as _AppFactory, AppFactoryAppClientParams, AppFactoryResolveAppClientByCreatorAndNameParams, AppFactoryDeployParams, AppFactoryParams, CreateSchema } from '@algorandfoundation/algokit-utils/types/app-factory'\nimport { TransactionComposer, AppCallMethodCall, AppMethodCallTransactionArgument, SimulateOptions, RawSimulateOptions, SkipSignaturesSimulateOptions } from '@algorandfoundation/algokit-utils/types/composer'\nimport { SendParams, SendSingleTransactionResult, SendAtomicTransactionComposerResults } from '@algorandfoundation/algokit-utils/types/transaction'\nimport { Address, encodeAddress, modelsv2, OnApplicationComplete, Transaction, TransactionSigner } from 'algosdk'\n\nexport const APP_SPEC: Arc56Contract = {\"name\":\"MetaMerkles\",\"structs\":{\"DataKey\":[{\"name\":\"address\",\"type\":\"byte[16]\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"RootKey\":[{\"name\":\"address\",\"type\":\"address\"},{\"name\":\"name\",\"type\":\"string\"}],\"TypesValue\":[{\"name\":\"schema\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}]},\"methods\":[{\"name\":\"create\",\"args\":[],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[\"NoOp\"],\"call\":[]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"addRoot\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name alias of the root being added\"},{\"type\":\"byte[32]\",\"name\":\"root\",\"desc\":\"a merkle tree root\"},{\"type\":\"uint64\",\"name\":\"type\",\"desc\":\"an index of the tree type enum from box storage\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Creates two boxes and adds a merkle root\\nusing a `RootKey` to the root box map and also a list type to the\\nmetadata attached to the root in the data box map\",\"events\":[],\"recommendations\":{}},{\"name\":\"deleteRoot\",\"args\":[{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the merkle tree root\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Deletes the merkle root from the root box map\",\"events\":[],\"recommendations\":{}},{\"name\":\"updateRoot\",\"args\":[{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the merkle group data\"},{\"type\":\"byte[32]\",\"name\":\"newRoot\",\"desc\":\"the new 32 byte merkle tree root\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Replaces the merkle root with another\",\"events\":[],\"recommendations\":{}},{\"name\":\"addData\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the merkle tree root\"},{\"type\":\"string\",\"name\":\"key\",\"desc\":\"the metadata key eg. `Royalty`\"},{\"type\":\"string\",\"name\":\"value\",\"desc\":\"the metadata value eg. `5` encoded as a bytestring for 5%\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Registers a key & value in the data box map that\\ncorresponds to a merkle root in the root box map\",\"events\":[],\"recommendations\":{}},{\"name\":\"deleteData\",\"args\":[{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the merkle tree root\"},{\"type\":\"string\",\"name\":\"key\",\"desc\":\"the metadata key you want to remove\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Deletes a metadata key & value pair from the data box map\",\"events\":[],\"recommendations\":{}},{\"name\":\"verify\",\"args\":[{\"type\":\"address\",\"name\":\"address\",\"desc\":\"the address of the merkle tree root creator\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"The name alias of the root\"},{\"type\":\"byte[32]\",\"name\":\"leaf\",\"desc\":\"The hashed leaf to verify\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"The merkle proof\"},{\"type\":\"uint64\",\"name\":\"type\",\"desc\":\"The type check for the lists purpose\"}],\"returns\":{\"type\":\"bool\",\"desc\":\"a boolean indicating whether the proof is valid\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"verify an inclusion in a double sha256 based merkle tree\",\"events\":[],\"recommendations\":{}},{\"name\":\"read\",\"args\":[{\"type\":\"address\",\"name\":\"address\",\"desc\":\"the address of the merkle tree root creator\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the merkle tree root\"},{\"type\":\"string\",\"name\":\"key\",\"desc\":\"the metadata key eg. `Royalty`\"}],\"returns\":{\"type\":\"string\",\"desc\":\"the value set eg. `5` encoded as a bytestring for 5%\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"desc\":\"Fetch a metadata properties\",\"events\":[],\"recommendations\":{}},{\"name\":\"verifiedRead\",\"args\":[{\"type\":\"address\",\"name\":\"address\",\"desc\":\"the address of the merkle tree root creator\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the root\"},{\"type\":\"byte[32]\",\"name\":\"leaf\",\"desc\":\"the leaf node to be verified\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the proof the hash is included\"},{\"type\":\"uint64\",\"name\":\"type\",\"desc\":\"the list type that helps contracts ensure\\nthe lists purpose isn't being misused ( 0 if the caller doesnt care )\"},{\"type\":\"string\",\"name\":\"key\",\"desc\":\"the metadata key eg. `Royalty`\"}],\"returns\":{\"type\":\"string\",\"desc\":\"a string of metadata\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Read metadata from box storage and verify the data provided is included\\nin the merkle tree given a sha256'd 32 byte merkle tree root & a proof\\nthats pre-computed off chain.\\n\\nverify an inclusion in a merkle tree\\n& read an associated key value pair\\n& check against the underlying data's schema\\n& check against the underlying data's list type or purpose\",\"events\":[],\"recommendations\":{}},{\"name\":\"verifiedMustRead\",\"args\":[{\"type\":\"address\",\"name\":\"address\",\"desc\":\"the address of the merkle tree root creator\"},{\"type\":\"string\",\"name\":\"name\",\"desc\":\"the name of the root\"},{\"type\":\"byte[32]\",\"name\":\"leaf\",\"desc\":\"the leaf node to be verified\"},{\"type\":\"byte[32][]\",\"name\":\"proof\",\"desc\":\"the proof the hash is included\"},{\"type\":\"uint64\",\"name\":\"type\",\"desc\":\"the list type that helps contracts ensure\\nthe lists purpose isn't being misused ( 0 if the caller doesnt care )\"},{\"type\":\"string\",\"name\":\"key\",\"desc\":\"the metadata key eg. `Royalty`\"}],\"returns\":{\"type\":\"string\",\"desc\":\"a string of metadata\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"desc\":\"Read metadata from box storage and verify the data provided is included\\nin the merkle tree given a sha256'd 32 byte merkle tree root & a proof\\nthats pre-computed off chain.\\n\\nverify an inclusion in a merkle tree\\n& read an associated key value pair\\n& check against the underlying data's schema\\n& check against the underlying data's list type or purpose\",\"events\":[],\"recommendations\":{}},{\"name\":\"addType\",\"args\":[{\"type\":\"pay\",\"name\":\"payment\"},{\"type\":\"string\",\"name\":\"description\"},{\"type\":\"uint8[]\",\"name\":\"schemaList\"}],\"returns\":{\"type\":\"void\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":false,\"events\":[],\"recommendations\":{}},{\"name\":\"rootCosts\",\"args\":[{\"type\":\"string\",\"name\":\"name\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}},{\"name\":\"dataCosts\",\"args\":[{\"type\":\"string\",\"name\":\"name\"},{\"type\":\"string\",\"name\":\"key\"},{\"type\":\"string\",\"name\":\"value\"}],\"returns\":{\"type\":\"uint64\"},\"actions\":{\"create\":[],\"call\":[\"NoOp\"]},\"readonly\":true,\"events\":[],\"recommendations\":{}}],\"arcs\":[22,28],\"networks\":{},\"state\":{\"schema\":{\"global\":{\"ints\":1,\"bytes\":0},\"local\":{\"ints\":0,\"bytes\":0}},\"keys\":{\"global\":{\"typesID\":{\"keyType\":\"AVMString\",\"valueType\":\"AVMUint64\",\"key\":\"dHlwZXNfaWQ=\"}},\"local\":{},\"box\":{}},\"maps\":{\"global\":{},\"local\":{},\"box\":{\"types\":{\"keyType\":\"uint64\",\"valueType\":\"TypesValue\",\"desc\":\"the types (intents) of merkle trees that exist\",\"prefix\":\"dA==\"},\"roots\":{\"keyType\":\"RootKey\",\"valueType\":\"AVMBytes\",\"desc\":\"the merkle roots we want to attach data to\",\"prefix\":\"cg==\"},\"data\":{\"keyType\":\"DataKey\",\"valueType\":\"AVMString\",\"desc\":\"rootData is the box map for managing the data associated with a group\",\"prefix\":\"ZA==\"}}}},\"bareActions\":{\"create\":[],\"call\":[]},\"sourceInfo\":{\"approval\":{\"sourceInfo\":[{\"pc\":[2142,2275,2347],\"errorMessage\":\"Box must have value\"},{\"pc\":[261],\"errorMessage\":\"Cannot add root with name longer than 31 bytes\"},{\"pc\":[364,728],\"errorMessage\":\"Invalid payment\"},{\"pc\":[1333],\"errorMessage\":\"Invalid payment amount\"},{\"pc\":[1323],\"errorMessage\":\"Invalid payment receiver\"},{\"pc\":[208],\"errorMessage\":\"Length must be 16\"},{\"pc\":[52],\"errorMessage\":\"OnCompletion must be NoOp\"},{\"pc\":[453,531],\"errorMessage\":\"a root with this name does not exist\"},{\"pc\":[1829],\"errorMessage\":\"check GlobalState exists\"},{\"pc\":[881],\"errorMessage\":\"data does not exist\"},{\"pc\":[1250],\"errorMessage\":\"failed to verify inclusion\"},{\"pc\":[1358,2239],\"errorMessage\":\"index access is out of bounds\"},{\"pc\":[965,1100,1209],\"errorMessage\":\"invalid number of bytes for (len+uint8[32][])\"},{\"pc\":[1315],\"errorMessage\":\"invalid number of bytes for (len+uint8[])\"},{\"pc\":[232,388,493,558,575,594,800,816,939,1013,1029,1071,1123,1183,1232,1291,1903,1929,1942,1955],\"errorMessage\":\"invalid number of bytes for (len+utf8[])\"},{\"pc\":[252,974,1109,1218],\"errorMessage\":\"invalid number of bytes for uint64\"},{\"pc\":[243,504,926,950,1000,1058,1085,1170,1194],\"errorMessage\":\"invalid number of bytes for uint8[32]\"},{\"pc\":[303,422,739,830,2084,2299],\"errorMessage\":\"invalid size\"},{\"pc\":[683],\"errorMessage\":\"l. is reserved for internals\"},{\"pc\":[640,1340],\"errorMessage\":\"max data length is 1024 bytes\"},{\"pc\":[633],\"errorMessage\":\"max key length is 32 bytes\"},{\"pc\":[692],\"errorMessage\":\"there must be a root to associate the data to\"},{\"pc\":[335],\"errorMessage\":\"this name is already in use\"},{\"pc\":[219,545,1278],\"errorMessage\":\"transaction type is pay\"},{\"pc\":[273],\"errorMessage\":\"tree type does not exist\"},{\"pc\":[345],\"errorMessage\":\"tree type key already exists for this root\"}],\"pcOffsetMethod\":\"none\"},\"clear\":{\"sourceInfo\":[],\"pcOffsetMethod\":\"none\"}},\"source\":{\"approval\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDIgMzIgNDAwCiAgICBieXRlY2Jsb2NrICIiIDB4MDAxNCAiZCIgMHgxNTFmN2M3NSAweDAwMjIgInIiICJ0eXBlc19pZCIgMHgwMDA2NmMyZTc0Nzk3MDY1IDB4MDY4MTAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6ODcKICAgIC8vIGV4cG9ydCBjbGFzcyBNZXRhTWVya2xlcyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gbXVzdCBiZSBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAxNgogICAgcHVzaGJ5dGVzcyAweGEyNGMwNjdjIDB4ZGYyODdhN2QgMHhjNmQzZDcwNCAweDQyZmM3MjAyIDB4MDZkMzg5MDQgMHgyYmYzY2M1YSAweDUwYzM2ZTQxIDB4MGNmMWI5Y2YgMHgxZmY3Yzc0YyAweDM5YzE3ZGVkIDB4NzJiMjU5ODEgMHg3NjgzY2QyNSAvLyBtZXRob2QgImFkZFJvb3QocGF5LHN0cmluZyxieXRlWzMyXSx1aW50NjQpdm9pZCIsIG1ldGhvZCAiZGVsZXRlUm9vdChzdHJpbmcpdm9pZCIsIG1ldGhvZCAidXBkYXRlUm9vdChzdHJpbmcsYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAiYWRkRGF0YShwYXksc3RyaW5nLHN0cmluZyxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiZGVsZXRlRGF0YShzdHJpbmcsc3RyaW5nKXZvaWQiLCBtZXRob2QgInZlcmlmeShhZGRyZXNzLHN0cmluZyxieXRlWzMyXSxieXRlWzMyXVtdLHVpbnQ2NClib29sIiwgbWV0aG9kICJyZWFkKGFkZHJlc3Msc3RyaW5nLHN0cmluZylzdHJpbmciLCBtZXRob2QgInZlcmlmaWVkUmVhZChhZGRyZXNzLHN0cmluZyxieXRlWzMyXSxieXRlWzMyXVtdLHVpbnQ2NCxzdHJpbmcpc3RyaW5nIiwgbWV0aG9kICJ2ZXJpZmllZE11c3RSZWFkKGFkZHJlc3Msc3RyaW5nLGJ5dGVbMzJdLGJ5dGVbMzJdW10sdWludDY0LHN0cmluZylzdHJpbmciLCBtZXRob2QgImFkZFR5cGUocGF5LHN0cmluZyx1aW50OFtdKXZvaWQiLCBtZXRob2QgInJvb3RDb3N0cyhzdHJpbmcpdWludDY0IiwgbWV0aG9kICJkYXRhQ29zdHMoc3RyaW5nLHN0cmluZyxzdHJpbmcpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggYWRkUm9vdCBkZWxldGVSb290IHVwZGF0ZVJvb3QgYWRkRGF0YSBkZWxldGVEYXRhIHZlcmlmeSByZWFkIHZlcmlmaWVkUmVhZCB2ZXJpZmllZE11c3RSZWFkIGFkZFR5cGUgcm9vdENvc3RzIGRhdGFDb3N0cwogICAgZXJyCgptYWluX2NyZWF0ZV9Ob09wQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyBleHBvcnQgY2xhc3MgTWV0YU1lcmtsZXMgZXh0ZW5kcyBDb250cmFjdCB7CiAgICBwdXNoYnl0ZXMgMHg0YzVjNjFiYSAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlX3JvdXRlQDE3CiAgICBlcnIKCm1haW5fY3JlYXRlX3JvdXRlQDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjk1CiAgICAvLyB0eXBlc0lEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogTWV0YU1lcmtsZXNHbG9iYWxTdGF0ZUtleVR5cGVzSUQgfSkKICAgIGJ5dGVjIDYgLy8gInR5cGVzX2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE0MAogICAgLy8gdGhpcy50eXBlc0lELnZhbHVlID0gMAogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTM4CiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9iYXNlLnRzOjpieXRlczE2KHY6IGJ5dGVzKSAtPiBieXRlczoKYnl0ZXMxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9iYXNlLnRzOjcKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBieXRlczE2KHY6IGJ5dGVzKSB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9iYXNlLnRzOjgKICAgIC8vIHJldHVybiB2LnNsaWNlKDAsIDE2KS50b0ZpeGVkKHsgbGVuZ3RoOiAxNiB9KQogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMQogICAgPj0KICAgIGludGNfMCAvLyAwCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGRpZyAyCiAgICA+PQogICAgcHVzaGludCAxNiAvLyAxNgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNiAvLyAxNgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSAxNgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy5hZGRSb290W3JvdXRpbmddKCkgLT4gdm9pZDoKYWRkUm9vdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNTUtMTYwCiAgICAvLyBhZGRSb290KAogICAgLy8gICBwYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIG5hbWU6IHN0cmluZywKICAgIC8vICAgcm9vdDogYnl0ZXM8MzI+LAogICAgLy8gICB0eXBlOiB1aW50NjQKICAgIC8vICk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNjEKICAgIC8vIGFzc2VydChCeXRlcyhuYW1lKS5sZW5ndGggPD0gMzEsICdDYW5ub3QgYWRkIHJvb3Qgd2l0aCBuYW1lIGxvbmdlciB0aGFuIDMxIGJ5dGVzJykKICAgIGRpZyAyCiAgICBsZW4KICAgIGR1cAogICAgcHVzaGludCAzMSAvLyAzMQogICAgPD0KICAgIGFzc2VydCAvLyBDYW5ub3QgYWRkIHJvb3Qgd2l0aCBuYW1lIGxvbmdlciB0aGFuIDMxIGJ5dGVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBhc3NlcnQodGhpcy50eXBlcyh0eXBlKS5leGlzdHMsIEVSUl9OT19UUkVFX1RZUEUpCiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTAwCiAgICAvLyB0eXBlcyA9IEJveE1hcDx1aW50NjQsIFR5cGVzVmFsdWU+KHsga2V5UHJlZml4OiBNZXRhTWVya2xlc0JveFByZWZpeFR5cGVzIH0pCiAgICBwdXNoYnl0ZXMgInQiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTYyCiAgICAvLyBhc3NlcnQodGhpcy50eXBlcyh0eXBlKS5leGlzdHMsIEVSUl9OT19UUkVFX1RZUEUpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB0cmVlIHR5cGUgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIGNvbnN0IHRydW5jYXRlZEFkZHJlc3MgPSBieXRlczE2KFR4bi5zZW5kZXIuYnl0ZXMpCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGJ5dGVzMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNjYKICAgIC8vIGNvbnN0IHJvb3RLZXk6IFJvb3RLZXkgPSB7IGFkZHJlc3M6IFR4bi5zZW5kZXIsIG5hbWUgfQogICAgdHhuIFNlbmRlcgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDUKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgNCAvLyAweDAwMjIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE2NwogICAgLy8gY29uc3QgdHlwZUtleTogRGF0YUtleSA9IHsgYWRkcmVzczogdHJ1bmNhdGVkQWRkcmVzcywgbmFtZSwga2V5OiB0cmVlVHlwZUtleSB9CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18xIC8vIDB4MDAxNAogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWMgNyAvLyAweDAwMDY2YzJlNzQ3OTcwNjUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gcm9vdHMgPSBCb3hNYXA8Um9vdEtleSwgYnl0ZXM8MzI+Pih7IGtleVByZWZpeDogTWV0YU1lcmtsZXNCb3hQcmVmaXhSb290cyB9KQogICAgYnl0ZWMgNSAvLyAiciIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTY5CiAgICAvLyBhc3NlcnQoIXRoaXMucm9vdHMocm9vdEtleSkuZXhpc3RzLCBFUlJfTkFNRV9UQUtFTikKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gdGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdXNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyBkYXRhID0gQm94TWFwPERhdGFLZXksIHN0cmluZz4oeyBrZXlQcmVmaXg6IE1ldGFNZXJrbGVzQm94UHJlZml4RGF0YSB9KQogICAgYnl0ZWNfMiAvLyAiZCIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBhc3NlcnQoIXRoaXMuZGF0YSh0eXBlS2V5KS5leGlzdHMsIEVSUl9UUkVFX1RZUEVfS0VZX0FMUkVBRFlfRVhJU1RTKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyB0cmVlIHR5cGUga2V5IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHJvb3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNzItMTc5CiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IHRoaXMucm9vdENvc3RzKG5hbWUpLAogICAgLy8gICB9LAogICAgLy8gICBFUlJfSU5WQUxJRF9QQVlNRU5UCiAgICAvLyApCiAgICBkaWcgNQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxNzUKICAgIC8vIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTcyLTE3OQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnJvb3RDb3N0cyhuYW1lKSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIHVuY292ZXIgNgogICAgZ3R4bnMgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTc2CiAgICAvLyBhbW91bnQ6IHRoaXMucm9vdENvc3RzKG5hbWUpLAogICAgdW5jb3ZlciA2CiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucm9vdENvc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTcyLTE3OQogICAgLy8gYXNzZXJ0TWF0Y2goCiAgICAvLyAgIHBheW1lbnQsCiAgICAvLyAgIHsKICAgIC8vICAgICByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnJvb3RDb3N0cyhuYW1lKSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTgxCiAgICAvLyB0aGlzLnJvb3RzKHJvb3RLZXkpLnZhbHVlID0gcm9vdAogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyB0aGlzLmRhdGEodHlwZUtleSkudmFsdWUgPSBTdHJpbmcoaXRvYih0eXBlKSkKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTU1LTE2MAogICAgLy8gYWRkUm9vdCgKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICBuYW1lOiBzdHJpbmcsCiAgICAvLyAgIHJvb3Q6IGJ5dGVzPDMyPiwKICAgIC8vICAgdHlwZTogdWludDY0CiAgICAvLyApOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLmRlbGV0ZVJvb3Rbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGVSb290OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gZGVsZXRlUm9vdChuYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE5MQogICAgLy8gY29uc3QgdHJ1bmNhdGVkQWRkcmVzcyA9IGJ5dGVzMTYoVHhuLnNlbmRlci5ieXRlcykKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgYnl0ZXMxNgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE5MwogICAgLy8gY29uc3Qgcm9vdEtleTogUm9vdEtleSA9IHsgYWRkcmVzczogVHhuLnNlbmRlciwgbmFtZSB9CiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWMgNCAvLyAweDAwMjIKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE5NAogICAgLy8gY29uc3QgdHlwZUtleTogRGF0YUtleSA9IHsgYWRkcmVzczogdHJ1bmNhdGVkQWRkcmVzcywgbmFtZSwga2V5OiB0cmVlVHlwZUtleSB9CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgdW5jb3ZlciAyCiAgICBieXRlY18xIC8vIDB4MDAxNAogICAgY29uY2F0CiAgICBkaWcgMgogICAgbGVuCiAgICBwdXNoaW50IDIwIC8vIDIwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgYnl0ZWMgNyAvLyAweDAwMDY2YzJlNzQ3OTcwNjUKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gcm9vdHMgPSBCb3hNYXA8Um9vdEtleSwgYnl0ZXM8MzI+Pih7IGtleVByZWZpeDogTWV0YU1lcmtsZXNCb3hQcmVmaXhSb290cyB9KQogICAgYnl0ZWMgNSAvLyAiciIKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBhc3NlcnQodGhpcy5yb290cyhyb290S2V5KS5leGlzdHMsIEVSUl9OT19OQU1FKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBhIHJvb3Qgd2l0aCB0aGlzIG5hbWUgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxOTgKICAgIC8vIHRoaXMucm9vdHMocm9vdEtleSkuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwNAogICAgLy8gZGF0YSA9IEJveE1hcDxEYXRhS2V5LCBzdHJpbmc+KHsga2V5UHJlZml4OiBNZXRhTWVya2xlc0JveFByZWZpeERhdGEgfSkKICAgIGJ5dGVjXzIgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxOTkKICAgIC8vIHRoaXMuZGF0YSh0eXBlS2V5KS5kZWxldGUoKQogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjAyLTIwNwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnJvb3RDb3N0cyhuYW1lKSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjA0CiAgICAvLyByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMDUKICAgIC8vIGFtb3VudDogdGhpcy5yb290Q29zdHMobmFtZSksCiAgICBzd2FwCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucm9vdENvc3RzCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIwMi0yMDYKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogdGhpcy5yb290Q29zdHMobmFtZSksCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjAyLTIwNwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICAvLyAgICAgYW1vdW50OiB0aGlzLnJvb3RDb3N0cyhuYW1lKSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gZGVsZXRlUm9vdChuYW1lOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnVwZGF0ZVJvb3Rbcm91dGluZ10oKSAtPiB2b2lkOgp1cGRhdGVSb290OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gdXBkYXRlUm9vdChuYW1lOiBzdHJpbmcsIG5ld1Jvb3Q6IGJ5dGVzPDMyPik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMTcKICAgIC8vIGNvbnN0IGtleTogUm9vdEtleSA9IHsgYWRkcmVzczogVHhuLnNlbmRlciwgbmFtZSB9CiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjIDQgLy8gMHgwMDIyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gcm9vdHMgPSBCb3hNYXA8Um9vdEtleSwgYnl0ZXM8MzI+Pih7IGtleVByZWZpeDogTWV0YU1lcmtsZXNCb3hQcmVmaXhSb290cyB9KQogICAgYnl0ZWMgNSAvLyAiciIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIxOAogICAgLy8gYXNzZXJ0KHRoaXMucm9vdHMoa2V5KS5leGlzdHMsIEVSUl9OT19OQU1FKQogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBhIHJvb3Qgd2l0aCB0aGlzIG5hbWUgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMTkKICAgIC8vIHRoaXMucm9vdHMoa2V5KS52YWx1ZSA9IG5ld1Jvb3QKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMTYKICAgIC8vIHVwZGF0ZVJvb3QobmFtZTogc3RyaW5nLCBuZXdSb290OiBieXRlczwzMj4pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLmFkZERhdGFbcm91dGluZ10oKSAtPiB2b2lkOgphZGREYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gYWRkRGF0YShwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIG5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gY29uc3Qgcm9vdEtleTogUm9vdEtleSA9IHsgYWRkcmVzczogVHhuLnNlbmRlciwgbmFtZSB9CiAgICB0eG4gU2VuZGVyCiAgICBkaWcgMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgNAogICAgc3dhcAogICAgYnl0ZWMgNCAvLyAweDAwMjIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBhc3NlcnQoa2V5Qnl0ZXMubGVuZ3RoIDw9IG1heERhdGFLZXlMZW5ndGgsIEVSUl9LRVlfVE9PX0xPTkcpCiAgICBzd2FwCiAgICBsZW4KICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBwdXNoaW50IDE1IC8vIDE1CiAgICA8PQogICAgYXNzZXJ0IC8vIG1heCBrZXkgbGVuZ3RoIGlzIDMyIGJ5dGVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjM2CiAgICAvLyBhc3NlcnQoQnl0ZXModmFsdWUpLmxlbmd0aCA8PSBtYXhEYXRhTGVuZ3RoLCBFUlJfREFUQV9UT09fTE9ORykKICAgIHN3YXAKICAgIGxlbgogICAgcHVzaGludCAxMDI0IC8vIDEwMjQKICAgIDw9CiAgICBhc3NlcnQgLy8gbWF4IGRhdGEgbGVuZ3RoIGlzIDEwMjQgYnl0ZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMzgKICAgIC8vIGtleUJ5dGVzLmxlbmd0aCA8IDIgfHwgIShrZXlCeXRlcy5zbGljZSgwLCAyKSA9PT0gQnl0ZXMocmVzZXJ2ZWREYXRhS2V5UHJlZml4KSksCiAgICBpbnRjXzIgLy8gMgogICAgPAogICAgYm56IGFkZERhdGFfYm9vbF90cnVlQDMKICAgIGludGNfMCAvLyAwCiAgICBkaWcgMQogICAgZHVwCiAgICBjb3ZlciAyCiAgICA+PQogICAgaW50Y18wIC8vIDAKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18yIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA2CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBwdXNoYnl0ZXMgImwuIgogICAgPT0KICAgIGJueiBhZGREYXRhX2Jvb2xfZmFsc2VANAoKYWRkRGF0YV9ib29sX3RydWVAMzoKICAgIGludGNfMSAvLyAxCgphZGREYXRhX2Jvb2xfbWVyZ2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyMzctMjQwCiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIGtleUJ5dGVzLmxlbmd0aCA8IDIgfHwgIShrZXlCeXRlcy5zbGljZSgwLCAyKSA9PT0gQnl0ZXMocmVzZXJ2ZWREYXRhS2V5UHJlZml4KSksCiAgICAvLyAgIEVSUl9SRVNFUlZFRF9LRVlfUFJFRklYCiAgICAvLyApCiAgICBhc3NlcnQgLy8gbC4gaXMgcmVzZXJ2ZWQgZm9yIGludGVybmFscwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwMgogICAgLy8gcm9vdHMgPSBCb3hNYXA8Um9vdEtleSwgYnl0ZXM8MzI+Pih7IGtleVByZWZpeDogTWV0YU1lcmtsZXNCb3hQcmVmaXhSb290cyB9KQogICAgYnl0ZWMgNSAvLyAiciIKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNDEKICAgIC8vIGFzc2VydCh0aGlzLnJvb3RzKHJvb3RLZXkpLmV4aXN0cywgRVJSX05PX1JPT1RfRk9SX0RBVEEpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyB0aGVyZSBtdXN0IGJlIGEgcm9vdCB0byBhc3NvY2lhdGUgdGhlIGRhdGEgdG8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNDMKICAgIC8vIGNvbnN0IGNvc3RzID0gdGhpcy5tYnIoJycsICcnLCBuYW1lLCBrZXksIHZhbHVlKQogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwCiAgICBkaWcgNwogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgZGlnIDgKICAgIGR1cAogICAgY292ZXIgNgogICAgY2FsbHN1YiBtYnIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNDUtMjUyCiAgICAvLyBhc3NlcnRNYXRjaCgKICAgIC8vICAgcGF5bWVudCwKICAgIC8vICAgewogICAgLy8gICAgIHJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IGNvc3RzLmRhdGEsCiAgICAvLyAgIH0sCiAgICAvLyAgIEVSUl9JTlZBTElEX1BBWU1FTlQKICAgIC8vICkKICAgIGRpZyA5CiAgICBkdXAKICAgIGd0eG5zIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjQ4CiAgICAvLyByZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI0NS0yNTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogY29zdHMuZGF0YSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI0OQogICAgLy8gYW1vdW50OiBjb3N0cy5kYXRhLAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI0NS0yNTIKICAgIC8vIGFzc2VydE1hdGNoKAogICAgLy8gICBwYXltZW50LAogICAgLy8gICB7CiAgICAvLyAgICAgcmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFtb3VudDogY29zdHMuZGF0YSwKICAgIC8vICAgfSwKICAgIC8vICAgRVJSX0lOVkFMSURfUEFZTUVOVAogICAgLy8gKQogICAgPT0KICAgICYmCiAgICBhc3NlcnQgLy8gSW52YWxpZCBwYXltZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjU0CiAgICAvLyBjb25zdCB0cnVuY2F0ZWRBZGRyZXNzID0gYnl0ZXMxNihUeG4uc2VuZGVyLmJ5dGVzKQogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBieXRlczE2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjU1CiAgICAvLyBjb25zdCBkYXRhS2V5OiBEYXRhS2V5ID0geyBhZGRyZXNzOiB0cnVuY2F0ZWRBZGRyZXNzLCBuYW1lLCBrZXkgfQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICBieXRlY18xIC8vIDB4MDAxNAogICAgY29uY2F0CiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgICsKICAgIGRpZyA1CiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwNAogICAgLy8gZGF0YSA9IEJveE1hcDxEYXRhS2V5LCBzdHJpbmc+KHsga2V5UHJlZml4OiBNZXRhTWVya2xlc0JveFByZWZpeERhdGEgfSkKICAgIGJ5dGVjXzIgLy8gImQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNTcKICAgIC8vIHRoaXMuZGF0YShkYXRhS2V5KS52YWx1ZSA9IHZhbHVlCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjIzMQogICAgLy8gYWRkRGF0YShwYXltZW50OiBndHhuLlBheW1lbnRUeG4sIG5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmFkZERhdGFfYm9vbF9mYWxzZUA0OgogICAgaW50Y18wIC8vIDAKICAgIGIgYWRkRGF0YV9ib29sX21lcmdlQDUKCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLmRlbGV0ZURhdGFbcm91dGluZ10oKSAtPiB2b2lkOgpkZWxldGVEYXRhOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gZGVsZXRlRGF0YShuYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI2NwogICAgLy8gY29uc3QgdHJ1bmNhdGVkQWRkcmVzcyA9IGJ5dGVzMTYoVHhuLnNlbmRlci5ieXRlcykKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgYnl0ZXMxNgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI2OAogICAgLy8gY29uc3QgZGF0YUtleTogRGF0YUtleSA9IHsgYWRkcmVzczogdHJ1bmNhdGVkQWRkcmVzcywgbmFtZSwga2V5IH0KICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGJ5dGVjXzEgLy8gMHgwMDE0CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgICsKICAgIGRpZyAzCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMDQKICAgIC8vIGRhdGEgPSBCb3hNYXA8RGF0YUtleSwgc3RyaW5nPih7IGtleVByZWZpeDogTWV0YU1lcmtsZXNCb3hQcmVmaXhEYXRhIH0pCiAgICBieXRlY18yIC8vICJkIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MjcwCiAgICAvLyBhc3NlcnQodGhpcy5kYXRhKGRhdGFLZXkpLmV4aXN0cywgRVJSX05PX0RBVEEpCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIGRhdGEgZG9lcyBub3QgZXhpc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNzMKICAgIC8vIGNvbnN0IGNvc3RzID0gdGhpcy5tYnIoJycsICcnLCBuYW1lLCBrZXksIHRoaXMuZGF0YShkYXRhS2V5KS52YWx1ZSkKICAgIGR1cAogICAgYm94X2dldAogICAgcG9wCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgbWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Mjc1CiAgICAvLyB0aGlzLmRhdGEoZGF0YUtleSkuZGVsZXRlKCkKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI3Ny0yODIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogY29zdHMuZGF0YSwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Mjc5CiAgICAvLyByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyODAKICAgIC8vIGFtb3VudDogY29zdHMuZGF0YSwKICAgIHN3YXAKICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgIGV4dHJhY3RfdWludDY0CiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI3Ny0yODEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFtb3VudDogY29zdHMuZGF0YSwKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNzctMjgyCiAgICAvLyBpdHhuCiAgICAvLyAgIC5wYXltZW50KHsKICAgIC8vICAgICByZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhbW91bnQ6IGNvc3RzLmRhdGEsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIGRlbGV0ZURhdGEobmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5W3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZ5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gdmVyaWZ5KGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywgbGVhZjogTGVhZiwgcHJvb2Y6IFByb29mLCB0eXBlOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4WzMyXVtdKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOCAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnkKICAgIHBvcAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucmVhZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlYWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzI5CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy5yZWFkCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZpZWRSZWFkW3JvdXRpbmddKCkgLT4gdm9pZDoKdmVyaWZpZWRSZWFkOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gdmVyaWZpZWRSZWFkKGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywgbGVhZjogTGVhZiwgcHJvb2Y6IFByb29mLCB0eXBlOiB1aW50NjQsIGtleTogc3RyaW5nKTogc3RyaW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ4WzMyXQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAzMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdWludDhbMzJdW10pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCA4IC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIGV4dHJhY3QgMiAwCiAgICBjb3ZlciA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzU1CiAgICAvLyBjb25zdCB2ZXJpZmllZCA9IHRoaXMudmVyaWZ5KGFkZHJlc3MsIG5hbWUsIGxlYWYsIHByb29mLCB0eXBlKQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzU2CiAgICAvLyBpZiAoIXZlcmlmaWVkKSB7CiAgICBibnogdmVyaWZpZWRSZWFkX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM1NwogICAgLy8gcmV0dXJuICcnCiAgICBieXRlY18wIC8vICIiCgp2ZXJpZmllZFJlYWRfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmaWVkUmVhZEA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gdmVyaWZpZWRSZWFkKGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywgbGVhZjogTGVhZiwgcHJvb2Y6IFByb29mLCB0eXBlOiB1aW50NjQsIGtleTogc3RyaW5nKTogc3RyaW5nIHsKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgp2ZXJpZmllZFJlYWRfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM1OQogICAgLy8gcmV0dXJuIHRoaXMucmVhZChhZGRyZXNzLCBuYW1lLCBrZXkpCiAgICBkaWcgMgogICAgZGlnIDIKICAgIGRpZyAyCiAgICBjYWxsc3ViIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucmVhZAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM1NAogICAgLy8gdmVyaWZpZWRSZWFkKGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywgbGVhZjogTGVhZiwgcHJvb2Y6IFByb29mLCB0eXBlOiB1aW50NjQsIGtleTogc3RyaW5nKTogc3RyaW5nIHsKICAgIGIgdmVyaWZpZWRSZWFkX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZmllZFJlYWRANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZpZWRNdXN0UmVhZFtyb3V0aW5nXSgpIC0+IHZvaWQ6CnZlcmlmaWVkTXVzdFJlYWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzgxLTM4OAogICAgLy8gdmVyaWZpZWRNdXN0UmVhZCgKICAgIC8vICAgYWRkcmVzczogQWNjb3VudCwKICAgIC8vICAgbmFtZTogc3RyaW5nLAogICAgLy8gICBsZWFmOiBMZWFmLAogICAgLy8gICBwcm9vZjogUHJvb2YsCiAgICAvLyAgIHR5cGU6IHVpbnQ2NCwKICAgIC8vICAga2V5OiBzdHJpbmcKICAgIC8vICk6IHN0cmluZyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50OFszMl0KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDhbMzJdCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18zIC8vIDMyCiAgICAqCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1aW50OFszMl1bXSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgdWludDY0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozODkKICAgIC8vIGFzc2VydCh0aGlzLnZlcmlmeShhZGRyZXNzLCBuYW1lLCBsZWFmLCBwcm9vZiwgdHlwZSksIEVSUl9GQUlMRURfVE9fVkVSSUZZX0lOQ0xVU0lPTikKICAgIGRpZyA1CiAgICBkaWcgNQogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeQogICAgcG9wCiAgICBhc3NlcnQgLy8gZmFpbGVkIHRvIHZlcmlmeSBpbmNsdXNpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozOTAKICAgIC8vIHJldHVybiB0aGlzLnJlYWQoYWRkcmVzcywgbmFtZSwga2V5KQogICAgY2FsbHN1YiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnJlYWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozODEtMzg4CiAgICAvLyB2ZXJpZmllZE11c3RSZWFkKAogICAgLy8gICBhZGRyZXNzOiBBY2NvdW50LAogICAgLy8gICBuYW1lOiBzdHJpbmcsCiAgICAvLyAgIGxlYWY6IExlYWYsCiAgICAvLyAgIHByb29mOiBQcm9vZiwKICAgIC8vICAgdHlwZTogdWludDY0LAogICAgLy8gICBrZXk6IHN0cmluZwogICAgLy8gKTogc3RyaW5nIHsKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy5hZGRUeXBlW3JvdXRpbmddKCkgLT4gdm9pZDoKYWRkVHlwZToKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzkzCiAgICAvLyBhZGRUeXBlKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgZGVzY3JpcHRpb246IHN0cmluZywgc2NoZW1hTGlzdDogU2NoZW1hTGlzdCk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICBjb3ZlciA0CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3VpbnQ4W10pCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Mzk0CiAgICAvLyBhc3NlcnQocGF5bWVudC5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIEVSUl9JTlZBTElEX1BBWU1FTlRfUkVDRUlWRVIpCiAgICBkaWcgMQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgcGF5bWVudCByZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM5NQogICAgLy8gYXNzZXJ0KHBheW1lbnQuYW1vdW50ID09PSAxMDBfMDAwXzAwMCwgRVJSX0lOVkFMSURfUEFZTUVOVF9BTU9VTlQpCiAgICBzd2FwCiAgICBndHhucyBBbW91bnQKICAgIHB1c2hpbnQgMTAwMDAwMDAwIC8vIDEwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydCAvLyBJbnZhbGlkIHBheW1lbnQgYW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Mzk2CiAgICAvLyBhc3NlcnQoQnl0ZXMoZGVzY3JpcHRpb24pLmxlbmd0aCA8PSA4MDAsIEVSUl9EQVRBX1RPT19MT05HKQogICAgbGVuCiAgICBkdXAKICAgIHB1c2hpbnQgODAwIC8vIDgwMAogICAgPD0KICAgIGFzc2VydCAvLyBtYXggZGF0YSBsZW5ndGggaXMgMTAyNCBieXRlcwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjM5OAogICAgLy8gbGV0IHNjaGVtYTogc3RyaW5nID0gJycKICAgIGJ5dGVjXzAgLy8gIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozOTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBzY2hlbWFMaXN0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAoKYWRkVHlwZV93aGlsZV90b3BAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozOTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBzY2hlbWFMaXN0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIGRpZyA0CiAgICA8CiAgICBieiBhZGRUeXBlX2FmdGVyX3doaWxlQDU5CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDAwCiAgICAvLyBzd2l0Y2ggKHNjaGVtYUxpc3RbaV0pIHsKICAgIGRpZyA0CiAgICBleHRyYWN0IDIgMAogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGR1cAogICAgYnVyeSA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDAxCiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50ODoKICAgIHB1c2hieXRlcyAweDBhCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQwMS00MDMKICAgIC8vIGNhc2UgU2NoZW1hUGFydFVpbnQ4OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQ4U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQwMgogICAgLy8gc2NoZW1hICs9IFNjaGVtYVBhcnRVaW50OFN0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAidWludDgiCiAgICBjb25jYXQKICAgIGJ1cnkgMgoKYWRkVHlwZV9ibG9ja0A1NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NTQKICAgIC8vIGlmIChzY2hlbWFMaXN0Lmxlbmd0aCA+IDAgJiYgaSAhPT0gc2NoZW1hTGlzdC5sZW5ndGggLSAxKSB7CiAgICBkaWcgMwogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDU4CiAgICBkaWcgMwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGRpZyAxCiAgICAhPQogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDU4CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDU1CiAgICAvLyBzY2hlbWEgKz0gJywnCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICIsIgogICAgY29uY2F0CiAgICBidXJ5IDIKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUA1ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozOTkKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBzY2hlbWFMaXN0Lmxlbmd0aDsgaSArPSAxKSB7CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBidXJ5IDEKICAgIGIgYWRkVHlwZV93aGlsZV90b3BAMgoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDA0CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50MTY6CiAgICBkaWcgNgogICAgcHVzaGJ5dGVzIDB4MGIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDA0LTQwNgogICAgLy8gY2FzZSBTY2hlbWFQYXJ0VWludDE2OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQxNlN0cmluZwogICAgLy8gICBicmVhawogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MDUKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0VWludDE2U3RyaW5nCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICJ1aW50MTYiCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQwNgogICAgLy8gYnJlYWsKICAgIGIgYWRkVHlwZV9ibG9ja0A1NQoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDA3CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50MzI6CiAgICBkaWcgNgogICAgcHVzaGJ5dGVzIDB4MGMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDA3LTQwOQogICAgLy8gY2FzZSBTY2hlbWFQYXJ0VWludDMyOgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQzMlN0cmluZwogICAgLy8gICBicmVhawogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDA4CiAgICAvLyBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQzMlN0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAidWludDMyIgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MDkKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTAKICAgIC8vIGNhc2UgU2NoZW1hUGFydFVpbnQ2NDoKICAgIGRpZyA2CiAgICBwdXNoYnl0ZXMgMHgwZAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTAtNDEyCiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50NjQ6CiAgICAvLyAgIHNjaGVtYSArPSBTY2hlbWFQYXJ0VWludDY0U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTEKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0VWludDY0U3RyaW5nCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICJ1aW50NjQiCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQxMgogICAgLy8gYnJlYWsKICAgIGIgYWRkVHlwZV9ibG9ja0A1NQoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQxMwogICAgLy8gY2FzZSBTY2hlbWFQYXJ0VWludDEyODoKICAgIGRpZyA2CiAgICBwdXNoYnl0ZXMgMHgwZQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTMtNDE1CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50MTI4OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQxMjhTdHJpbmcKICAgIC8vICAgYnJlYWsKICAgIGJ6IGFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAxOAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQxNAogICAgLy8gc2NoZW1hICs9IFNjaGVtYVBhcnRVaW50MTI4U3RyaW5nCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICJ1aW50MTI4IgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTUKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAxODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTYKICAgIC8vIGNhc2UgU2NoZW1hUGFydFVpbnQyNTY6CiAgICBkaWcgNgogICAgcHVzaGJ5dGVzIDB4MGYKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDE2LTQxOAogICAgLy8gY2FzZSBTY2hlbWFQYXJ0VWludDI1NjoKICAgIC8vICAgc2NoZW1hICs9IFNjaGVtYVBhcnRVaW50MjU2U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMjEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MTcKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0VWludDI1NlN0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAidWludDI1NiIKICAgIGNvbmNhdAogICAgYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDE4CiAgICAvLyBicmVhawogICAgYiBhZGRUeXBlX2Jsb2NrQDU1CgphZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDE5CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRVaW50NTEyOgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDEwCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQxOS00MjEKICAgIC8vIGNhc2UgU2NoZW1hUGFydFVpbnQ1MTI6CiAgICAvLyAgIHNjaGVtYSArPSBTY2hlbWFQYXJ0VWludDUxMlN0cmluZwogICAgLy8gICBicmVhawogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDIwCiAgICAvLyBzY2hlbWEgKz0gU2NoZW1hUGFydFVpbnQ1MTJTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgInVpbnQ1MTIiCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQyMQogICAgLy8gYnJlYWsKICAgIGIgYWRkVHlwZV9ibG9ja0A1NQoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQyMgogICAgLy8gY2FzZSBTY2hlbWFQYXJ0Qnl0ZXM0OgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDE0CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQyMi00MjQKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzNDoKICAgIC8vICAgc2NoZW1hICs9IFNjaGVtYVBhcnRCeXRlczRTdHJpbmcKICAgIC8vICAgYnJlYWsKICAgIGJ6IGFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAyNwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gc2NoZW1hICs9IFNjaGVtYVBhcnRCeXRlczRTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImJ5dGVzNCIKICAgIGNvbmNhdAogICAgYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDI0CiAgICAvLyBicmVhawogICAgYiBhZGRUeXBlX2Jsb2NrQDU1CgphZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDI1CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRCeXRlczg6CiAgICBkaWcgNgogICAgcHVzaGJ5dGVzIDB4MTUKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDI1LTQyNwogICAgLy8gY2FzZSBTY2hlbWFQYXJ0Qnl0ZXM4OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzOFN0cmluZwogICAgLy8gICBicmVhawogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDI2CiAgICAvLyBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzOFN0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAiYnl0ZXM4IgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MjcKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MjgKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMTY6CiAgICBkaWcgNgogICAgcHVzaGJ5dGVzIDB4MTYKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDI4LTQzMAogICAgLy8gY2FzZSBTY2hlbWFQYXJ0Qnl0ZXMxNjoKICAgIC8vICAgc2NoZW1hICs9IFNjaGVtYVBhcnRCeXRlczE2U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MjkKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0Qnl0ZXMxNlN0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAiYnl0ZXMxNiIKICAgIGNvbmNhdAogICAgYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDMwCiAgICAvLyBicmVhawogICAgYiBhZGRUeXBlX2Jsb2NrQDU1CgphZGRUeXBlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDMxCiAgICAvLyBjYXNlIFNjaGVtYVBhcnRCeXRlczMyOgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDE3CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQzMS00MzMKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMzI6CiAgICAvLyAgIHNjaGVtYSArPSBTY2hlbWFQYXJ0Qnl0ZXMzMlN0cmluZwogICAgLy8gICBicmVhawogICAgYnogYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDM2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDMyCiAgICAvLyBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzMzJTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImJ5dGVzMzIiCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQzMwogICAgLy8gYnJlYWsKICAgIGIgYWRkVHlwZV9ibG9ja0A1NQoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDM2OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQzNAogICAgLy8gY2FzZSBTY2hlbWFQYXJ0Qnl0ZXM2NDoKICAgIGRpZyA2CiAgICBwdXNoYnl0ZXMgMHgxOAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MzQtNDM2CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRCeXRlczY0OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzNjRTdHJpbmcKICAgIC8vICAgYnJlYWsKICAgIGJ6IGFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAzOQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQzNQogICAgLy8gc2NoZW1hICs9IFNjaGVtYVBhcnRCeXRlczY0U3RyaW5nCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICJieXRlczY0IgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MzYKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUAzOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MzcKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMTI4OgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDE5CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQzNy00MzkKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMTI4OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzMTI4U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VANDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MzgKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0Qnl0ZXMxMjhTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImJ5dGVzMTI4IgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0MzkKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUA0MjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDAKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMjU2OgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDFhCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ0MC00NDIKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzMjU2OgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzMjU2U3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VANDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDEKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0Qnl0ZXMyNTZTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImJ5dGVzMjU2IgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDIKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUA0NToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDMKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzNTEyOgogICAgZGlnIDYKICAgIHB1c2hieXRlcyAweDFiCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ0My00NDUKICAgIC8vIGNhc2UgU2NoZW1hUGFydEJ5dGVzNTEyOgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEJ5dGVzNTEyU3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VANDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDQKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0Qnl0ZXM1MTJTdHJpbmcKICAgIGRpZyAxCiAgICBwdXNoYnl0ZXMgImJ5dGVzNTEyIgogICAgY29uY2F0CiAgICBidXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDUKICAgIC8vIGJyZWFrCiAgICBiIGFkZFR5cGVfYmxvY2tANTUKCmFkZFR5cGVfYWZ0ZXJfaWZfZWxzZUA0ODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDYKICAgIC8vIGNhc2UgU2NoZW1hUGFydFN0cmluZzoKICAgIGRpZyA2CiAgICBwdXNoYnl0ZXMgMHgxZQogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDYtNDQ4CiAgICAvLyBjYXNlIFNjaGVtYVBhcnRTdHJpbmc6CiAgICAvLyAgIHNjaGVtYSArPSBTY2hlbWFQYXJ0U3RyaW5nU3RyaW5nCiAgICAvLyAgIGJyZWFrCiAgICBieiBhZGRUeXBlX2FmdGVyX2lmX2Vsc2VANTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDcKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0U3RyaW5nU3RyaW5nCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzICJzdHJpbmciCiAgICBjb25jYXQKICAgIGJ1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ0OAogICAgLy8gYnJlYWsKICAgIGIgYWRkVHlwZV9ibG9ja0A1NQoKYWRkVHlwZV9hZnRlcl9pZl9lbHNlQDUxOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ0OQogICAgLy8gY2FzZSBTY2hlbWFQYXJ0QWRkcmVzczoKICAgIGRpZyA2CiAgICBwdXNoYnl0ZXMgMHgyOAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NDktNDUxCiAgICAvLyBjYXNlIFNjaGVtYVBhcnRBZGRyZXNzOgogICAgLy8gICBzY2hlbWEgKz0gU2NoZW1hUGFydEFkZHJlc3NTdHJpbmcKICAgIC8vICAgYnJlYWsKICAgIGJ6IGFkZFR5cGVfYmxvY2tANTUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NTAKICAgIC8vIHNjaGVtYSArPSBTY2hlbWFQYXJ0QWRkcmVzc1N0cmluZwogICAgZGlnIDEKICAgIHB1c2hieXRlcyAiYWRkcmVzcyIKICAgIGNvbmNhdAogICAgYnVyeSAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDUxCiAgICAvLyBicmVhawogICAgYiBhZGRUeXBlX2Jsb2NrQDU1CgphZGRUeXBlX2FmdGVyX3doaWxlQDU5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEyNAogICAgLy8gY29uc3QgaWQgPSB0aGlzLnR5cGVzSUQudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6OTUKICAgIC8vIHR5cGVzSUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBNZXRhTWVya2xlc0dsb2JhbFN0YXRlS2V5VHlwZXNJRCB9KQogICAgYnl0ZWMgNiAvLyAidHlwZXNfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTI0CiAgICAvLyBjb25zdCBpZCA9IHRoaXMudHlwZXNJRC52YWx1ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIHRoaXMudHlwZXNJRC52YWx1ZSArPSAxCiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6OTUKICAgIC8vIHR5cGVzSUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBNZXRhTWVya2xlc0dsb2JhbFN0YXRlS2V5VHlwZXNJRCB9KQogICAgYnl0ZWMgNiAvLyAidHlwZXNfaWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTI1CiAgICAvLyB0aGlzLnR5cGVzSUQudmFsdWUgKz0gMQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NjEtNDY0CiAgICAvLyB0aGlzLnR5cGVzKGlkKS52YWx1ZSA9IHsKICAgIC8vICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLAogICAgLy8gICBzY2hlbWEsCiAgICAvLyB9CiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDQgLy8gNAogICAgKwogICAgZGlnIDUKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBkaWcgOQogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgcHVzaGJ5dGVzIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDYxCiAgICAvLyB0aGlzLnR5cGVzKGlkKS52YWx1ZSA9IHsKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMDAKICAgIC8vIHR5cGVzID0gQm94TWFwPHVpbnQ2NCwgVHlwZXNWYWx1ZT4oeyBrZXlQcmVmaXg6IE1ldGFNZXJrbGVzQm94UHJlZml4VHlwZXMgfSkKICAgIHB1c2hieXRlcyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ2MS00NjQKICAgIC8vIHRoaXMudHlwZXMoaWQpLnZhbHVlID0gewogICAgLy8gICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sCiAgICAvLyAgIHNjaGVtYSwKICAgIC8vIH0KICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzkzCiAgICAvLyBhZGRUeXBlKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgZGVzY3JpcHRpb246IHN0cmluZywgc2NoZW1hTGlzdDogU2NoZW1hTGlzdCk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucm9vdENvc3RzW3JvdXRpbmddKCkgLT4gdm9pZDoKcm9vdENvc3RzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ2OQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgZXh0cmFjdCAyIDAKICAgIGNhbGxzdWIgc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy5yb290Q29zdHMKICAgIGl0b2IKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLmRhdGFDb3N0c1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmRhdGFDb3N0czoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NzUKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciAobGVuK3V0ZjhbXSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgKGxlbit1dGY4W10pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIChsZW4rdXRmOFtdKQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ3NwogICAgLy8gY29uc3QgY29zdHMgPSB0aGlzLm1icignJywgJycsIG5hbWUubmF0aXZlLCBrZXkubmF0aXZlLCB2YWx1ZS5uYXRpdmUpCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18wIC8vICIiCiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGNvdmVyIDQKICAgIGNhbGxzdWIgbWJyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDc4CiAgICAvLyByZXR1cm4gY29zdHMuZGF0YQogICAgZXh0cmFjdCAxNiA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6NDc1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLm1icih0eXBlRGVzY3JpcHRpb246IGJ5dGVzLCBzY2hlbWE6IGJ5dGVzLCByb290TmFtZTogYnl0ZXMsIGRhdGFLZXk6IGJ5dGVzLCBkYXRhVmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKbWJyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjEwOS0xMTUKICAgIC8vIHByaXZhdGUgbWJyKAogICAgLy8gICB0eXBlRGVzY3JpcHRpb246IHN0cmluZywKICAgIC8vICAgc2NoZW1hOiBzdHJpbmcsCiAgICAvLyAgIHJvb3ROYW1lOiBzdHJpbmcsCiAgICAvLyAgIGRhdGFLZXk6IHN0cmluZywKICAgIC8vICAgZGF0YVZhbHVlOiBzdHJpbmcKICAgIC8vICk6IE1ldGFNZXJrbGVzTUJSRGF0YSB7CiAgICBwcm90byA1IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMTcKICAgIC8vIHR5cGVzOiBNaW5UeXBlc01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIEJ5dGVzKHR5cGVEZXNjcmlwdGlvbikubGVuZ3RoICsgQnl0ZXMoc2NoZW1hKS5sZW5ndGgpLAogICAgZnJhbWVfZGlnIC01CiAgICBsZW4KICAgIGludGMgNCAvLyA0MDAKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgbGVuCiAgICArCiAgICBwdXNoaW50IDkzMDAgLy8gOTMwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gcm9vdHM6IE1pblJvb3RzTUJSICsgKEJveENvc3RQZXJCeXRlICogQnl0ZXMocm9vdE5hbWUpLmxlbmd0aCksCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaW50YyA0IC8vIDQwMAogICAgZGlnIDEKICAgICoKICAgIHB1c2hpbnQgMzAxMDAgLy8gMzAxMDAKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMTkKICAgIC8vIGRhdGE6IE1pbkRhdGFNQlIgKyAoQm94Q29zdFBlckJ5dGUgKiAoQnl0ZXMocm9vdE5hbWUpLmxlbmd0aCArIEJ5dGVzKGRhdGFLZXkpLmxlbmd0aCArIEJ5dGVzKGRhdGFWYWx1ZSkubGVuZ3RoKSksCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgdW5jb3ZlciAyCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgKwogICAgaW50YyA0IC8vIDQwMAogICAgKgogICAgcHVzaGludCAxMjUwMCAvLyAxMjUwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjExNi0xMjAKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIHR5cGVzOiBNaW5UeXBlc01CUiArIChCb3hDb3N0UGVyQnl0ZSAqIEJ5dGVzKHR5cGVEZXNjcmlwdGlvbikubGVuZ3RoICsgQnl0ZXMoc2NoZW1hKS5sZW5ndGgpLAogICAgLy8gICByb290czogTWluUm9vdHNNQlIgKyAoQm94Q29zdFBlckJ5dGUgKiBCeXRlcyhyb290TmFtZSkubGVuZ3RoKSwKICAgIC8vICAgZGF0YTogTWluRGF0YU1CUiArIChCb3hDb3N0UGVyQnl0ZSAqIChCeXRlcyhyb290TmFtZSkubGVuZ3RoICsgQnl0ZXMoZGF0YUtleSkubGVuZ3RoICsgQnl0ZXMoZGF0YVZhbHVlKS5sZW5ndGgpKSwKICAgIC8vIH0KICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnkoYWRkcmVzczogYnl0ZXMsIG5hbWU6IGJ5dGVzLCBsZWFmOiBieXRlcywgcHJvb2Y6IGJ5dGVzLCB0eXBlOiB1aW50NjQpIC0+IHVpbnQ2NCwgYnl0ZXM6CnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5OgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gdmVyaWZ5KGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywgbGVhZjogTGVhZiwgcHJvb2Y6IFByb29mLCB0eXBlOiB1aW50NjQpOiBib29sZWFuIHsKICAgIHByb3RvIDUgMgogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAiIgogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Mjk3CiAgICAvLyBjb25zdCB0cnVuY2F0ZWRBZGRyZXNzID0gYnl0ZXMxNihhZGRyZXNzLmJ5dGVzKQogICAgZnJhbWVfZGlnIC01CiAgICBjYWxsc3ViIGJ5dGVzMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoyOTkKICAgIC8vIGNvbnN0IHJvb3RLZXk6IFJvb3RLZXkgPSB7IGFkZHJlc3MsIG5hbWUgfQogICAgZnJhbWVfZGlnIC00CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC01CiAgICBieXRlYyA0IC8vIDB4MDAyMgogICAgY29uY2F0CiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzAwCiAgICAvLyBjb25zdCB0eXBlS2V5OiBEYXRhS2V5ID0geyBhZGRyZXNzOiB0cnVuY2F0ZWRBZGRyZXNzLCBuYW1lLCBrZXk6IHRyZWVUeXBlS2V5IH0KICAgIGRpZyAyCiAgICBsZW4KICAgIHB1c2hpbnQgMTYgLy8gMTYKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzEgLy8gMHgwMDE0CiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIHB1c2hpbnQgMjAgLy8gMjAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBieXRlYyA3IC8vIDB4MDAwNjZjMmU3NDc5NzA2NQogICAgY29uY2F0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyByb290cyA9IEJveE1hcDxSb290S2V5LCBieXRlczwzMj4+KHsga2V5UHJlZml4OiBNZXRhTWVya2xlc0JveFByZWZpeFJvb3RzIH0pCiAgICBieXRlYyA1IC8vICJyIgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozMDIKICAgIC8vIGlmICghdGhpcy5yb290cyhyb290S2V5KS5leGlzdHMgfHwgIXRoaXMuZGF0YSh0eXBlS2V5KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYnogc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfaWZfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyBkYXRhID0gQm94TWFwPERhdGFLZXksIHN0cmluZz4oeyBrZXlQcmVmaXg6IE1ldGFNZXJrbGVzQm94UHJlZml4RGF0YSB9KQogICAgYnl0ZWNfMiAvLyAiZCIKICAgIGZyYW1lX2RpZyA2CiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzAyCiAgICAvLyBpZiAoIXRoaXMucm9vdHMocm9vdEtleSkuZXhpc3RzIHx8ICF0aGlzLmRhdGEodHlwZUtleSkuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeV9hZnRlcl9pZl9lbHNlQDMKCnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5X2lmX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozMDMKICAgIC8vIHJldHVybiBmYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMwNgogICAgLy8gY29uc3QgdHJlZVR5cGUgPSBidG9pKEJ5dGVzKHRoaXMuZGF0YSh0eXBlS2V5KS52YWx1ZSkpCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gaWYgKHR5cGUgIT09IE1lcmtsZVRyZWVUeXBlVW5zcGVjaWZpZWQgJiYgdHJlZVR5cGUgIT09IHR5cGUpIHsKICAgIGZyYW1lX2RpZyAtMQogICAgYnogc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIC0xCiAgICAhPQogICAgYnogc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzA4CiAgICAvLyByZXR1cm4gZmFsc2UKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozMTEKICAgIC8vIGVuc3VyZUJ1ZGdldChwcm9vZi5sZW5ndGggKiA1MCkKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgcHVzaGludCA1MCAvLyA1MAogICAgKgogICAgcHVzaGludCAxMCAvLyAxMAogICAgKwogICAgZnJhbWVfYnVyeSA0CgpzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeV93aGlsZV90b3BAMTU6CiAgICBmcmFtZV9kaWcgNAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfd2hpbGVAMjAKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBieXRlYyA4IC8vIDB4MDY4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbQogICAgYnl0ZWMgOCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgYiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeV93aGlsZV90b3BAMTUKCnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5X2FmdGVyX3doaWxlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHByb29mLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2J1cnkgMQoKc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfd2hpbGVfdG9wQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzE0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcHJvb2YubGVuZ3RoOyBpICs9IDEpIHsKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMgogICAgPAogICAgYnogc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfd2hpbGVAOQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gaGFzaCA9IHRoaXMuaGFzaChwcm9vZltpXSwgaGFzaCkKICAgIGZyYW1lX2RpZyAtMgogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAzCiAgICBpbnRjXzMgLy8gMzIKICAgICoKICAgIGludGNfMyAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMzAKICAgIC8vIGlmIChCaWdVaW50KGEpID4gQmlnVWludChiKSkgewogICAgZnJhbWVfZGlnIDEKICAgIGI+CiAgICBieiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeV9hZnRlcl9pZl9lbHNlQDEyCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyByZXR1cm4gc2hhMjU2KGIuY29uY2F0KGEpKQogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICBmcmFtZV9idXJ5IDEKCnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5X2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy5oYXNoQDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMxNAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHByb29mLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnZlcmlmeV93aGlsZV90b3BANwoKc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czoxMzMKICAgIC8vIHJldHVybiBzaGEyNTYoYS5jb25jYXQoYikpCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gaGFzaCA9IHRoaXMuaGFzaChwcm9vZltpXSwgaGFzaCkKICAgIGIgc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjpNZXRhTWVya2xlcy52ZXJpZnlfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLmhhc2hAMTMKCnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMudmVyaWZ5X2FmdGVyX3doaWxlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyByZXR1cm4gaGFzaCA9PT0gdGhpcy5yb290cyhyb290S2V5KS52YWx1ZQogICAgZnJhbWVfZGlnIDcKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgMQogICAgPT0KICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfYnVyeSAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucmVhZChhZGRyZXNzOiBieXRlcywgbmFtZTogYnl0ZXMsIGtleTogYnl0ZXMpIC0+IGJ5dGVzOgpzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6Ok1ldGFNZXJrbGVzLnJlYWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzI5LTMzMAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyByZWFkKGFkZHJlc3M6IEFjY291bnQsIG5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBzdHJpbmcgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyBjb25zdCB0cnVuY2F0ZWRBZGRyZXNzID0gYnl0ZXMxNihhZGRyZXNzLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0zCiAgICBjYWxsc3ViIGJ5dGVzMTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czozMzIKICAgIC8vIHJldHVybiB0aGlzLmRhdGEoeyBhZGRyZXNzOiB0cnVuY2F0ZWRBZGRyZXNzLCBuYW1lLCBrZXkgfSkudmFsdWUKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgc3dhcAogICAgYnl0ZWNfMSAvLyAweDAwMTQKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCAyMCAvLyAyMAogICAgKwogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvbWV0YS1tZXJrbGVzL2NvbnRyYWN0LmFsZ28udHM6MTA0CiAgICAvLyBkYXRhID0gQm94TWFwPERhdGFLZXksIHN0cmluZz4oeyBrZXlQcmVmaXg6IE1ldGFNZXJrbGVzQm94UHJlZml4RGF0YSB9KQogICAgYnl0ZWNfMiAvLyAiZCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjMzMgogICAgLy8gcmV0dXJuIHRoaXMuZGF0YSh7IGFkZHJlc3M6IHRydW5jYXRlZEFkZHJlc3MsIG5hbWUsIGtleSB9KS52YWx1ZQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucm9vdENvc3RzKG5hbWU6IGJ5dGVzKSAtPiB1aW50NjQ6CnNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo6TWV0YU1lcmtsZXMucm9vdENvc3RzOgogICAgLy8gc21hcnRfY29udHJhY3RzL21ldGEtbWVya2xlcy9jb250cmFjdC5hbGdvLnRzOjQ2OS00NzAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gcm9vdENvc3RzKG5hbWU6IHN0cmluZyk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NzEKICAgIC8vIGNvbnN0IGNvc3RzID0gdGhpcy5tYnIoJycsICcnLCBuYW1lLCB0cmVlVHlwZUtleSwgU3RyaW5nKGl0b2IoMCkpKQogICAgaW50Y18wIC8vIDAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gIiIKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgImwudHlwZSIKICAgIHVuY292ZXIgNAogICAgY2FsbHN1YiBtYnIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tZXRhLW1lcmtsZXMvY29udHJhY3QuYWxnby50czo0NzIKICAgIC8vIHJldHVybiBjb3N0cy5yb290cyArIGNvc3RzLmRhdGEKICAgIGR1cAogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBzd2FwCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgKwogICAgcmV0c3ViCg==\",\"clear\":\"I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==\"},\"byteCode\":{\"approval\":\"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\",\"clear\":\"C4EBQw==\"},\"events\":[],\"templateVariables\":{}} as unknown as Arc56Contract\n\n/**\n * A state record containing binary data\n */\nexport interface BinaryState {\n /**\n * Gets the state value as a Uint8Array\n */\n asByteArray(): Uint8Array | undefined\n /**\n * Gets the state value as a string\n */\n asString(): string | undefined\n}\n\nclass BinaryStateValue implements BinaryState {\n constructor(private value: Uint8Array | undefined) {}\n\n asByteArray(): Uint8Array | undefined {\n return this.value\n }\n\n asString(): string | undefined {\n return this.value !== undefined ? Buffer.from(this.value).toString('utf-8') : undefined\n }\n}\n\n/**\n * Expands types for IntelliSense so they are more human readable\n * See https://stackoverflow.com/a/69288824\n */\nexport type Expand<T> = T extends (...args: infer A) => infer R\n ? (...args: Expand<A>) => Expand<R>\n : T extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n\n// Type definitions for ARC-56 structs\n\nexport type DataKey = {\n address: Uint8Array,\n name: string,\n key: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a DataKey to the struct representation\n */\nexport function DataKeyFromTuple(abiTuple: [Uint8Array, string, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.DataKey, APP_SPEC.structs) as DataKey\n}\n\nexport type RootKey = {\n address: string,\n name: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a RootKey to the struct representation\n */\nexport function RootKeyFromTuple(abiTuple: [string, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.RootKey, APP_SPEC.structs) as RootKey\n}\n\nexport type TypesValue = {\n schema: string,\n description: string\n}\n\n\n/**\n * Converts the ABI tuple representation of a TypesValue to the struct representation\n */\nexport function TypesValueFromTuple(abiTuple: [string, string]) {\n return getABIStructFromABITuple(abiTuple, APP_SPEC.structs.TypesValue, APP_SPEC.structs) as TypesValue\n}\n\n/**\n * The argument types for the MetaMerkles contract\n */\nexport type MetaMerklesArgs = {\n /**\n * The object representation of the arguments for each method\n */\n obj: {\n 'create()void': Record<string, never>\n 'addRoot(pay,string,byte[32],uint64)void': {\n payment: AppMethodCallTransactionArgument\n /**\n * the name alias of the root being added\n */\n name: string\n /**\n * a merkle tree root\n */\n root: Uint8Array\n /**\n * an index of the tree type enum from box storage\n */\n type: bigint | number\n }\n 'deleteRoot(string)void': {\n /**\n * the name of the merkle tree root\n */\n name: string\n }\n 'updateRoot(string,byte[32])void': {\n /**\n * the name of the merkle group data\n */\n name: string\n /**\n * the new 32 byte merkle tree root\n */\n newRoot: Uint8Array\n }\n 'addData(pay,string,string,string)void': {\n payment: AppMethodCallTransactionArgument\n /**\n * the name of the merkle tree root\n */\n name: string\n /**\n * the metadata key eg. `Royalty`\n */\n key: string\n /**\n * the metadata value eg. `5` encoded as a bytestring for 5%\n */\n value: string\n }\n 'deleteData(string,string)void': {\n /**\n * the name of the merkle tree root\n */\n name: string\n /**\n * the metadata key you want to remove\n */\n key: string\n }\n 'verify(address,string,byte[32],byte[32][],uint64)bool': {\n /**\n * the address of the merkle tree root creator\n */\n address: string\n /**\n * The name alias of the root\n */\n name: string\n /**\n * The hashed leaf to verify\n */\n leaf: Uint8Array\n /**\n * The merkle proof\n */\n proof: Uint8Array[]\n /**\n * The type check for the lists purpose\n */\n type: bigint | number\n }\n 'read(address,string,string)string': {\n /**\n * the address of the merkle tree root creator\n */\n address: string\n /**\n * the name of the merkle tree root\n */\n name: string\n /**\n * the metadata key eg. `Royalty`\n */\n key: string\n }\n 'verifiedRead(address,string,byte[32],byte[32][],uint64,string)string': {\n /**\n * the address of the merkle tree root creator\n */\n address: string\n /**\n * the name of the root\n */\n name: string\n /**\n * the leaf node to be verified\n */\n leaf: Uint8Array\n /**\n * the proof the hash is included\n */\n proof: Uint8Array[]\n /**\n * the list type that helps contracts ensure\n the lists purpose isn't being misused ( 0 if the caller doesnt care )\n\n */\n type: bigint | number\n /**\n * the metadata key eg. `Royalty`\n */\n key: string\n }\n 'verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string': {\n /**\n * the address of the merkle tree root creator\n */\n address: string\n /**\n * the name of the root\n */\n name: string\n /**\n * the leaf node to be verified\n */\n leaf: Uint8Array\n /**\n * the proof the hash is included\n */\n proof: Uint8Array[]\n /**\n * the list type that helps contracts ensure\n the lists purpose isn't being misused ( 0 if the caller doesnt care )\n\n */\n type: bigint | number\n /**\n * the metadata key eg. `Royalty`\n */\n key: string\n }\n 'addType(pay,string,uint8[])void': {\n payment: AppMethodCallTransactionArgument\n description: string\n schemaList: bigint[] | number[]\n }\n 'rootCosts(string)uint64': {\n name: string\n }\n 'dataCosts(string,string,string)uint64': {\n name: string\n key: string\n value: string\n }\n }\n /**\n * The tuple representation of the arguments for each method\n */\n tuple: {\n 'create()void': []\n 'addRoot(pay,string,byte[32],uint64)void': [payment: AppMethodCallTransactionArgument, name: string, root: Uint8Array, type: bigint | number]\n 'deleteRoot(string)void': [name: string]\n 'updateRoot(string,byte[32])void': [name: string, newRoot: Uint8Array]\n 'addData(pay,string,string,string)void': [payment: AppMethodCallTransactionArgument, name: string, key: string, value: string]\n 'deleteData(string,string)void': [name: string, key: string]\n 'verify(address,string,byte[32],byte[32][],uint64)bool': [address: string, name: string, leaf: Uint8Array, proof: Uint8Array[], type: bigint | number]\n 'read(address,string,string)string': [address: string, name: string, key: string]\n 'verifiedRead(address,string,byte[32],byte[32][],uint64,string)string': [address: string, name: string, leaf: Uint8Array, proof: Uint8Array[], type: bigint | number, key: string]\n 'verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string': [address: string, name: string, leaf: Uint8Array, proof: Uint8Array[], type: bigint | number, key: string]\n 'addType(pay,string,uint8[])void': [payment: AppMethodCallTransactionArgument, description: string, schemaList: bigint[] | number[]]\n 'rootCosts(string)uint64': [name: string]\n 'dataCosts(string,string,string)uint64': [name: string, key: string, value: string]\n }\n}\n\n/**\n * The return type for each method\n */\nexport type MetaMerklesReturns = {\n 'create()void': void\n 'addRoot(pay,string,byte[32],uint64)void': void\n 'deleteRoot(string)void': void\n 'updateRoot(string,byte[32])void': void\n 'addData(pay,string,string,string)void': void\n 'deleteData(string,string)void': void\n 'verify(address,string,byte[32],byte[32][],uint64)bool': boolean\n 'read(address,string,string)string': string\n 'verifiedRead(address,string,byte[32],byte[32][],uint64,string)string': string\n 'verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string': string\n 'addType(pay,string,uint8[])void': void\n 'rootCosts(string)uint64': bigint\n 'dataCosts(string,string,string)uint64': bigint\n}\n\n/**\n * Defines the types of available calls and state of the MetaMerkles smart contract.\n */\nexport type MetaMerklesTypes = {\n /**\n * Maps method signatures / names to their argument and return types.\n */\n methods:\n & Record<'create()void' | 'create', {\n argsObj: MetaMerklesArgs['obj']['create()void']\n argsTuple: MetaMerklesArgs['tuple']['create()void']\n returns: MetaMerklesReturns['create()void']\n }>\n & Record<'addRoot(pay,string,byte[32],uint64)void' | 'addRoot', {\n argsObj: MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void']\n argsTuple: MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']\n returns: MetaMerklesReturns['addRoot(pay,string,byte[32],uint64)void']\n }>\n & Record<'deleteRoot(string)void' | 'deleteRoot', {\n argsObj: MetaMerklesArgs['obj']['deleteRoot(string)void']\n argsTuple: MetaMerklesArgs['tuple']['deleteRoot(string)void']\n returns: MetaMerklesReturns['deleteRoot(string)void']\n }>\n & Record<'updateRoot(string,byte[32])void' | 'updateRoot', {\n argsObj: MetaMerklesArgs['obj']['updateRoot(string,byte[32])void']\n argsTuple: MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']\n returns: MetaMerklesReturns['updateRoot(string,byte[32])void']\n }>\n & Record<'addData(pay,string,string,string)void' | 'addData', {\n argsObj: MetaMerklesArgs['obj']['addData(pay,string,string,string)void']\n argsTuple: MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']\n returns: MetaMerklesReturns['addData(pay,string,string,string)void']\n }>\n & Record<'deleteData(string,string)void' | 'deleteData', {\n argsObj: MetaMerklesArgs['obj']['deleteData(string,string)void']\n argsTuple: MetaMerklesArgs['tuple']['deleteData(string,string)void']\n returns: MetaMerklesReturns['deleteData(string,string)void']\n }>\n & Record<'verify(address,string,byte[32],byte[32][],uint64)bool' | 'verify', {\n argsObj: MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool']\n argsTuple: MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']\n /**\n * a boolean indicating whether the proof is valid\n */\n returns: MetaMerklesReturns['verify(address,string,byte[32],byte[32][],uint64)bool']\n }>\n & Record<'read(address,string,string)string' | 'read', {\n argsObj: MetaMerklesArgs['obj']['read(address,string,string)string']\n argsTuple: MetaMerklesArgs['tuple']['read(address,string,string)string']\n /**\n * the value set eg. `5` encoded as a bytestring for 5%\n */\n returns: MetaMerklesReturns['read(address,string,string)string']\n }>\n & Record<'verifiedRead(address,string,byte[32],byte[32][],uint64,string)string' | 'verifiedRead', {\n argsObj: MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']\n argsTuple: MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']\n /**\n * a string of metadata\n */\n returns: MetaMerklesReturns['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']\n }>\n & Record<'verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string' | 'verifiedMustRead', {\n argsObj: MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']\n argsTuple: MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']\n /**\n * a string of metadata\n */\n returns: MetaMerklesReturns['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']\n }>\n & Record<'addType(pay,string,uint8[])void' | 'addType', {\n argsObj: MetaMerklesArgs['obj']['addType(pay,string,uint8[])void']\n argsTuple: MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']\n returns: MetaMerklesReturns['addType(pay,string,uint8[])void']\n }>\n & Record<'rootCosts(string)uint64' | 'rootCosts', {\n argsObj: MetaMerklesArgs['obj']['rootCosts(string)uint64']\n argsTuple: MetaMerklesArgs['tuple']['rootCosts(string)uint64']\n returns: MetaMerklesReturns['rootCosts(string)uint64']\n }>\n & Record<'dataCosts(string,string,string)uint64' | 'dataCosts', {\n argsObj: MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64']\n argsTuple: MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']\n returns: MetaMerklesReturns['dataCosts(string,string,string)uint64']\n }>\n /**\n * Defines the shape of the state of the application.\n */\n state: {\n global: {\n keys: {\n typesId: bigint\n }\n maps: {}\n }\n box: {\n keys: {}\n maps: {\n /**\n * the types (intents) of merkle trees that exist\n */\n types: Map<bigint | number, TypesValue>\n /**\n * the merkle roots we want to attach data to\n */\n roots: Map<RootKey, Uint8Array>\n /**\n * rootData is the box map for managing the data associated with a group\n */\n data: Map<DataKey, string>\n }\n }\n }\n}\n\n/**\n * Defines the possible abi call signatures.\n */\nexport type MetaMerklesSignatures = keyof MetaMerklesTypes['methods']\n/**\n * Defines the possible abi call signatures for methods that return a non-void value.\n */\nexport type MetaMerklesNonVoidMethodSignatures = keyof MetaMerklesTypes['methods'] extends infer T ? T extends keyof MetaMerklesTypes['methods'] ? MethodReturn<T> extends void ? never : T : never : never\n/**\n * Defines an object containing all relevant parameters for a single call to the contract.\n */\nexport type CallParams<TArgs> = Expand<\n Omit<AppClientMethodCallParams, 'method' | 'args' | 'onComplete'> &\n {\n /** The args for the ABI method call, either as an ordered array or an object */\n args: Expand<TArgs>\n }\n>\n/**\n * Maps a method signature from the MetaMerkles smart contract to the method's arguments in either tuple or struct form\n */\nexport type MethodArgs<TSignature extends MetaMerklesSignatures> = MetaMerklesTypes['methods'][TSignature]['argsObj' | 'argsTuple']\n/**\n * Maps a method signature from the MetaMerkles smart contract to the method's return type\n */\nexport type MethodReturn<TSignature extends MetaMerklesSignatures> = MetaMerklesTypes['methods'][TSignature]['returns']\n\n/**\n * Defines the shape of the keyed global state of the application.\n */\nexport type GlobalKeysState = MetaMerklesTypes['state']['global']['keys']\n\n/**\n * Defines the shape of the keyed box state of the application.\n */\nexport type BoxKeysState = MetaMerklesTypes['state']['box']['keys']\n\n\n/**\n * Defines supported create method params for this smart contract\n */\nexport type MetaMerklesCreateCallParams =\n | Expand<CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & {method: 'create'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n | Expand<CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & {method: 'create()void'} & {onComplete?: OnApplicationComplete.NoOpOC} & CreateSchema>\n/**\n * Defines arguments required for the deploy method.\n */\nexport type MetaMerklesDeployParams = Expand<Omit<AppFactoryDeployParams, 'createParams' | 'updateParams' | 'deleteParams'> & {\n /**\n * Create transaction parameters to use if a create needs to be issued as part of deployment; use `method` to define ABI call (if available) or leave out for a bare call (if available)\n */\n createParams?: MetaMerklesCreateCallParams\n}>\n\n\n/**\n * Exposes methods for constructing `AppClient` params objects for ABI calls to the MetaMerkles smart contract\n */\nexport abstract class MetaMerklesParamsFactory {\n /**\n * Gets available create ABI call param factories\n */\n static get create() {\n return {\n _resolveByMethod<TParams extends MetaMerklesCreateCallParams & {method: string}>(params: TParams) {\n switch(params.method) {\n case 'create':\n case 'create()void':\n return MetaMerklesParamsFactory.create.create(params)\n }\n throw new Error(`Unknown ' + verb + ' method`)\n },\n\n /**\n * Constructs create ABI call params for the MetaMerkles smart contract using the create()void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n create(params: CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC}): AppClientMethodCallParams & AppClientCompilationParams & {onComplete?: OnApplicationComplete.NoOpOC} {\n return {\n ...params,\n method: 'create()void' as const,\n args: Array.isArray(params.args) ? params.args : [],\n }\n },\n }\n }\n\n /**\n * Constructs a no op call for the addRoot(pay,string,byte[32],uint64)void ABI method\n *\n * Creates two boxes and adds a merkle root\n using a `RootKey` to the root box map and also a list type to the\n metadata attached to the root in the data box map\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static addRoot(params: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'addRoot(pay,string,byte[32],uint64)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.name, params.args.root, params.args.type],\n }\n }\n /**\n * Constructs a no op call for the deleteRoot(string)void ABI method\n *\n * Deletes the merkle root from the root box map\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deleteRoot(params: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deleteRoot(string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.name],\n }\n }\n /**\n * Constructs a no op call for the updateRoot(string,byte[32])void ABI method\n *\n * Replaces the merkle root with another\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static updateRoot(params: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'updateRoot(string,byte[32])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.name, params.args.newRoot],\n }\n }\n /**\n * Constructs a no op call for the addData(pay,string,string,string)void ABI method\n *\n * Registers a key & value in the data box map that\n corresponds to a merkle root in the root box map\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static addData(params: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'addData(pay,string,string,string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.name, params.args.key, params.args.value],\n }\n }\n /**\n * Constructs a no op call for the deleteData(string,string)void ABI method\n *\n * Deletes a metadata key & value pair from the data box map\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static deleteData(params: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'deleteData(string,string)void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.name, params.args.key],\n }\n }\n /**\n * Constructs a no op call for the verify(address,string,byte[32],byte[32][],uint64)bool ABI method\n *\n * verify an inclusion in a double sha256 based merkle tree\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static verify(params: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'verify(address,string,byte[32],byte[32][],uint64)bool' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.name, params.args.leaf, params.args.proof, params.args.type],\n }\n }\n /**\n * Constructs a no op call for the read(address,string,string)string ABI method\n *\n * Fetch a metadata properties\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static read(params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'read(address,string,string)string' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.name, params.args.key],\n }\n }\n /**\n * Constructs a no op call for the verifiedRead(address,string,byte[32],byte[32][],uint64,string)string ABI method\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static verifiedRead(params: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'verifiedRead(address,string,byte[32],byte[32][],uint64,string)string' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.name, params.args.leaf, params.args.proof, params.args.type, params.args.key],\n }\n }\n /**\n * Constructs a no op call for the verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string ABI method\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static verifiedMustRead(params: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.address, params.args.name, params.args.leaf, params.args.proof, params.args.type, params.args.key],\n }\n }\n /**\n * Constructs a no op call for the addType(pay,string,uint8[])void ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static addType(params: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'addType(pay,string,uint8[])void' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.description, params.args.schemaList],\n }\n }\n /**\n * Constructs a no op call for the rootCosts(string)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static rootCosts(params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'rootCosts(string)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.name],\n }\n }\n /**\n * Constructs a no op call for the dataCosts(string,string,string)uint64 ABI method\n *\n * @param params Parameters for the call\n * @returns An `AppClientMethodCallParams` object for the call\n */\n static dataCosts(params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']> & CallOnComplete): AppClientMethodCallParams & CallOnComplete {\n return {\n ...params,\n method: 'dataCosts(string,string,string)uint64' as const,\n args: Array.isArray(params.args) ? params.args : [params.args.name, params.args.key, params.args.value],\n }\n }\n}\n\n/**\n * A factory to create and deploy one or more instance of the MetaMerkles smart contract and to create one or more app clients to interact with those (or other) app instances\n */\nexport class MetaMerklesFactory {\n /**\n * The underlying `AppFactory` for when you want to have more flexibility\n */\n public readonly appFactory: _AppFactory\n\n /**\n * Creates a new instance of `MetaMerklesFactory`\n *\n * @param params The parameters to initialise the app factory with\n */\n constructor(params: Omit<AppFactoryParams, 'appSpec'>) {\n this.appFactory = new _AppFactory({\n ...params,\n appSpec: APP_SPEC,\n })\n }\n \n /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */\n public get appName() {\n return this.appFactory.appName\n }\n \n /** The ARC-56 app spec being used */\n get appSpec() {\n return APP_SPEC\n }\n \n /** A reference to the underlying `AlgorandClient` this app factory is using. */\n public get algorand(): AlgorandClient {\n return this.appFactory.algorand\n }\n \n /**\n * Returns a new `AppClient` client for an app instance of the given ID.\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public getAppClientById(params: AppFactoryAppClientParams) {\n return new MetaMerklesClient(this.appFactory.getAppClientById(params))\n }\n \n /**\n * Returns a new `AppClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n *\n * Automatically populates appName, defaultSender and source maps from the factory\n * if not specified in the params.\n * @param params The parameters to create the app client\n * @returns The `AppClient`\n */\n public async getAppClientByCreatorAndName(\n params: AppFactoryResolveAppClientByCreatorAndNameParams,\n ) {\n return new MetaMerklesClient(await this.appFactory.getAppClientByCreatorAndName(params))\n }\n\n /**\n * Idempotently deploys the MetaMerkles smart contract.\n *\n * @param params The arguments for the contract calls and any additional parameters for the call\n * @returns The deployment result\n */\n public async deploy(params: MetaMerklesDeployParams = {}) {\n const result = await this.appFactory.deploy({\n ...params,\n createParams: params.createParams?.method ? MetaMerklesParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams as (MetaMerklesCreateCallParams & { args: Uint8Array[] }) : undefined,\n })\n return { result: result.result, appClient: new MetaMerklesClient(result.appClient) }\n }\n\n /**\n * Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the MetaMerkles smart contract using the create()void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create params\n */\n create: (params: CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appFactory.params.create(MetaMerklesParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the MetaMerkles smart contract using the create()void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create transaction\n */\n create: (params: CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & AppClientCompilationParams & CreateSchema & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n return this.appFactory.createTransaction.create(MetaMerklesParamsFactory.create.create(params))\n },\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Gets available create methods\n */\n create: {\n /**\n * Creates a new instance of the MetaMerkles smart contract using an ABI method call using the create()void ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The create result\n */\n create: async (params: CallParams<MetaMerklesArgs['obj']['create()void'] | MetaMerklesArgs['tuple']['create()void']> & AppClientCompilationParams & CreateSchema & SendParams & {onComplete?: OnApplicationComplete.NoOpOC} = {args: []}) => {\n const result = await this.appFactory.send.create(MetaMerklesParamsFactory.create.create(params))\n return { result: { ...result.result, return: result.result.return as unknown as (undefined | MetaMerklesReturns['create()void']) }, appClient: new MetaMerklesClient(result.appClient) }\n },\n },\n\n }\n\n}\n/**\n * A client to make calls to the MetaMerkles smart contract\n */\nexport class MetaMerklesClient {\n /**\n * The underlying `AppClient` for when you want to have more flexibility\n */\n public readonly appClient: _AppClient\n\n /**\n * Creates a new instance of `MetaMerklesClient`\n *\n * @param appClient An `AppClient` instance which has been created with the MetaMerkles app spec\n */\n constructor(appClient: _AppClient)\n /**\n * Creates a new instance of `MetaMerklesClient`\n *\n * @param params The parameters to initialise the app client with\n */\n constructor(params: Omit<AppClientParams, 'appSpec'>)\n constructor(appClientOrParams: _AppClient | Omit<AppClientParams, 'appSpec'>) {\n this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({\n ...appClientOrParams,\n appSpec: APP_SPEC,\n })\n }\n\n /**\n * Checks for decode errors on the given return value and maps the return value to the return type for the given method\n * @returns The typed return value or undefined if there was no value\n */\n decodeReturnValue<TSignature extends MetaMerklesNonVoidMethodSignatures>(method: TSignature, returnValue: ABIReturn | undefined) {\n return returnValue !== undefined ? getArc56ReturnValue<MethodReturn<TSignature>>(returnValue, this.appClient.getABIMethod(method), APP_SPEC.structs) : undefined\n }\n\n /**\n * Returns a new `MetaMerklesClient` client, resolving the app by creator address and name\n * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).\n * @param params The parameters to create the app client\n */\n public static async fromCreatorAndName(params: Omit<ResolveAppClientByCreatorAndName, 'appSpec'>): Promise<MetaMerklesClient> {\n return new MetaMerklesClient(await _AppClient.fromCreatorAndName({...params, appSpec: APP_SPEC}))\n }\n \n /**\n * Returns an `MetaMerklesClient` instance for the current network based on\n * pre-determined network-specific app IDs specified in the ARC-56 app spec.\n *\n * If no IDs are in the app spec or the network isn't recognised, an error is thrown.\n * @param params The parameters to create the app client\n */\n static async fromNetwork(\n params: Omit<ResolveAppClientByNetwork, 'appSpec'>\n ): Promise<MetaMerklesClient> {\n return new MetaMerklesClient(await _AppClient.fromNetwork({...params, appSpec: APP_SPEC}))\n }\n \n /** The ID of the app instance this client is linked to. */\n public get appId() {\n return this.appClient.appId\n }\n \n /** The app address of the app instance this client is linked to. */\n public get appAddress() {\n return this.appClient.appAddress\n }\n \n /** The name of the app. */\n public get appName() {\n return this.appClient.appName\n }\n \n /** The ARC-56 app spec being used */\n public get appSpec() {\n return this.appClient.appSpec\n }\n \n /** A reference to the underlying `AlgorandClient` this app client is using. */\n public get algorand(): AlgorandClient {\n return this.appClient.algorand\n }\n\n /**\n * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.\n */\n readonly params = {\n /**\n * Makes a clear_state call to an existing instance of the MetaMerkles smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.params.bare.clearState(params)\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addRoot(pay,string,byte[32],uint64)void` ABI method.\n *\n * Creates two boxes and adds a merkle root\n using a `RootKey` to the root box map and also a list type to the\n metadata attached to the root in the data box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n addRoot: (params: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.addRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteRoot(string)void` ABI method.\n *\n * Deletes the merkle root from the root box map\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deleteRoot: (params: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.deleteRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `updateRoot(string,byte[32])void` ABI method.\n *\n * Replaces the merkle root with another\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n updateRoot: (params: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.updateRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addData(pay,string,string,string)void` ABI method.\n *\n * Registers a key & value in the data box map that\n corresponds to a merkle root in the root box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n addData: (params: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.addData(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteData(string,string)void` ABI method.\n *\n * Deletes a metadata key & value pair from the data box map\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n deleteData: (params: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.deleteData(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verify(address,string,byte[32],byte[32][],uint64)bool` ABI method.\n *\n * verify an inclusion in a double sha256 based merkle tree\n *\n * @param params The params for the smart contract call\n * @returns The call params: a boolean indicating whether the proof is valid\n */\n verify: (params: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.verify(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `read(address,string,string)string` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Fetch a metadata properties\n *\n * @param params The params for the smart contract call\n * @returns The call params: the value set eg. `5` encoded as a bytestring for 5%\n */\n read: (params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.read(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call params: a string of metadata\n */\n verifiedRead: (params: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.verifiedRead(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call params: a string of metadata\n */\n verifiedMustRead: (params: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.verifiedMustRead(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addType(pay,string,uint8[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n addType: (params: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.addType(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `rootCosts(string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n rootCosts: (params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.rootCosts(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `dataCosts(string,string,string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call params\n */\n dataCosts: (params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.params.call(MetaMerklesParamsFactory.dataCosts(params))\n },\n\n }\n\n /**\n * Create transactions for the current app\n */\n readonly createTransaction = {\n /**\n * Makes a clear_state call to an existing instance of the MetaMerkles smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams>) => {\n return this.appClient.createTransaction.bare.clearState(params)\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addRoot(pay,string,byte[32],uint64)void` ABI method.\n *\n * Creates two boxes and adds a merkle root\n using a `RootKey` to the root box map and also a list type to the\n metadata attached to the root in the data box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n addRoot: (params: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.addRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteRoot(string)void` ABI method.\n *\n * Deletes the merkle root from the root box map\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deleteRoot: (params: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.deleteRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `updateRoot(string,byte[32])void` ABI method.\n *\n * Replaces the merkle root with another\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n updateRoot: (params: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.updateRoot(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addData(pay,string,string,string)void` ABI method.\n *\n * Registers a key & value in the data box map that\n corresponds to a merkle root in the root box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n addData: (params: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.addData(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteData(string,string)void` ABI method.\n *\n * Deletes a metadata key & value pair from the data box map\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n deleteData: (params: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.deleteData(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verify(address,string,byte[32],byte[32][],uint64)bool` ABI method.\n *\n * verify an inclusion in a double sha256 based merkle tree\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a boolean indicating whether the proof is valid\n */\n verify: (params: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.verify(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `read(address,string,string)string` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Fetch a metadata properties\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: the value set eg. `5` encoded as a bytestring for 5%\n */\n read: (params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.read(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a string of metadata\n */\n verifiedRead: (params: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.verifiedRead(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call transaction: a string of metadata\n */\n verifiedMustRead: (params: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.verifiedMustRead(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addType(pay,string,uint8[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n addType: (params: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.addType(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `rootCosts(string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n rootCosts: (params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.rootCosts(params))\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `dataCosts(string,string,string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call transaction\n */\n dataCosts: (params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n return this.appClient.createTransaction.call(MetaMerklesParamsFactory.dataCosts(params))\n },\n\n }\n\n /**\n * Send calls to the current app\n */\n readonly send = {\n /**\n * Makes a clear_state call to an existing instance of the MetaMerkles smart contract.\n *\n * @param params The params for the bare (raw) call\n * @returns The clearState result\n */\n clearState: (params?: Expand<AppClientBareCallParams & SendParams>) => {\n return this.appClient.send.bare.clearState(params)\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addRoot(pay,string,byte[32],uint64)void` ABI method.\n *\n * Creates two boxes and adds a merkle root\n using a `RootKey` to the root box map and also a list type to the\n metadata attached to the root in the data box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n addRoot: async (params: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.addRoot(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['addRoot(pay,string,byte[32],uint64)void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteRoot(string)void` ABI method.\n *\n * Deletes the merkle root from the root box map\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deleteRoot: async (params: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.deleteRoot(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['deleteRoot(string)void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `updateRoot(string,byte[32])void` ABI method.\n *\n * Replaces the merkle root with another\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n updateRoot: async (params: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.updateRoot(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['updateRoot(string,byte[32])void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addData(pay,string,string,string)void` ABI method.\n *\n * Registers a key & value in the data box map that\n corresponds to a merkle root in the root box map\n\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n addData: async (params: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.addData(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['addData(pay,string,string,string)void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `deleteData(string,string)void` ABI method.\n *\n * Deletes a metadata key & value pair from the data box map\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n deleteData: async (params: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.deleteData(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['deleteData(string,string)void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verify(address,string,byte[32],byte[32][],uint64)bool` ABI method.\n *\n * verify an inclusion in a double sha256 based merkle tree\n *\n * @param params The params for the smart contract call\n * @returns The call result: a boolean indicating whether the proof is valid\n */\n verify: async (params: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.verify(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['verify(address,string,byte[32],byte[32][],uint64)bool'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `read(address,string,string)string` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Fetch a metadata properties\n *\n * @param params The params for the smart contract call\n * @returns The call result: the value set eg. `5` encoded as a bytestring for 5%\n */\n read: async (params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.read(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['read(address,string,string)string'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call result: a string of metadata\n */\n verifiedRead: async (params: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.verifiedRead(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string` ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param params The params for the smart contract call\n * @returns The call result: a string of metadata\n */\n verifiedMustRead: async (params: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.verifiedMustRead(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `addType(pay,string,uint8[])void` ABI method.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n addType: async (params: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.addType(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['addType(pay,string,uint8[])void'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `rootCosts(string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n rootCosts: async (params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.rootCosts(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['rootCosts(string)uint64'])}\n },\n\n /**\n * Makes a call to the MetaMerkles smart contract using the `dataCosts(string,string,string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n dataCosts: async (params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']> & SendParams & {onComplete?: OnApplicationComplete.NoOpOC}) => {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.dataCosts(params))\n return {...result, return: result.return as unknown as (undefined | MetaMerklesReturns['dataCosts(string,string,string)uint64'])}\n },\n\n }\n\n /**\n * Clone this app client with different params\n *\n * @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.\n * @returns A new app client with the altered params\n */\n public clone(params: CloneAppClientParams) {\n return new MetaMerklesClient(this.appClient.clone(params))\n }\n\n /**\n * Makes a readonly (simulated) call to the MetaMerkles smart contract using the `read(address,string,string)string` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * Fetch a metadata properties\n *\n * @param params The params for the smart contract call\n * @returns The call result: the value set eg. `5` encoded as a bytestring for 5%\n */\n async read(params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']>) {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.read(params))\n return result.return as unknown as MetaMerklesReturns['read(address,string,string)string']\n }\n\n /**\n * Makes a readonly (simulated) call to the MetaMerkles smart contract using the `rootCosts(string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async rootCosts(params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']>) {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.rootCosts(params))\n return result.return as unknown as MetaMerklesReturns['rootCosts(string)uint64']\n }\n\n /**\n * Makes a readonly (simulated) call to the MetaMerkles smart contract using the `dataCosts(string,string,string)uint64` ABI method.\n * \n * This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.\n *\n * @param params The params for the smart contract call\n * @returns The call result\n */\n async dataCosts(params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']>) {\n const result = await this.appClient.send.call(MetaMerklesParamsFactory.dataCosts(params))\n return result.return as unknown as MetaMerklesReturns['dataCosts(string,string,string)uint64']\n }\n\n /**\n * Methods to access state for the current MetaMerkles app\n */\n state = {\n /**\n * Methods to access global state for the current MetaMerkles app\n */\n global: {\n /**\n * Get all current keyed values from global state\n */\n getAll: async (): Promise<Partial<Expand<GlobalKeysState>>> => {\n const result = await this.appClient.state.global.getAll()\n return {\n typesId: result.typesID,\n }\n },\n /**\n * Get the current value of the typesID key in global state\n */\n typesId: async (): Promise<bigint | undefined> => { return (await this.appClient.state.global.getValue(\"typesID\")) as bigint | undefined },\n },\n /**\n * Methods to access box state for the current MetaMerkles app\n */\n box: {\n /**\n * Get all current keyed values from box state\n */\n getAll: async (): Promise<Partial<Expand<BoxKeysState>>> => {\n const result = await this.appClient.state.box.getAll()\n return {\n }\n },\n /**\n * Get values from the types map in box state\n */\n types: {\n /**\n * Get all current values of the types map in box state\n */\n getMap: async (): Promise<Map<bigint, TypesValue>> => { return (await this.appClient.state.box.getMap(\"types\")) as Map<bigint, TypesValue> },\n /**\n * Get a current value of the types map by key from box state\n */\n value: async (key: bigint | number): Promise<TypesValue | undefined> => { return await this.appClient.state.box.getMapValue(\"types\", key) as TypesValue | undefined },\n },\n /**\n * Get values from the roots map in box state\n */\n roots: {\n /**\n * Get all current values of the roots map in box state\n */\n getMap: async (): Promise<Map<RootKey, Uint8Array>> => { return (await this.appClient.state.box.getMap(\"roots\")) as Map<RootKey, Uint8Array> },\n /**\n * Get a current value of the roots map by key from box state\n */\n value: async (key: RootKey): Promise<Uint8Array | undefined> => { return await this.appClient.state.box.getMapValue(\"roots\", key) as Uint8Array | undefined },\n },\n /**\n * Get values from the data map in box state\n */\n data: {\n /**\n * Get all current values of the data map in box state\n */\n getMap: async (): Promise<Map<DataKey, string>> => { return (await this.appClient.state.box.getMap(\"data\")) as Map<DataKey, string> },\n /**\n * Get a current value of the data map by key from box state\n */\n value: async (key: DataKey): Promise<string | undefined> => { return await this.appClient.state.box.getMapValue(\"data\", key) as string | undefined },\n },\n },\n }\n\n public newGroup(): MetaMerklesComposer {\n const client = this\n const composer = this.algorand.newGroup()\n let promiseChain:Promise<unknown> = Promise.resolve()\n const resultMappers: Array<undefined | ((x: ABIReturn | undefined) => any)> = []\n return {\n /**\n * Add a addRoot(pay,string,byte[32],uint64)void method call against the MetaMerkles contract\n */\n addRoot(params: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addRoot(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a deleteRoot(string)void method call against the MetaMerkles contract\n */\n deleteRoot(params: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteRoot(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a updateRoot(string,byte[32])void method call against the MetaMerkles contract\n */\n updateRoot(params: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateRoot(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a addData(pay,string,string,string)void method call against the MetaMerkles contract\n */\n addData(params: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addData(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a deleteData(string,string)void method call against the MetaMerkles contract\n */\n deleteData(params: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteData(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a verify(address,string,byte[32],byte[32][],uint64)bool method call against the MetaMerkles contract\n */\n verify(params: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verify(params)))\n resultMappers.push((v) => client.decodeReturnValue('verify(address,string,byte[32],byte[32][],uint64)bool', v))\n return this\n },\n /**\n * Add a read(address,string,string)string method call against the MetaMerkles contract\n */\n read(params: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.read(params)))\n resultMappers.push((v) => client.decodeReturnValue('read(address,string,string)string', v))\n return this\n },\n /**\n * Add a verifiedRead(address,string,byte[32],byte[32][],uint64,string)string method call against the MetaMerkles contract\n */\n verifiedRead(params: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifiedRead(params)))\n resultMappers.push((v) => client.decodeReturnValue('verifiedRead(address,string,byte[32],byte[32][],uint64,string)string', v))\n return this\n },\n /**\n * Add a verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string method call against the MetaMerkles contract\n */\n verifiedMustRead(params: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verifiedMustRead(params)))\n resultMappers.push((v) => client.decodeReturnValue('verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string', v))\n return this\n },\n /**\n * Add a addType(pay,string,uint8[])void method call against the MetaMerkles contract\n */\n addType(params: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.addType(params)))\n resultMappers.push(undefined)\n return this\n },\n /**\n * Add a rootCosts(string)uint64 method call against the MetaMerkles contract\n */\n rootCosts(params: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.rootCosts(params)))\n resultMappers.push((v) => client.decodeReturnValue('rootCosts(string)uint64', v))\n return this\n },\n /**\n * Add a dataCosts(string,string,string)uint64 method call against the MetaMerkles contract\n */\n dataCosts(params: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']> & {onComplete?: OnApplicationComplete.NoOpOC}) {\n promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.dataCosts(params)))\n resultMappers.push((v) => client.decodeReturnValue('dataCosts(string,string,string)uint64', v))\n return this\n },\n /**\n * Add a clear state call to the MetaMerkles contract\n */\n clearState(params: AppClientBareCallParams) {\n promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)))\n return this\n },\n addTransaction(txn: Transaction, signer?: TransactionSigner) {\n promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer))\n return this\n },\n async composer() {\n await promiseChain\n return composer\n },\n async simulate(options?: SimulateOptions) {\n await promiseChain\n const result = await (!options ? composer.simulate() : composer.simulate(options))\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n },\n async send(params?: SendParams) {\n await promiseChain\n const result = await composer.send(params)\n return {\n ...result,\n returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i]!(val) : val.returnValue)\n }\n }\n } as unknown as MetaMerklesComposer\n }\n}\nexport type MetaMerklesComposer<TReturns extends [...any[]] = []> = {\n /**\n * Calls the addRoot(pay,string,byte[32],uint64)void ABI method.\n *\n * Creates two boxes and adds a merkle root\n using a `RootKey` to the root box map and also a list type to the\n metadata attached to the root in the data box map\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n addRoot(params?: CallParams<MetaMerklesArgs['obj']['addRoot(pay,string,byte[32],uint64)void'] | MetaMerklesArgs['tuple']['addRoot(pay,string,byte[32],uint64)void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['addRoot(pay,string,byte[32],uint64)void'] | undefined]>\n\n /**\n * Calls the deleteRoot(string)void ABI method.\n *\n * Deletes the merkle root from the root box map\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deleteRoot(params?: CallParams<MetaMerklesArgs['obj']['deleteRoot(string)void'] | MetaMerklesArgs['tuple']['deleteRoot(string)void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['deleteRoot(string)void'] | undefined]>\n\n /**\n * Calls the updateRoot(string,byte[32])void ABI method.\n *\n * Replaces the merkle root with another\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n updateRoot(params?: CallParams<MetaMerklesArgs['obj']['updateRoot(string,byte[32])void'] | MetaMerklesArgs['tuple']['updateRoot(string,byte[32])void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['updateRoot(string,byte[32])void'] | undefined]>\n\n /**\n * Calls the addData(pay,string,string,string)void ABI method.\n *\n * Registers a key & value in the data box map that\n corresponds to a merkle root in the root box map\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n addData(params?: CallParams<MetaMerklesArgs['obj']['addData(pay,string,string,string)void'] | MetaMerklesArgs['tuple']['addData(pay,string,string,string)void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['addData(pay,string,string,string)void'] | undefined]>\n\n /**\n * Calls the deleteData(string,string)void ABI method.\n *\n * Deletes a metadata key & value pair from the data box map\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n deleteData(params?: CallParams<MetaMerklesArgs['obj']['deleteData(string,string)void'] | MetaMerklesArgs['tuple']['deleteData(string,string)void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['deleteData(string,string)void'] | undefined]>\n\n /**\n * Calls the verify(address,string,byte[32],byte[32][],uint64)bool ABI method.\n *\n * verify an inclusion in a double sha256 based merkle tree\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n verify(params?: CallParams<MetaMerklesArgs['obj']['verify(address,string,byte[32],byte[32][],uint64)bool'] | MetaMerklesArgs['tuple']['verify(address,string,byte[32],byte[32][],uint64)bool']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['verify(address,string,byte[32],byte[32][],uint64)bool'] | undefined]>\n\n /**\n * Calls the read(address,string,string)string ABI method.\n *\n * Fetch a metadata properties\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n read(params?: CallParams<MetaMerklesArgs['obj']['read(address,string,string)string'] | MetaMerklesArgs['tuple']['read(address,string,string)string']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['read(address,string,string)string'] | undefined]>\n\n /**\n * Calls the verifiedRead(address,string,byte[32],byte[32][],uint64,string)string ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n verifiedRead(params?: CallParams<MetaMerklesArgs['obj']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['verifiedRead(address,string,byte[32],byte[32][],uint64,string)string'] | undefined]>\n\n /**\n * Calls the verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string ABI method.\n *\n * Read metadata from box storage and verify the data provided is included\n in the merkle tree given a sha256'd 32 byte merkle tree root & a proof\n thats pre-computed off chain.\n \n verify an inclusion in a merkle tree\n & read an associated key value pair\n & check against the underlying data's schema\n & check against the underlying data's list type or purpose\n\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n verifiedMustRead(params?: CallParams<MetaMerklesArgs['obj']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | MetaMerklesArgs['tuple']['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['verifiedMustRead(address,string,byte[32],byte[32][],uint64,string)string'] | undefined]>\n\n /**\n * Calls the addType(pay,string,uint8[])void ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n addType(params?: CallParams<MetaMerklesArgs['obj']['addType(pay,string,uint8[])void'] | MetaMerklesArgs['tuple']['addType(pay,string,uint8[])void']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['addType(pay,string,uint8[])void'] | undefined]>\n\n /**\n * Calls the rootCosts(string)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n rootCosts(params?: CallParams<MetaMerklesArgs['obj']['rootCosts(string)uint64'] | MetaMerklesArgs['tuple']['rootCosts(string)uint64']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['rootCosts(string)uint64'] | undefined]>\n\n /**\n * Calls the dataCosts(string,string,string)uint64 ABI method.\n *\n * @param args The arguments for the contract call\n * @param params Any additional parameters for the call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n dataCosts(params?: CallParams<MetaMerklesArgs['obj']['dataCosts(string,string,string)uint64'] | MetaMerklesArgs['tuple']['dataCosts(string,string,string)uint64']>): MetaMerklesComposer<[...TReturns, MetaMerklesReturns['dataCosts(string,string,string)uint64'] | undefined]>\n\n /**\n * Makes a clear_state call to an existing instance of the MetaMerkles smart contract.\n *\n * @param args The arguments for the bare call\n * @returns The typed transaction composer so you can fluently chain multiple calls or call execute to execute all queued up transactions\n */\n clearState(params?: AppClientBareCallParams): MetaMerklesComposer<[...TReturns, undefined]>\n\n /**\n * Adds a transaction to the composer\n *\n * @param txn A transaction to add to the transaction group\n * @param signer The optional signer to use when signing this transaction.\n */\n addTransaction(txn: Transaction, signer?: TransactionSigner): MetaMerklesComposer<TReturns>\n /**\n * Returns the underlying AtomicTransactionComposer instance\n */\n composer(): Promise<TransactionComposer>\n /**\n * Simulates the transaction group and returns the result\n */\n simulate(): Promise<MetaMerklesComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: SkipSignaturesSimulateOptions): Promise<MetaMerklesComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n simulate(options: RawSimulateOptions): Promise<MetaMerklesComposerResults<TReturns> & { simulateResponse: modelsv2.SimulateResponse }>\n /**\n * Sends the transaction group to the network and returns the results\n */\n send(params?: SendParams): Promise<MetaMerklesComposerResults<TReturns>>\n}\nexport type MetaMerklesComposerResults<TReturns extends [...any[]]> = Expand<SendAtomicTransactionComposerResults & {\n returns: TReturns\n}>\n\n","import { MaybeSigner } from \"../types\";\nimport {\n MetaMerklesArgs,\n} from '../generated/MetaMerklesClient';\n\n// Re-export types from generated client for convenience\n// Note: TypesValue, RootKey, DataKey are exported from the generated client through index.ts\n\ntype ContractArgs = MetaMerklesArgs[\"obj\"];\n\n// ========== Schema Part Constants ==========\n\n/** Schema part type enum for building leaf schemas */\nexport enum SchemaPart {\n Uint8 = 10,\n Uint16 = 11,\n Uint32 = 12,\n Uint64 = 13,\n Uint128 = 14,\n Uint256 = 15,\n Uint512 = 16,\n Bytes4 = 20,\n Bytes8 = 21,\n Bytes16 = 22,\n Bytes32 = 23,\n Bytes64 = 24,\n Bytes128 = 25,\n Bytes256 = 26,\n Bytes512 = 27,\n String = 30,\n Address = 40,\n}\n\n/** Merkle tree type constants */\nexport enum MerkleTreeType {\n Unspecified = 0,\n Collection = 1,\n Trait = 2,\n Trade = 3,\n Whitelist = 4,\n Addresses = 5,\n}\n\n// ========== Global State Type ==========\n\nexport type MetaMerklesGlobalState = {\n /** The current types ID cursor */\n typesId: bigint;\n};\n\n// ========== Read Method Params ==========\n\nexport type GetRootParams = {\n /** The address of the root creator */\n address: string;\n /** The name of the merkle tree root */\n name: string;\n};\n\nexport type GetDataParams = {\n /** The address of the root creator */\n address: string;\n /** The name of the merkle tree root */\n name: string;\n /** The metadata key */\n key: string;\n};\n\nexport type GetTypeParams = {\n /** The type ID */\n id: bigint | number;\n};\n\nexport type RootCostsParams = Pick<ContractArgs['rootCosts(string)uint64'], 'name'>;\n\nexport type DataCostsParams = {\n /** The name of the merkle tree root */\n name: string;\n /** The metadata key */\n key: string;\n /** The metadata value */\n value: string;\n};\n\n// ========== Verify Method Params ==========\n\nexport type VerifyParams = {\n /** The address of the merkle tree root creator */\n address: string;\n /** The name alias of the root */\n name: string;\n /** The hashed leaf to verify (32 bytes) */\n leaf: Uint8Array;\n /** The merkle proof - array of 32-byte hashes */\n proof: Uint8Array[];\n /** The type check for the list's purpose (0 if caller doesn't care) */\n type: bigint | number;\n};\n\nexport type ReadParams = {\n /** The address of the merkle tree root creator */\n address: string;\n /** The name of the merkle tree root */\n name: string;\n /** The metadata key */\n key: string;\n};\n\nexport type VerifiedReadParams = VerifyParams & {\n /** The metadata key to read */\n key: string;\n};\n\n// ========== Write Method Params ==========\n\nexport type AddRootParams = MaybeSigner & {\n /** The name alias of the root being added (max 31 bytes) */\n name: string;\n /** The merkle tree root (32 bytes) */\n root: Uint8Array;\n /** The index of the tree type from box storage */\n type: bigint | number;\n};\n\nexport type UpdateRootParams = MaybeSigner & {\n /** The name of the merkle group data */\n name: string;\n /** The new 32 byte merkle tree root */\n newRoot: Uint8Array;\n};\n\nexport type DeleteRootParams = MaybeSigner & {\n /** The name of the merkle tree root */\n name: string;\n};\n\nexport type AddDataParams = MaybeSigner & {\n /** The name of the merkle tree root */\n name: string;\n /** The metadata key (max 15 bytes) */\n key: string;\n /** The metadata value (max 1024 bytes) */\n value: string;\n};\n\nexport type DeleteDataParams = MaybeSigner & {\n /** The name of the merkle tree root */\n name: string;\n /** The metadata key to delete */\n key: string;\n};\n\nexport type AddTypeParams = MaybeSigner & {\n /** Description of the tree type (max 800 bytes) */\n description: string;\n /** The schema list defining the leaf structure */\n schemaList: SchemaPart[];\n};\n\n","import { sha256 } from '@noble/hashes/sha256';\nimport { SchemaPart } from './types';\n\n/**\n * A merkle tree implementation compatible with the MetaMerkles contract.\n * Uses SHA256 for hashing (same as the on-chain contract).\n */\n\n// ========== Types ==========\n\nexport type HexString = `0x${string}`;\n\nexport interface MerkleTreeDump<T> {\n format: 'standard-v1';\n tree: string[];\n values: { value: T; treeIndex: number }[];\n leafEncoding: string;\n}\n\n// ========== Utility Functions ==========\n\n/**\n * Converts a Uint8Array to a hex string prefixed with 0x\n */\nexport function bytesToHex(bytes: Uint8Array): HexString {\n return `0x${Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('')}`;\n}\n\n/**\n * Converts a hex string (with or without 0x prefix) to Uint8Array\n */\nexport function hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Compares two byte arrays for sorting (used in merkle tree hashing)\n */\nfunction compareBytes(a: Uint8Array, b: Uint8Array): number {\n const len = Math.min(a.length, b.length);\n for (let i = 0; i < len; i++) {\n if (a[i] !== b[i]) {\n return a[i] - b[i];\n }\n }\n return a.length - b.length;\n}\n\n/**\n * Hash two nodes together, sorting them first (sorted pair hashing)\n * This matches the contract's hash function behavior\n */\nfunction hashPair(a: Uint8Array, b: Uint8Array): Uint8Array {\n // Sort the pair - larger value second (same as contract: if BigUint(a) > BigUint(b) then sha256(b.concat(a)))\n if (compareBytes(a, b) > 0) {\n return sha256(new Uint8Array([...b, ...a]));\n }\n return sha256(new Uint8Array([...a, ...b]));\n}\n\n// ========== Leaf Encoding Functions ==========\n\n/**\n * Encodes a value as bytes according to a schema part type.\n */\nexport function encodeValue(value: unknown, schemaPart: SchemaPart): Uint8Array {\n switch (schemaPart) {\n case SchemaPart.Uint8: {\n const buf = new Uint8Array(1);\n buf[0] = Number(value) & 0xff;\n return buf;\n }\n case SchemaPart.Uint16: {\n const buf = new Uint8Array(2);\n const view = new DataView(buf.buffer);\n view.setUint16(0, Number(value), false);\n return buf;\n }\n case SchemaPart.Uint32: {\n const buf = new Uint8Array(4);\n const view = new DataView(buf.buffer);\n view.setUint32(0, Number(value), false);\n return buf;\n }\n case SchemaPart.Uint64: {\n const buf = new Uint8Array(8);\n const view = new DataView(buf.buffer);\n view.setBigUint64(0, BigInt(value as bigint | number), false);\n return buf;\n }\n case SchemaPart.Uint128: {\n const buf = new Uint8Array(16);\n let n = BigInt(value as bigint | number);\n for (let i = 15; i >= 0; i--) {\n buf[i] = Number(n & 0xffn);\n n >>= 8n;\n }\n return buf;\n }\n case SchemaPart.Uint256: {\n const buf = new Uint8Array(32);\n let n = BigInt(value as bigint | number);\n for (let i = 31; i >= 0; i--) {\n buf[i] = Number(n & 0xffn);\n n >>= 8n;\n }\n return buf;\n }\n case SchemaPart.Uint512: {\n const buf = new Uint8Array(64);\n let n = BigInt(value as bigint | number);\n for (let i = 63; i >= 0; i--) {\n buf[i] = Number(n & 0xffn);\n n >>= 8n;\n }\n return buf;\n }\n case SchemaPart.Bytes4:\n case SchemaPart.Bytes8:\n case SchemaPart.Bytes16:\n case SchemaPart.Bytes32:\n case SchemaPart.Bytes64:\n case SchemaPart.Bytes128:\n case SchemaPart.Bytes256:\n case SchemaPart.Bytes512: {\n const sizes: Record<number, number> = {\n [SchemaPart.Bytes4]: 4,\n [SchemaPart.Bytes8]: 8,\n [SchemaPart.Bytes16]: 16,\n [SchemaPart.Bytes32]: 32,\n [SchemaPart.Bytes64]: 64,\n [SchemaPart.Bytes128]: 128,\n [SchemaPart.Bytes256]: 256,\n [SchemaPart.Bytes512]: 512,\n };\n const size = sizes[schemaPart];\n if (value instanceof Uint8Array) {\n if (value.length !== size) {\n throw new Error(`Expected ${size} bytes, got ${value.length}`);\n }\n return value;\n }\n // Handle hex string\n const bytes = hexToBytes(value as string);\n if (bytes.length !== size) {\n throw new Error(`Expected ${size} bytes, got ${bytes.length}`);\n }\n return bytes;\n }\n case SchemaPart.String: {\n return new TextEncoder().encode(value as string);\n }\n case SchemaPart.Address: {\n // Algorand addresses are 32 bytes when decoded from base32\n const addr = value as string;\n // Use algosdk-style decoding or raw bytes\n if (addr.length === 58) {\n // Base32 encoded Algorand address - decode it\n // For simplicity, if you have algosdk available, use decodeAddress\n // Here we'll just use raw bytes if provided as Uint8Array\n throw new Error('Please provide address as Uint8Array (32 bytes) or use decodeAlgorandAddress helper');\n }\n if (value instanceof Uint8Array && value.length === 32) {\n return value;\n }\n throw new Error('Address must be 32 bytes');\n }\n default:\n throw new Error(`Unknown schema part: ${schemaPart}`);\n }\n}\n\n/**\n * Encodes a leaf value using the given schema.\n * For single values, pass a single-element array schema.\n * For tuples, pass values and schema arrays of matching length.\n */\nexport function encodeLeaf(values: unknown[], schema: SchemaPart[]): Uint8Array {\n if (values.length !== schema.length) {\n throw new Error(`Values length (${values.length}) must match schema length (${schema.length})`);\n }\n \n const encoded = values.map((v, i) => encodeValue(v, schema[i]));\n const totalLength = encoded.reduce((sum, arr) => sum + arr.length, 0);\n const result = new Uint8Array(totalLength);\n \n let offset = 0;\n for (const arr of encoded) {\n result.set(arr, offset);\n offset += arr.length;\n }\n \n return result;\n}\n\n/**\n * Hashes a leaf value using SHA256.\n * The leaf is double-hashed: sha256(sha256(encoded_value))\n * This is the standard \"leaf prefix\" technique to prevent second preimage attacks.\n */\nexport function hashLeaf(encodedLeaf: Uint8Array): Uint8Array {\n // Double hash for leaf nodes (standard merkle tree practice)\n return sha256(sha256(encodedLeaf));\n}\n\n// ========== Merkle Tree Class ==========\n\n/**\n * A standard merkle tree implementation for use with MetaMerkles contract.\n * \n * @example\n * ```ts\n * // Create a tree of uint64 values\n * const tree = MerkleTree.of([1n, 2n, 3n], [SchemaPart.Uint64]);\n * \n * // Get the root to store on-chain\n * const root = tree.root;\n * \n * // Get proof for a specific value\n * const proof = tree.getProof(0); // proof for value at index 0\n * \n * // Verify a proof locally\n * const isValid = tree.verify(0, proof);\n * ```\n */\nexport class MerkleTree<T extends unknown[]> {\n private readonly tree: Uint8Array[];\n private readonly values: T[];\n private readonly schema: SchemaPart[];\n private readonly leafIndices: Map<number, number>; // value index -> tree index\n\n private constructor(values: T[], schema: SchemaPart[]) {\n this.values = values;\n this.schema = schema;\n this.leafIndices = new Map();\n this.tree = this.buildTree();\n }\n\n /**\n * Creates a new merkle tree from an array of values.\n * \n * For single-value leaves (e.g., uint64[]), pass each value as an array: [[1n], [2n], [3n]]\n * Or use the convenience form with a single-element schema.\n * \n * @param values - Array of leaf values (each value is an array matching the schema)\n * @param schema - The schema defining how to encode each leaf\n */\n static of<T extends unknown[]>(values: T[], schema: SchemaPart[]): MerkleTree<T> {\n if (values.length === 0) {\n throw new Error('Cannot create merkle tree with no values');\n }\n return new MerkleTree(values, schema);\n }\n\n /**\n * Creates a merkle tree for simple single-type values.\n * \n * @example\n * ```ts\n * // Tree of addresses\n * const tree = MerkleTree.ofSimple(addresses, SchemaPart.Address);\n * \n * // Tree of uint64 values\n * const tree = MerkleTree.ofSimple([1n, 2n, 3n], SchemaPart.Uint64);\n * ```\n */\n static ofSimple<T>(values: T[], schemaPart: SchemaPart): MerkleTree<[T]> {\n return MerkleTree.of(values.map(v => [v] as [T]), [schemaPart]);\n }\n\n /**\n * Loads a merkle tree from a dump (useful for persistence).\n */\n static load<T extends unknown[]>(dump: MerkleTreeDump<T>, schema: SchemaPart[]): MerkleTree<T> {\n const values = dump.values.map(v => v.value);\n return MerkleTree.of(values, schema);\n }\n\n private buildTree(): Uint8Array[] {\n const leaves = this.values.map(v => hashLeaf(encodeLeaf(v, this.schema)));\n \n // Handle power of 2 padding\n const n = leaves.length;\n const treeSize = 2 * n - 1;\n const tree: Uint8Array[] = new Array(treeSize);\n \n // Place leaves at the end of the tree array\n for (let i = 0; i < n; i++) {\n tree[treeSize - n + i] = leaves[i];\n this.leafIndices.set(i, treeSize - n + i);\n }\n \n // Build internal nodes from bottom up\n for (let i = treeSize - n - 1; i >= 0; i--) {\n const left = tree[2 * i + 1];\n const right = tree[2 * i + 2];\n tree[i] = right ? hashPair(left, right) : left;\n }\n \n return tree;\n }\n\n /**\n * The merkle root as a 32-byte Uint8Array.\n */\n get root(): Uint8Array {\n return this.tree[0];\n }\n\n /**\n * The merkle root as a hex string (0x prefixed).\n */\n get rootHex(): HexString {\n return bytesToHex(this.root);\n }\n\n /**\n * Number of leaves in the tree.\n */\n get length(): number {\n return this.values.length;\n }\n\n /**\n * Gets the proof for a leaf at the given index.\n * @param index - The index of the leaf value\n * @returns Array of 32-byte proof elements\n */\n getProof(index: number): Uint8Array[] {\n if (index < 0 || index >= this.values.length) {\n throw new Error(`Index ${index} out of bounds [0, ${this.values.length})`);\n }\n \n const proof: Uint8Array[] = [];\n let treeIndex = this.leafIndices.get(index)!;\n \n while (treeIndex > 0) {\n const siblingIndex = treeIndex % 2 === 0 ? treeIndex - 1 : treeIndex + 1;\n if (siblingIndex < this.tree.length && this.tree[siblingIndex]) {\n proof.push(this.tree[siblingIndex]);\n }\n treeIndex = Math.floor((treeIndex - 1) / 2);\n }\n \n return proof;\n }\n\n /**\n * Gets the proof for a leaf at the given index as hex strings.\n */\n getProofHex(index: number): HexString[] {\n return this.getProof(index).map(bytesToHex);\n }\n\n /**\n * Gets the leaf hash at the given index.\n */\n getLeafHash(index: number): Uint8Array {\n if (index < 0 || index >= this.values.length) {\n throw new Error(`Index ${index} out of bounds [0, ${this.values.length})`);\n }\n const treeIndex = this.leafIndices.get(index)!;\n return this.tree[treeIndex];\n }\n\n /**\n * Gets the leaf hash at the given index as a hex string.\n */\n getLeafHashHex(index: number): HexString {\n return bytesToHex(this.getLeafHash(index));\n }\n\n /**\n * Verifies a proof locally (without calling the contract).\n * @param index - The index of the leaf value to verify\n * @param proof - The proof array (optional, will be computed if not provided)\n * @returns true if the proof is valid\n */\n verify(index: number, proof?: Uint8Array[]): boolean {\n const actualProof = proof ?? this.getProof(index);\n let hash = this.getLeafHash(index);\n \n for (const sibling of actualProof) {\n hash = hashPair(hash, sibling);\n }\n \n return this.compareBytes(hash, this.root);\n }\n\n private compareBytes(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }\n\n /**\n * Iterates over all values with their indices.\n */\n *entries(): Generator<[number, T]> {\n for (let i = 0; i < this.values.length; i++) {\n yield [i, this.values[i]];\n }\n }\n\n /**\n * Gets the value at the given index.\n */\n getValue(index: number): T {\n if (index < 0 || index >= this.values.length) {\n throw new Error(`Index ${index} out of bounds [0, ${this.values.length})`);\n }\n return this.values[index];\n }\n\n /**\n * Finds the index of a value in the tree.\n * @param predicate - Function to test each value\n * @returns The index of the first matching value, or -1 if not found\n */\n findIndex(predicate: (value: T, index: number) => boolean): number {\n for (let i = 0; i < this.values.length; i++) {\n if (predicate(this.values[i], i)) {\n return i;\n }\n }\n return -1;\n }\n\n /**\n * Gets proof for a value matching the predicate.\n */\n getProofFor(predicate: (value: T, index: number) => boolean): { index: number; proof: Uint8Array[] } | null {\n const index = this.findIndex(predicate);\n if (index === -1) return null;\n return { index, proof: this.getProof(index) };\n }\n\n /**\n * Renders the tree as a string for debugging.\n */\n render(): string {\n const lines: string[] = ['Merkle Tree:'];\n lines.push(` Root: ${this.rootHex}`);\n lines.push(` Leaves: ${this.values.length}`);\n lines.push(' Values:');\n for (let i = 0; i < this.values.length; i++) {\n lines.push(` [${i}] ${JSON.stringify(this.values[i])} -> ${this.getLeafHashHex(i)}`);\n }\n return lines.join('\\n');\n }\n\n /**\n * Dumps the tree to a JSON-serializable format.\n */\n dump(): MerkleTreeDump<T> {\n return {\n format: 'standard-v1',\n tree: this.tree.map(bytesToHex),\n values: this.values.map((value, i) => ({\n value,\n treeIndex: this.leafIndices.get(i)!,\n })),\n leafEncoding: this.schema.map(s => SchemaPart[s]).join(','),\n };\n }\n}\n\n// ========== Helper Functions for Common Use Cases ==========\n\n/**\n * Creates a merkle tree of Algorand addresses.\n * @param addresses - Array of Algorand addresses as Uint8Array (32 bytes each)\n */\nexport function createAddressTree(addresses: Uint8Array[]): MerkleTree<[Uint8Array]> {\n return MerkleTree.ofSimple(addresses, SchemaPart.Address);\n}\n\n/**\n * Creates a merkle tree of uint64 values.\n */\nexport function createUint64Tree(values: (bigint | number)[]): MerkleTree<[bigint | number]> {\n return MerkleTree.ofSimple(values, SchemaPart.Uint64);\n}\n\n/**\n * Creates a merkle tree of asset IDs (uint64).\n */\nexport function createAssetTree(assetIds: (bigint | number)[]): MerkleTree<[bigint | number]> {\n return createUint64Tree(assetIds);\n}\n\n/**\n * Verifies a merkle proof against a root.\n * @param root - The expected merkle root (32 bytes)\n * @param leaf - The leaf hash to verify (32 bytes)\n * @param proof - Array of proof elements (each 32 bytes)\n * @returns true if the proof is valid\n */\nexport function verifyProof(root: Uint8Array, leaf: Uint8Array, proof: Uint8Array[]): boolean {\n let hash = leaf;\n for (const sibling of proof) {\n hash = hashPair(hash, sibling);\n }\n \n if (root.length !== hash.length) return false;\n for (let i = 0; i < root.length; i++) {\n if (root[i] !== hash[i]) return false;\n }\n return true;\n}\n\n"]}