@allbridge/bridge-core-sdk 3.27.0-alpha.2 → 3.27.0-alpha.3

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 (50) hide show
  1. package/dist/browser/index.js +2 -2
  2. package/dist/browser/index.js.map +4 -4
  3. package/dist/cjs/index.js +2 -2
  4. package/dist/cjs/index.js.map +4 -4
  5. package/dist/esm/index.js +2 -2
  6. package/dist/esm/index.js.map +4 -4
  7. package/dist/src/chains/chain.enums.d.ts +7 -2
  8. package/dist/src/chains/chain.enums.js +5 -0
  9. package/dist/src/chains/chain.enums.js.map +1 -1
  10. package/dist/src/chains/index.js +6 -0
  11. package/dist/src/chains/index.js.map +1 -1
  12. package/dist/src/configs/mainnet.js +1 -0
  13. package/dist/src/configs/mainnet.js.map +1 -1
  14. package/dist/src/services/bridge/index.js +5 -0
  15. package/dist/src/services/bridge/index.js.map +1 -1
  16. package/dist/src/services/bridge/models/bridge.model.d.ts +1 -0
  17. package/dist/src/services/bridge/models/bridge.model.js.map +1 -1
  18. package/dist/src/services/bridge/stx/index.d.ts +15 -0
  19. package/dist/src/services/bridge/stx/index.js +117 -0
  20. package/dist/src/services/bridge/stx/index.js.map +1 -0
  21. package/dist/src/services/bridge/utils.d.ts +3 -1
  22. package/dist/src/services/bridge/utils.js +23 -0
  23. package/dist/src/services/bridge/utils.js.map +1 -1
  24. package/dist/src/services/liquidity-pool/index.js +5 -0
  25. package/dist/src/services/liquidity-pool/index.js.map +1 -1
  26. package/dist/src/services/liquidity-pool/stx/index.d.ts +19 -0
  27. package/dist/src/services/liquidity-pool/stx/index.js +134 -0
  28. package/dist/src/services/liquidity-pool/stx/index.js.map +1 -0
  29. package/dist/src/services/models/index.d.ts +2 -1
  30. package/dist/src/services/models/index.js.map +1 -1
  31. package/dist/src/services/models/stx/clarigen-types.d.ts +657 -0
  32. package/dist/src/services/models/stx/clarigen-types.js +2296 -0
  33. package/dist/src/services/models/stx/clarigen-types.js.map +1 -0
  34. package/dist/src/services/token/index.js +5 -0
  35. package/dist/src/services/token/index.js.map +1 -1
  36. package/dist/src/services/token/stx/index.d.ts +17 -0
  37. package/dist/src/services/token/stx/index.js +50 -0
  38. package/dist/src/services/token/stx/index.js.map +1 -0
  39. package/dist/src/services/utils/stx/get-network.d.ts +2 -0
  40. package/dist/src/services/utils/stx/get-network.js +11 -0
  41. package/dist/src/services/utils/stx/get-network.js.map +1 -0
  42. package/dist/src/services/utils/stx/post-conditions.d.ts +3 -0
  43. package/dist/src/services/utils/stx/post-conditions.js +27 -0
  44. package/dist/src/services/utils/stx/post-conditions.js.map +1 -0
  45. package/dist/src/services/yield/index.js +3 -0
  46. package/dist/src/services/yield/index.js.map +1 -1
  47. package/dist/src/version.d.ts +1 -1
  48. package/dist/src/version.js +1 -1
  49. package/dist/src/version.js.map +1 -1
  50. package/package.json +5 -2
package/dist/esm/index.js CHANGED
@@ -1,7 +1,7 @@
1
- var Do=Object.create;var pa=Object.defineProperty;var Eo=Object.getOwnPropertyDescriptor;var _o=Object.getOwnPropertyNames;var $o=Object.getPrototypeOf,qo=Object.prototype.hasOwnProperty;var er=(r,i)=>()=>(r&&(i=r(r=0)),i);var Ni=(r,i)=>()=>(i||r((i={exports:{}}).exports,i),i.exports);var tr=(r,i,a,o)=>{if(i&&typeof i=="object"||typeof i=="function")for(let s of _o(i))!qo.call(r,s)&&s!==a&&pa(r,s,{get:()=>i[s],enumerable:!(o=Eo(i,s))||o.enumerable});return r};var Ne=(r,i,a)=>(a=r!=null?Do($o(r)):{},tr(i||!r||!r.__esModule?pa(a,"default",{value:r,enumerable:!0}):a,r));import{bcs as me}from"@mysten/sui/bcs";function zr(r,i=["<",">"]){let[a,o]=i,s=[],d="",A=0;for(let g=0;g<r.length;g++){let c=r[g];if(c===a&&A++,c===o&&A--,A===0&&c===","){s.push(d.trim()),d="";continue}d+=c}return s.push(d.trim()),s}function oe(r){if(typeof r!="string")throw new Error(`Illegal type passed as a name of the type: ${r}`);let[i,a]=["<",">"],o=r.indexOf(i),s=Array.from(r).reverse().indexOf(a);if(o===-1&&s===-1)return{typeName:r,typeArgs:[]};if(o===-1||s===-1)throw new Error(`Unclosed generic in name '${r}'`);let d=r.slice(0,o),A=zr(r.slice(o+1,r.length-s-1),[i,a]);return{typeName:d,typeArgs:A}}function no(r){return!r||typeof r!="object"||Array.isArray(r)?!1:"GasCoin"in r||"Input"in r||"Result"in r||"NestedResult"in r}function N(r,i){return no(i)?i:r.object(i)}function Be(r,i,a){if(no(i))return N(r,i);function o(l){let{typeName:u,typeArgs:m}=oe(l);switch(u){case"bool":return me.Bool;case"u8":return me.U8;case"u16":return me.U16;case"u32":return me.U32;case"u64":return me.U64;case"u128":return me.U128;case"u256":return me.U256;case"address":return me.Address;case"0x1::string::String":case"0x1::ascii::String":return me.String;case"0x2::object::ID":return me.Address;case"0x1::option::Option":return me.option(o(m[0]));case"vector":return me.vector(o(m[0]));default:throw new Error(`invalid primitive type ${l}`)}}function s(l){for(let u of l){if(typeof u>"u"||u===null)return!0;if(Array.isArray(u))return s(u)}return!1}function d(l){for(let u of l){if(!Array.isArray(u)){if(u===null)continue;switch(typeof u){case"string":case"number":case"bigint":case"boolean":continue;default:return!1}}return d(u)}return!0}function A(l){for(let u of l){if(!Array.isArray(u))switch(typeof u){case"string":case"number":case"bigint":case"boolean":return!0;default:continue}return A(u)}return!1}let{typeName:g,typeArgs:c}=oe(a);switch(g){case"0x1::option::Option":if(i===null)return r.pure.option("bool",null);if(d([i]))return r.pure(o(a).serialize(i));if(A([i]))throw new Error("mixing primitive and TransactionArgument values is not supported");return r.moveCall({target:"0x1::option::some",typeArguments:[c[0]],arguments:[Be(r,i,c[0])]});case"vector":if(!Array.isArray(i))throw new Error("expected an array for vector type");if(i.length===0)return r.pure(me.vector(me.Bool).serialize([]));if(s(i))throw new Error("the provided array contains undefined or null values");if(d(i))return r.pure(o(a).serialize(i));if(A(i))throw new Error("mixing primitive and TransactionArgument values is not supported");return r.makeMoveVec({type:c[0],elements:i});default:return r.pure(o(a).serialize(i))}}function xr(r){let i=r.split("0x").join("");for(let a=0;a<i.length;a++)if(i[a]!=="0")return`0x${i.substring(a)}`;return"0x0"}function G(r){let{typeName:i,typeArgs:a}=oe(r);switch(i){case"bool":case"u8":case"u16":case"u32":case"u64":case"u128":case"u256":case"address":case"signer":return i;case"vector":return`vector<${G(a[0])}>`;default:{let o=i.split("::");o[0]=xr(o[0]);let s=o.join("::");return a.length>0?`${s}<${a.map(d=>G(d)).join(",")}>`:s}}}function j(r,...i){return i.length>0?`${r}<${i.join(", ")}>`:r}var ne=er(()=>{"use strict"});var nt=Ni((Il,io)=>{"use strict";ne();var Qi=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return G(r.$PACKAGE_ID)}get PUBLISHED_AT(){return G(r.$PUBLISHED_AT)}get PKG_V1(){return G(r.$PKG_V[1])}setPackageId(i){r.$PACKAGE_ID=i}setPublishedAt(i){r.$PUBLISHED_AT=i}setPkgV(i,a){r.$PKG_V[i]=a}setAddress(i,a){r.$PACKAGE_ID=i,r.$PUBLISHED_AT=i,r.$PKG_V[1]=a||i}},Or=new Qi;io.exports=Or});var Ei=Ni((vl,co)=>{"use strict";ne();var Di=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return G(r.$PACKAGE_ID)}get PUBLISHED_AT(){return G(r.$PUBLISHED_AT)}get PKG_V1(){return G(r.$PKG_V[1])}setPackageId(i){r.$PACKAGE_ID=i}setPublishedAt(i){r.$PUBLISHED_AT=i}setPkgV(i,a){r.$PKG_V[i]=a}setAddress(i,a){r.$PACKAGE_ID=i,r.$PUBLISHED_AT=i,r.$PKG_V[1]=a||i}},Qr=new Di;co.exports=Qr});var qi=Ni((Bl,uo)=>{"use strict";ne();var $i=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return G(r.$PACKAGE_ID)}get PUBLISHED_AT(){return G(r.$PUBLISHED_AT)}get PKG_V1(){return G(r.$PKG_V[1])}setPackageId(i){r.$PACKAGE_ID=i}setPublishedAt(i){r.$PUBLISHED_AT=i}setPkgV(i,a){r.$PKG_V[i]=a}setAddress(i,a){r.$PACKAGE_ID=i,r.$PUBLISHED_AT=i,r.$PKG_V[1]=a||i}},Kr=new $i;uo.exports=Kr});var Cn={coreApiUrl:"https://core.api.allbridgecoreapi.net",coreApiQueryParams:{},coreApiHeaders:{},jupiterUrl:"https://lite-api.jup.ag/swap/v1",wormholeMessengerProgramId:"worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth",solanaLookUpTable:"2JcBAEVnAwVo4u8d61iqgHPrzZuugur7cVTjWubsVLHj",sorobanNetworkPassphrase:"Public Global Stellar Network ; September 2015",tronJsonRpc:"https://api.trongrid.io/jsonrpc",cctpParams:{cctpTransmitterProgramId:"CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd",cctpTokenMessengerMinter:"CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3",cctpDomains:{ETH:0,AVA:1,OPT:2,ARB:3,SOL:5,BAS:6,POL:7,SUI:8}},cachePoolInfoChainSec:20},Gd={solanaRpcUrl:"https://api.mainnet-beta.solana.com",tronRpcUrl:"https://api.trongrid.io"},Fd={SOL:"https://api.mainnet-beta.solana.com",TRX:"https://api.trongrid.io",SRB:"https://rpc.stellar.org:443",STLR:"https://horizon.stellar.org",SUI:"https://fullnode.mainnet.sui.io"};import{AlgorandClient as vo}from"@algorandfoundation/algokit-utils";import{TronWeb as os}from"tronweb";import{Web3 as rs}from"web3";var K=class extends Error{errorCode;constructor(i,a){super(a),this.errorCode=i}},I=class extends K{constructor(i){super("SdkError",i)}},Qe=class extends K{constructor(i){super("InvalidAmountError",i)}},It=class extends K{constructor(i){super("AmountNotEnoughError",i)}},Ke=class extends K{constructor(i){super("InsufficientPoolLiquidityError",i)}},ie=class extends K{constructor(i){super("JupiterError",i)}},Jt=class extends K{constructor(i){super("InvalidGasFeePaymentOptionError",i)}},In=class extends K{constructor(i){super("InvalidMessengerOptionError",i)}},k=class extends K{constructor(i){super("MethodNotSupportedError",i)}},kt=class extends K{constructor(i){super("VerifyTxError",i)}},bt=class extends K{constructor(i){super("InvalidTxError",i)}},bn=class extends K{constructor(i){super("ExtraGasMaxLimitExceededError",i)}},yn=class extends K{constructor(i,a,o){super("ArgumentInvalidDecimalsError",`Argument '${i}' decimals '${a}' cannot be greater than '${o}'`)}},zt=class extends K{constructor(i){super("TimeoutError",i)}},hn=class extends K{constructor(i){super("NodeRpcUrlNotInitializedError",`For chain '${i}' Node RPC URL not initialized`)}},se=class extends K{constructor(i){super("CCTPDoesNotSupportedError",i)}},de=class extends K{constructor(i){super("OFTDoesNotSupportedError",i)}},vn=class extends K{constructor(i){super("YieldDoesNotSupportedError",i)}},Yn=class extends K{constructor(){super("TxTooLargeError","Transaction too large: try again later or switch to another messenger or pay relayer fee in native gas currency")}},nr=(Y=>(Y.SDK_ERROR="SdkError",Y.INVALID_AMOUNT_ERROR="InvalidAmountError",Y.AMOUNT_NOT_ENOUGH_ERROR="AmountNotEnoughError",Y.INSUFFICIENT_POOL_LIQUIDITY_ERROR="InsufficientPoolLiquidityError",Y.JUPITER_ERROR="JupiterError",Y.INVALID_GAS_FEE_PAYMENT_OPTION_ERROR="InvalidGasFeePaymentOptionError",Y.INVALID_MESSENGER_OPTION_ERROR="InvalidMessengerOptionError",Y.METHOD_NOT_SUPPORTED_ERROR="MethodNotSupportedError",Y.VERIFY_TX_ERROR="VerifyTxError",Y.INVALID_TX_ERROR="InvalidTxError",Y.EXTRA_GAS_MAX_LIMIT_EXCEEDED_ERROR="ExtraGasMaxLimitExceededError",Y.ARGUMENT_INVALID_DECIMALS_ERROR="ArgumentInvalidDecimalsError",Y.TIMEOUT_ERROR="TimeoutError",Y.NODE_RPC_URL_NOT_INITIALIZED_ERROR="NodeRpcUrlNotInitializedError",Y.CCTP_DOES_NOT_SUPPORTED_ERROR="CCTPDoesNotSupportedError",Y.OFT_DOES_NOT_SUPPORTED_ERROR="OFTDoesNotSupportedError",Y.YIELD_DOES_NOT_SUPPORTED_ERROR="YieldDoesNotSupportedError",Y.TX_TOO_LARGE="TxTooLargeError",Y))(nr||{});var Ie=(v=>(v.BSC="BSC",v.ETH="ETH",v.BAS="BAS",v.SOL="SOL",v.TRX="TRX",v.POL="POL",v.ARB="ARB",v.CEL="CEL",v.AVA="AVA",v.SRB="SRB",v.STLR="STLR",v.OPT="OPT",v.SUI="SUI",v.SNC="SNC",v.UNI="UNI",v.LIN="LIN",v.ALG="ALG",v))(Ie||{}),z=(A=>(A.EVM="EVM",A.SOLANA="SOLANA",A.TRX="TRX",A.SRB="SRB",A.SUI="SUI",A.ALG="ALG",A))(z||{});var ir={EVM:18,SOLANA:9,TRX:6,SRB:7,SUI:9,ALG:6},ar={BSC:{chainSymbol:"BSC",chainId:"0x38",name:"BNB Chain",chainType:"EVM"},ETH:{chainSymbol:"ETH",chainId:"0x1",name:"Ethereum",chainType:"EVM"},BAS:{chainSymbol:"BAS",chainId:"0x2105",name:"Base",chainType:"EVM"},ARB:{chainSymbol:"ARB",chainId:"0xa4b1",name:"Arbitrum",chainType:"EVM"},AVA:{chainSymbol:"AVA",chainId:"0xa86a",name:"Avalanche",chainType:"EVM"},CEL:{chainSymbol:"CEL",chainId:"0xa4ec",name:"Celo",chainType:"EVM"},POL:{chainSymbol:"POL",chainId:"0x89",name:"Polygon",chainType:"EVM"},OPT:{chainSymbol:"OPT",chainId:"0xa",name:"OP Mainnet",chainType:"EVM"},SNC:{chainSymbol:"SNC",chainId:"0x92",name:"Sonic",chainType:"EVM"},UNI:{chainSymbol:"UNI",chainId:"0x82",name:"Unichain",chainType:"EVM"},LIN:{chainSymbol:"LIN",chainId:"0xe708",name:"Linea",chainType:"EVM"},SOL:{chainSymbol:"SOL",name:"Solana",chainType:"SOLANA"},TRX:{chainSymbol:"TRX",name:"Tron",chainType:"TRX"},SRB:{chainSymbol:"SRB",name:"Stellar",chainType:"SRB"},STLR:{chainSymbol:"STLR",name:"Stellar",chainType:"SRB"},SUI:{chainSymbol:"SUI",name:"Sui",chainType:"SUI"},ALG:{chainSymbol:"ALG",name:"Algorand",chainType:"ALG"}},X=(()=>{let r={...ar};return{addChainsProperties(i){r={...r,...i}},getChainProperty(i){let a=r[i];if(!a)throw new I(`Cannot find chain properties for ${i}`);return a},getChainsProperties(){return r},getChainDecimalsByType(i){return ir[i]}}})();var Ti=(A=>(A.OK="OK",A.INVALID="INVALID",A.FORBIDDEN="FORBIDDEN",A.UNINITIALIZED="UNINITIALIZED",A.CONTRACT_ADDRESS="CONTRACT_ADDRESS",A.WRONG_ASSOCIATED_ACCOUNT_OWNER="WRONG_ASSOCIATED_ACCOUNT_OWNER",A))(Ti||{});var Ye=(d=>(d[d.ALLBRIDGE=1]="ALLBRIDGE",d[d.WORMHOLE=2]="WORMHOLE",d[d.CCTP=3]="CCTP",d[d.CCTP_V2=4]="CCTP_V2",d[d.OFT=5]="OFT",d))(Ye||{});import{Big as Ca}from"big.js";async function $(r,i){return await r.getPoolInfoByKey({chainSymbol:i.chainSymbol,poolAddress:i.poolAddress})}function V(r){if(Ca(r).lte(0))throw new Qe("Amount must be greater than zero")}function H(r,i,a){let o=Ca(i).toFixed(),[s,d]=o.split(".");if(d&&d.length>a)throw new yn(r,d.length,a)}async function Rn(r,i,a){return await Promise.race([r,new Promise((o,s)=>{setTimeout(()=>s(new zt(i)),a)})])}async function wi(r,i,a,o){if(a<1)throw new Error(`Bad argument: 'maxRetries' must be greater than 0, but ${a} was received.`);let s=0;for(;;)try{return await Rn(r(),i,o)}catch{if(++s>=a)throw new zt(i)}}async function Ia(r,i,a,o=1.5,s=!1){let d=[],A=0,g=await r();if(d.push(g),!i(g))return d;let c=new Date(Date.now()+a*1e3).valueOf(),l=1e3,u=l;for(;Date.now()<c;){let m=d[d.length-1];if(m===void 0||!i(m))break;A++,s&&console.info(`Waiting ${l}ms before trying again (bringing the total wait time to ${u}ms so far, of total ${a*1e3}ms)`),await new Promise(b=>setTimeout(b,l)),l=l*o,new Date(Date.now()+l).valueOf()>c&&(l=c-Date.now(),s&&console.info(`was gonna wait too long; new waitTime: ${l}ms`)),u=l+u;let p=await r(m);d.push(p),s&&i(p)&&console.info(`${A}. Called ${r.name}; ${d.length} prev attempts. Most recent: ${JSON.stringify(d[d.length-1],null,2)}`)}return d}import{AlgoAmount as vr}from"@algorandfoundation/algokit-utils/types/amount";import fa,{Address as Na}from"algosdk";import{getArc56ReturnValue as or}from"@algorandfoundation/algokit-utils/types/app-arc56";import{AppClient as Wn}from"@algorandfoundation/algokit-utils/types/app-client";import{AppFactory as iA}from"@algorandfoundation/algokit-utils/types/app-factory";var Bn={name:"Bridge",structs:{},methods:[{name:"createApplication",args:[{type:"address",name:"owner"},{type:"byte",name:"chainId"},{type:"application",name:"messenger"},{type:"application",name:"gasOracle"}],returns:{type:"void"},actions:{create:["NoOp"],call:[]},readonly:!1,events:[],recommendations:{}},{name:"optInAsset",args:[{type:"uint64",name:"assetId"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"noop",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"swapAndBridge",args:[{type:"uint64",name:"tokenId"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"uint64",name:"feeTokenAmount",defaultValue:{source:"literal",data:"AAAAAAAAAAA=",type:"uint64"}}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"BridgingFeeFromTokens",args:[{type:"uint64",name:"feeFromNative"},{type:"uint64",name:"feeFromStable"},{type:"uint64",name:"feeStableTokenAmount"}]},{name:"ReceiveFee",args:[{type:"uint64",name:"bridgeTransactionCost"},{type:"uint64",name:"messageTransactionCost"}]},{name:"TokensSent",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"}]}],recommendations:{}},{name:"receiveTokens",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"sourceChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"uint64",name:"receiveAmountMin"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"TokensReceived",args:[{type:"uint64",name:"receiveAmount"},{type:"address",name:"recipient"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"},{type:"byte[32]",name:"message"}]}],recommendations:{}},{name:"registerBridge",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"bridgeAddress"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"addBridgeToken",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"tokenAddress"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"removeBridgeToken",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"tokenAddress"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"withdrawGasTokens",args:[{type:"uint64",name:"amount"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"withdrawBridgingFeeInTokens",args:[{type:"uint64",name:"assetId"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"getBridgingCostInTokens",args:[{type:"byte",name:"destinationChainId"},{type:"uint64",name:"tokenId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"hashMessage",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"sourceChainId"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"}],returns:{type:"byte[32]"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"isOtherBridgeTokenSupported",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"token"}],returns:{type:"bool"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"getTransactionCost",args:[{type:"byte",name:"chainId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"getReceiveTokensCost",args:[],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"getSendTransactionStorageCost",args:[],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"swap",args:[{type:"uint64",name:"tokenId",desc:"The token to be swapped."},{type:"uint64",name:"receiveTokenId",desc:"The token to receive in exchange for the swapped token."},{type:"address",name:"recipient",desc:"The address to receive the tokens."},{type:"uint64",name:"receiveAmountMin",desc:"The minimum amount of tokens required to receive during the swap."}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"Swapped",args:[{type:"address",name:"sender"},{type:"address",name:"recipient"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"receiveTokenId"},{type:"uint64",name:"amount"},{type:"uint64",name:"receivedAmount"}]}],recommendations:{}},{name:"addPool",args:[{type:"uint64",name:"poolId",desc:"The address of the `Pool` contract."},{type:"uint64",name:"tokenId",desc:"The address of the token in the liquidity pool."}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"removePool",args:[{type:"uint64",name:"tokenId"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"stopSwap",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"startSwap",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setStopAuthority",args:[{type:"address",name:"stopAuthority"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setRebalancer",args:[{type:"address",name:"rebalancer"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"getGasUsage",args:[{type:"byte",name:"chainId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"setGasUsage",args:[{type:"byte",name:"chainId"},{type:"uint64",name:"gasAmount"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setGasOracle",args:[{type:"application",name:"gasOracle"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"getTransactionRelayerCost",args:[{type:"byte",name:"chainId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"transferOwnership",args:[{type:"address",name:"newOwner"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}}],arcs:[22,28],networks:{},state:{schema:{global:{ints:3,bytes:4},local:{ints:0,bytes:0}},keys:{global:{chainId:{keyType:"AVMString",valueType:"byte",key:"Y2hhaW5JZA=="},messenger:{keyType:"AVMString",valueType:"AVMUint64",key:"bWVzc2VuZ2Vy"},stopAuthority:{keyType:"AVMString",valueType:"address",key:"c3RvcEF1dGhvcml0eQ=="},rebalancer:{keyType:"AVMString",valueType:"address",key:"cmViYWxhbmNlcg=="},canSwap:{keyType:"AVMString",valueType:"AVMUint64",key:"Y2FuU3dhcA=="},gasOracle:{keyType:"AVMString",valueType:"AVMUint64",key:"Z2FzT3JhY2xl"},owner:{keyType:"AVMString",valueType:"address",key:"b3duZXI="}},local:{},box:{}},maps:{global:{},local:{},box:{processedMessages:{keyType:"byte[32]",valueType:"byte[0]",prefix:"bQ=="},sentMessages:{keyType:"byte[32]",valueType:"byte[0]",prefix:"cw=="},otherBridges:{keyType:"byte",valueType:"byte[32]",prefix:"Yg=="},otherBridgeTokens:{keyType:"AVMBytes",valueType:"byte[0]",prefix:"dA=="},pools:{keyType:"uint64",valueType:"uint64",prefix:"cA=="},fromGasOracleScalingFactor:{keyType:"uint64",valueType:"uint64",prefix:"ZQ=="},bridgingFeeConversionScalingFactor:{keyType:"uint64",valueType:"uint64",prefix:"Zg=="},gasUsage:{keyType:"byte",valueType:"uint64",prefix:"Zw=="}}}},bareActions:{create:[],call:[]},sourceInfo:{approval:{sourceInfo:[{pc:[906],errorMessage:"Asset must go to app"},{pc:[889],errorMessage:"Asset txn missing"},{pc:[1391,1858,2149,2235,2329,2371],errorMessage:"Box must have value"},{pc:[1122],errorMessage:"Bridge: amount too low for fee"},{pc:[1130],errorMessage:"Bridge: bridge to the zero address"},{pc:[1518],errorMessage:"Bridge: message processed"},{pc:[1561],errorMessage:"Bridge: no message"},{pc:[1352,1469],errorMessage:"Bridge: not enough fee"},{pc:[1460],errorMessage:"Bridge: source not registered"},{pc:[1242],errorMessage:"Bridge: tokens already sent"},{pc:[1205],errorMessage:"Bridge: unknown chain or token"},{pc:[1192],errorMessage:"Bridge: wrong destination chain"},{pc:[1283,1437,1558,1797,1844,2213,2314,2415],errorMessage:"Bytes has valid prefix"},{pc:[927],errorMessage:"CloseTo not allowed"},{pc:[1248],errorMessage:"Index access is out of bounds"},{pc:[341,356,376,394,413,433,448,463,475,487,503,523,550,562,574,594,622,657,681,697,713,731,749,767,799,831,840,856],errorMessage:"OnCompletion is not NoOp"},{pc:[2425],errorMessage:"Only owner"},{pc:[920],errorMessage:"Rekey not allowed"},{pc:[2094],errorMessage:"Router: is not stopAuthority"},{pc:[2230],errorMessage:"Router: no pool"},{pc:[2144],errorMessage:"Router: no receive pool"},{pc:[1112,1450,1947],errorMessage:"Router: swap prohibited"},{pc:[913],errorMessage:"Wrong asset"},{pc:[1724],errorMessage:"account opted into asset"},{pc:[1291,2240],errorMessage:"application exists"},{pc:[2035],errorMessage:"asset exists"},{pc:[860],errorMessage:"can only call when creating"},{pc:[344,359,379,397,416,436,451,466,478,490,506,526,553,565,577,597,625,660,684,700,716,734,752,770,802,834,843],errorMessage:"can only call when not creating"},{pc:[1111,1188,1210,1255,1288,1295,1400,1405,1449,1474,1526,1692,1732,1767,1804,1946,2092,2161,2266,2377,2423],errorMessage:"check GlobalState exists"},{pc:[1910],errorMessage:"invalid size"},{pc:[899],errorMessage:"transaction type is axfer"},{pc:[975],errorMessage:"transaction type is pay"}],pcOffsetMethod:"none"},clear:{sourceInfo:[],pcOffsetMethod:"none"}},source:{approval:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDYgNCAxNTcwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjYW5Td2FwIiAibWVzc2VuZ2VyIiAib3duZXIiICJnYXNPcmFjbGUiICJjaGFpbklkIiAicmViYWxhbmNlciIgInQiICJwIiAweDAwICJzdG9wQXV0aG9yaXR5IiAweDAxICJnIiAweDQzNDE3YWEzIDB4Zjc0NzViODIgMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgcmViYWxhbmNlciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUAzNgogICAgcHVzaGJ5dGVzcyAweGZmZjgyODQxIDB4NjVmNzA1NzMgMHhlODNhODdhYiAweDJjOWY2ODQ3IDB4MzE5MTliMjggMHg0ZWJhMDcyMSAweGM2MTdlZDczIDB4NTc1MzE1NjAgMHg2MzgwODI3OCAweDA2NTA3YzZhIDB4ZjVmOTZlYjMgMHg0YjA2MmNhMCAweGMzY2RkOTJhIC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oYWRkcmVzcyxieXRlLGFwcGxpY2F0aW9uLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgIm9wdEluQXNzZXQodWludDY0KXZvaWQiLCBtZXRob2QgIm5vb3AoKXZvaWQiLCBtZXRob2QgInN3YXBBbmRCcmlkZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlY2VpdmVUb2tlbnModWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlZ2lzdGVyQnJpZGdlKGJ5dGUsYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAiYWRkQnJpZGdlVG9rZW4oYnl0ZSxieXRlWzMyXSl2b2lkIiwgbWV0aG9kICJyZW1vdmVCcmlkZ2VUb2tlbihieXRlLGJ5dGVbMzJdKXZvaWQiLCBtZXRob2QgIndpdGhkcmF3R2FzVG9rZW5zKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnModWludDY0KXZvaWQiLCBtZXRob2QgImdldEJyaWRnaW5nQ29zdEluVG9rZW5zKGJ5dGUsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiaGFzaE1lc3NhZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZSxieXRlWzMyXSxieXRlWzMyXSlieXRlWzMyXSIsIG1ldGhvZCAiaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGJ5dGUsYnl0ZVszMl0pYm9vbCIKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25Db3N0KGJ5dGUpdWludDY0IgogICAgcHVzaGJ5dGVzcyAweDA3ZGY4NDI5IDB4ODBjNWM3MGYgMHhmYWIxMTFhMiAweGVmMTVmODU1IDB4NmIxZWUyMjMgMHgxODcwYTQ5MiAweDM1NTczMjRkIDB4MDRiMTYxZjEgMHhkMmIzNTdlYiAvLyBtZXRob2QgImdldFJlY2VpdmVUb2tlbnNDb3N0KCl1aW50NjQiLCBtZXRob2QgImdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCl1aW50NjQiLCBtZXRob2QgInN3YXAodWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhZGRQb29sKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAicmVtb3ZlUG9vbCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic3RvcFN3YXAoKXZvaWQiLCBtZXRob2QgInN0YXJ0U3dhcCgpdm9pZCIsIG1ldGhvZCAic2V0U3RvcEF1dGhvcml0eShhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldFJlYmFsYW5jZXIoYWRkcmVzcyl2b2lkIgogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJnZXRHYXNVc2FnZShieXRlKXVpbnQ2NCIKICAgIHB1c2hieXRlc3MgMHgwY2E1YWU3YSAweDM5N2I5MThiIDB4Y2JmYzZkMDIgMHhlMTdiYWZiNCAvLyBtZXRob2QgInNldEdhc1VzYWdlKGJ5dGUsdWludDY0KXZvaWQiLCBtZXRob2QgInNldEdhc09yYWNsZShhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGJ5dGUpdWludDY0IiwgbWV0aG9kICJ0cmFuc2Zlck93bmVyc2hpcChhZGRyZXNzKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDUgbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDYgbWFpbl9ub29wX3JvdXRlQDcgbWFpbl9zd2FwQW5kQnJpZGdlX3JvdXRlQDggbWFpbl9yZWNlaXZlVG9rZW5zX3JvdXRlQDkgbWFpbl9yZWdpc3RlckJyaWRnZV9yb3V0ZUAxMCBtYWluX2FkZEJyaWRnZVRva2VuX3JvdXRlQDExIG1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTIgbWFpbl93aXRoZHJhd0dhc1Rva2Vuc19yb3V0ZUAxMyBtYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNCBtYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1IG1haW5faGFzaE1lc3NhZ2Vfcm91dGVAMTYgbWFpbl9pc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWRfcm91dGVAMTcgbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTggbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOSBtYWluX2dldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0X3JvdXRlQDIwIG1haW5fc3dhcF9yb3V0ZUAyMSBtYWluX2FkZFBvb2xfcm91dGVAMjIgbWFpbl9yZW1vdmVQb29sX3JvdXRlQDIzIG1haW5fc3RvcFN3YXBfcm91dGVAMjQgbWFpbl9zdGFydFN3YXBfcm91dGVAMjUgbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDI2IG1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNyBtYWluX2dldEdhc1VzYWdlX3JvdXRlQDI4IG1haW5fc2V0R2FzVXNhZ2Vfcm91dGVAMjkgbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzAgbWFpbl9nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0X3JvdXRlQDMxIG1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzIKCm1haW5fYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdHJhbnNmZXJPd25lcnNoaXAKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdF9yb3V0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0R2FzT3JhY2xlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldEdhc1VzYWdlX3JvdXRlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRHYXNVc2FnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRHYXNVc2FnZV9yb3V0ZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjE3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0R2FzVXNhZ2UKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTQ2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRSZWJhbGFuY2VyCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldFN0b3BBdXRob3JpdHlfcm91dGVAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0U3RvcEF1dGhvcml0eQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFydFN3YXBfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RhcnRTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0b3BTd2FwX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0b3BTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZVBvb2xfcm91dGVAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTEwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlUG9vbAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRQb29sX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZFBvb2wKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjc4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdF9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzI3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25Db3N0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2lzT3RoZXJCcmlkZ2VUb2tlblN1cHBvcnRlZF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBpc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQKICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2hhc2hNZXNzYWdlX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyODMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI4MwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGhhc2hNZXNzYWdlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGdldEJyaWRnaW5nQ29zdEluVG9rZW5zCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiB3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fd2l0aGRyYXdHYXNUb2tlbnNfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgd2l0aGRyYXdHYXNUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkQnJpZGdlVG9rZW5fcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVnaXN0ZXJCcmlkZ2Vfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVnaXN0ZXJCcmlkZ2UKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVjZWl2ZVRva2Vuc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlY2VpdmVUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcEFuZEJyaWRnZV9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIGNhbGxzdWIgc3dhcEFuZEJyaWRnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9ub29wX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgY2FsbHN1YiBvcHRJbkFzc2V0CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6Z2V0UHJldkFzc2V0UGF5KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRQcmV2QXNzZXRQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2QXNzZXRQYXkoYXNzZXRJZDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjM2CiAgICAvLyBhc3NlcnQoVHhuLmdyb3VwSW5kZXggPiAwLCBgQXNzZXQgdHhuIG1pc3NpbmdgKTsKICAgIHR4biBHcm91cEluZGV4CiAgICBhc3NlcnQgLy8gQXNzZXQgdHhuIG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czozOQogICAgLy8gY29uc3QgcHJldklkeDogdWludDY0ID0gVHhuLmdyb3VwSW5kZXggLSAxOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGNvbnN0IHBheSA9IGd0eG4uQXNzZXRUcmFuc2ZlclR4bihwcmV2SWR4KTsKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDQKICAgIC8vIGFzc2VydChwYXkuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGBBc3NldCBtdXN0IGdvIHRvIGFwcGApOwogICAgZHVwCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBBc3NldCBtdXN0IGdvIHRvIGFwcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjQ1CiAgICAvLyBhc3NlcnQocGF5LnhmZXJBc3NldC5pZCA9PT0gYXNzZXRJZCwgYFdyb25nIGFzc2V0YCk7CiAgICBkdXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDgKICAgIC8vIGFzc2VydChwYXkucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCBgUmVrZXkgbm90IGFsbG93ZWRgKTsKICAgIGR1cAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFJla2V5IG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDkKICAgIC8vIGFzc2VydChwYXkuYXNzZXRDbG9zZVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsIGBDbG9zZVRvIG5vdCBhbGxvd2VkYCk7CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIENsb3NlVG8gbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo1MAogICAgLy8gcmV0dXJuIHBheS5hc3NldEFtb3VudDsKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6OmdldFByZXZQYXkocmVsVHhJbmRleDogdWludDY0KSAtPiB1aW50NjQ6CmdldFByZXZQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTMKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2UGF5KHJlbFR4SW5kZXg6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTQKICAgIC8vIGlmIChUeG4uZ3JvdXBJbmRleCA8IHJlbFR4SW5kZXgpIHJldHVybiAwOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTYKICAgIC8vIGNvbnN0IHR4SWR4OiB1aW50NjQgPSBUeG4uZ3JvdXBJbmRleCAtIHJlbFR4SW5kZXg7CiAgICB0eG4gR3JvdXBJbmRleAogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU4CiAgICAvLyBpZiAoZ3R4bi5UcmFuc2FjdGlvbih0eElkeCkudHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpIHJldHVybiAwOwogICAgZ3R4bnMgVHlwZUVudW0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU5CiAgICAvLyBjb25zdCBwYXkgPSBndHhuLlBheW1lbnRUeG4odHhJZHgpOwogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo2MQogICAgLy8gaWYgKHBheS5yZWNlaXZlciAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIHJldHVybiAwOwogICAgZnJhbWVfZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjYzCiAgICAvLyBpZiAocGF5LnJla2V5VG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgMQogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDgKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NjQKICAgIC8vIGlmIChwYXkuY2xvc2VSZW1haW5kZXJUbyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSByZXR1cm4gMDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBDbG9zZVJlbWFpbmRlclRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBnZXRQcmV2UGF5X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjY2CiAgICAvLyByZXR1cm4gcGF5LmFtb3VudDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBieXRlcywgY2hhaW5JZDogYnl0ZXMsIG1lc3NlbmdlcjogdWludDY0LCBnYXNPcmFjbGU6IHVpbnQ2NCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgcHJvdG8gNCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo5CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxNAogICAgLy8gdGhpcy5nYXNPcmFjbGUudmFsdWUgPSBnYXNPcmFjbGU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM5CiAgICAvLyBwcml2YXRlIHN0b3BBdXRob3JpdHkgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1NAogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcwCiAgICAvLyB0aGlzLmNoYWluSWQudmFsdWUgPSBjaGFpbklkOwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyB0aGlzLm1lc3Nlbmdlci52YWx1ZSA9IG1lc3NlbmdlcjsKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5vcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdm9pZDoKb3B0SW5Bc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIG9wdEluQXNzZXQoYXNzZXRJZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzUKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo4MgogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc4LTgzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IEFzc2V0KGFzc2V0SWQpLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIGxvZygnQnJpZGdlOiBvcHQtaW4gY29tcGxldGVkJyk7CiAgICBwdXNoYnl0ZXMgIkJyaWRnZTogb3B0LWluIGNvbXBsZXRlZCIKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnN3YXBBbmRCcmlkZ2UodG9rZW5JZDogdWludDY0LCByZWNpcGllbnQ6IGJ5dGVzLCBkZXN0aW5hdGlvbkNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMsIGZlZVRva2VuQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CnN3YXBBbmRCcmlkZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjkzLTEwNQogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIC8vIHN3YXBBbmRCcmlkZ2UoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGRlc3RpbmF0aW9uQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGZlZVRva2VuQW1vdW50OiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDYgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBjb25zdCBhbW91bnQgPSBnZXRQcmV2QXNzZXRQYXkodG9rZW5JZCk7CiAgICBmcmFtZV9kaWcgLTYKICAgIGNhbGxzdWIgZ2V0UHJldkFzc2V0UGF5CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA4CiAgICAvLyBhc3NlcnQoYW1vdW50ID4gZmVlVG9rZW5BbW91bnQsICdCcmlkZ2U6IGFtb3VudCB0b28gbG93IGZvciBmZWUnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEJyaWRnZTogYW1vdW50IHRvbyBsb3cgZm9yIGZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMDkKICAgIC8vIGFzc2VydCghcmVjaXBpZW50LmJ5dGVzLmVxdWFscyhiemVybygzMikpLCAnQnJpZGdlOiBicmlkZ2UgdG8gdGhlIHplcm8gYWRkcmVzcycpOwogICAgcHVzaGludCAzMiAvLyAzMgogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNQogICAgPT0KICAgICEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IGJyaWRnZSB0byB0aGUgemVybyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gY29uc3QgZmVlRnJvbU5hdGl2ZTogdWludDY0ID0gZ2V0UHJldlBheSgyKTsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBjYWxsc3ViIGdldFByZXZQYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQxCiAgICAvLyBpZiAoZmVlVG9rZW5BbW91bnQgPT09IDApIHJldHVybiAwOwogICAgZnJhbWVfZGlnIC0xCiAgICBibnogc3dhcEFuZEJyaWRnZV9hZnRlcl9pZl9lbHNlQDMKICAgIGludGNfMCAvLyAwCgpzd2FwQW5kQnJpZGdlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLl9jb252ZXJ0QnJpZGdpbmdGZWVJblRva2Vuc1RvTmF0aXZlVG9rZW5ANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBjb25zdCBicmlkZ2luZ0ZlZTogdWludDY0ID0gZmVlRnJvbU5hdGl2ZSArIGZlZUZyb21TdGFibGU7CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBkaWcgMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIGVtaXQ8QnJpZGdpbmdGZWVGcm9tVG9rZW5zPih7IGZlZUZyb21OYXRpdmUsIGZlZUZyb21TdGFibGUsIGZlZVN0YWJsZVRva2VuQW1vdW50OiBmZWVUb2tlbkFtb3VudCB9KTsKICAgIHN3YXAKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MzZiYWZhZGQgLy8gbWV0aG9kICJCcmlkZ2luZ0ZlZUZyb21Ub2tlbnModWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyBjb25zdCBhbW91bnRBZnRlckZlZTogdWludDY0ID0gYW1vdW50IC0gZmVlVG9rZW5BbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gY29uc3QgdlVzZEFtb3VudCA9IHRoaXMuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZCwgc2VuZGVyLCBhbW91bnRBZnRlckZlZSk7CiAgICBmcmFtZV9kaWcgLTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyBjb25zdCBzZW5kZXIgPSBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyBjb25zdCB2VXNkQW1vdW50ID0gdGhpcy5zZW5kQW5kU3dhcFRvVlVzZCh0b2tlbklkLCBzZW5kZXIsIGFtb3VudEFmdGVyRmVlKTsKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzZW5kQW5kU3dhcFRvVlVzZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NgogICAgLy8gY2hhaW5JZCA9IEdsb2JhbFN0YXRlPEJ5dGU+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2hhaW5JZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gYXNzZXJ0KGRlc3RpbmF0aW9uQ2hhaW5JZCAhPT0gdGhpcy5jaGFpbklkLnZhbHVlLCAnQnJpZGdlOiB3cm9uZyBkZXN0aW5hdGlvbiBjaGFpbicpOwogICAgZnJhbWVfZGlnIC00CiAgICAhPQogICAgYXNzZXJ0IC8vIEJyaWRnZTogd3JvbmcgZGVzdGluYXRpb24gY2hhaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGFzc2VydCh0aGlzLm90aGVyQnJpZGdlVG9rZW5zKHRoaXMuX2dldE90aGVyQnJpZGdlVG9rZW5zS2V5KGRlc3RpbmF0aW9uQ2hhaW5JZCwgcmVjZWl2ZVRva2VuKSkuZXhpc3RzLCAnQnJpZGdlOiB1bmtub3duIGNoYWluIG9yIHRva2VuJyk7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IHVua25vd24gY2hhaW4gb3IgdG9rZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIGNoYWluSWQgPSBHbG9iYWxTdGF0ZTxCeXRlPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzMKICAgIC8vIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmhhc2hNZXNzYWdlKGFtb3VudCwgcmVjaXBpZW50LCB0aGlzLmNoYWluSWQudmFsdWUsIGRlc3RpbmF0aW9uQ2hhaW5JZCwgcmVjZWl2ZVRva2VuLCBub25jZSk7CiAgICBkaWcgMQogICAgZnJhbWVfZGlnIC01CiAgICB1bmNvdmVyIDIKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaGFzaE1lc3NhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyBjb25zdCBicmlkZ2VUcmFuc2FjdGlvbkNvc3QgPSB0aGlzLmdldFRyYW5zYWN0aW9uQ29zdChkZXN0aW5hdGlvbkNoYWluSWQpOwogICAgZnJhbWVfZGlnIC00CiAgICBjYWxsc3ViIGdldFRyYW5zYWN0aW9uQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2MQogICAgLy8gc2VudE1lc3NhZ2VzID0gQm94TWFwPFN0YXRpY0J5dGVzPDMyPiwgU3RhdGljQnl0ZXM+KHsga2V5UHJlZml4OiAncycgfSk7CiAgICBwdXNoYnl0ZXMgInMiCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE1MgogICAgLy8gYXNzZXJ0KCF0aGlzLnNlbnRNZXNzYWdlcyhtZXNzYWdlKS5leGlzdHMsICdCcmlkZ2U6IHRva2VucyBhbHJlYWR5IHNlbnQnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gQnJpZGdlOiB0b2tlbnMgYWxyZWFkeSBzZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gdGhpcy5zZW50TWVzc2FnZXMobWVzc2FnZSkudmFsdWUgPSBuZXcgU3RhdGljQnl0ZXMoKTsKICAgIHB1c2hieXRlcyAweAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGNvbnN0IGRlc3RpbmF0aW9uQ2hhaW5JZCA9IG1lc3NhZ2UuYXQoMSk7CiAgICBkaWcgMQogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE1Ny0xNjAKICAgIC8vIGNvbnN0IG1lc3NhZ2VDb3N0ID0gYWJpQ2FsbChNZXNzZW5nZXIucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uQ29zdCwgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTctMTYwCiAgICAvLyBjb25zdCBtZXNzYWdlQ29zdCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkNvc3QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRUcmFuc2FjdGlvbkNvc3QoYnl0ZSl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIHJlY2VpdmVyOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5hZGRyZXNzLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKHBheW1lbnRQYXJhbXMsIGFwcENhbGxQYXJhbXMpOwogICAgaXR4bl9iZWdpbgogICAgc3dhcAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE2Mi0xNjUKICAgIC8vIGNvbnN0IHBheW1lbnRQYXJhbXMgPSBpdHhuLnBheW1lbnQoewogICAgLy8gICBhbW91bnQ6IG1lc3NhZ2VDb3N0LAogICAgLy8gICByZWNlaXZlcjogdGhpcy5tZXNzZW5nZXIudmFsdWUuYWRkcmVzcywKICAgIC8vIH0pOwogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAocGF5bWVudFBhcmFtcywgYXBwQ2FsbFBhcmFtcyk7CiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBhcmM0Lm1ldGhvZFNlbGVjdG9yKCdzZW5kTWVzc2FnZShieXRlWzMyXSl2b2lkJyksCiAgICBwdXNoYnl0ZXMgMHhhMzI0OTk4OSAvLyBtZXRob2QgInNlbmRNZXNzYWdlKGJ5dGVbMzJdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE2Ny0xNzMKICAgIC8vIGNvbnN0IGFwcENhbGxQYXJhbXMgPSBpdHhuLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIC8vICAgYXBwQXJnczogWwogICAgLy8gICAgIGFyYzQubWV0aG9kU2VsZWN0b3IoJ3NlbmRNZXNzYWdlKGJ5dGVbMzJdKXZvaWQnKSwKICAgIC8vICAgICBtZXNzYWdlLAogICAgLy8gICBdLAogICAgLy8gfSk7CiAgICBpbnRjXzIgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gaXR4bi5zdWJtaXRHcm91cChwYXltZW50UGFyYW1zLCBhcHBDYWxsUGFyYW1zKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzNgogICAgLy8gZW1pdDxSZWNlaXZlRmVlPih7IGJyaWRnZVRyYW5zYWN0aW9uQ29zdCwgbWVzc2FnZVRyYW5zYWN0aW9uQ29zdCB9KTsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBkaWcgMQogICAgaXRvYgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg0YjU1NDE5YiAvLyBtZXRob2QgIlJlY2VpdmVGZWUodWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzcKICAgIC8vIGFzc2VydChicmlkZ2luZ0ZlZSA+PSBicmlkZ2VUcmFuc2FjdGlvbkNvc3QgKyBtZXNzYWdlVHJhbnNhY3Rpb25Db3N0LCAnQnJpZGdlOiBub3QgZW5vdWdoIGZlZScpOwogICAgKwogICAgdW5jb3ZlciAyCiAgICA8PQogICAgYXNzZXJ0IC8vIEJyaWRnZTogbm90IGVub3VnaCBmZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM5CiAgICAvLyBhbW91bnQsCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzOC0xNDUKICAgIC8vIGVtaXQ8VG9rZW5zU2VudD4oewogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgZGVzdGluYXRpb25DaGFpbklkLAogICAgLy8gICAgIHJlY2VpdmVUb2tlbiwKICAgIC8vICAgICBub25jZSwKICAgIC8vICAgICBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsCiAgICAvLyAgIH0sCiAgICBmcmFtZV9kaWcgLTUKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY29uc3QgQUxMQlJJREdFX01FU1NFTkdFUiA9IG5ldyBCeXRlKDEpOwogICAgYnl0ZWMgMTEgLy8gMHgwMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzgtMTQ1CiAgICAvLyBlbWl0PFRva2Vuc1NlbnQ+KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGRlc3RpbmF0aW9uQ2hhaW5JZCwKICAgIC8vICAgICByZWNlaXZlVG9rZW4sCiAgICAvLyAgICAgbm9uY2UsCiAgICAvLyAgICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICB9LAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzOC0xNDYKICAgIC8vIGVtaXQ8VG9rZW5zU2VudD4oewogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgZGVzdGluYXRpb25DaGFpbklkLAogICAgLy8gICAgIHJlY2VpdmVUb2tlbiwKICAgIC8vICAgICBub25jZSwKICAgIC8vICAgICBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsCiAgICAvLyAgIH0sCiAgICAvLyApOwogICAgcHVzaGJ5dGVzIDB4MjI5ZmJhZWMgLy8gbWV0aG9kICJUb2tlbnNTZW50KHVpbnQ2NCxieXRlWzMyXSxieXRlLGJ5dGVbMzJdLGJ5dGVbMzJdLGJ5dGUpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKc3dhcEFuZEJyaWRnZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gY29uc3QgZmVlOiB1aW50NjQgPSB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRQcmljZSwgewogICAgZnJhbWVfZGlnIC02CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM2CiAgICAvLyBwcm90ZWN0ZWQgYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3RvciA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdmJyB9KTsKICAgIHB1c2hieXRlcyAiZiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHN3YXAKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQzLTM0NgogICAgLy8gY29uc3QgZmVlOiB1aW50NjQgPSB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRQcmljZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmNoYWluSWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdhc09yYWNsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjaGFpbklkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQzLTM0NgogICAgLy8gY29uc3QgZmVlOiB1aW50NjQgPSB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRQcmljZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmNoYWluSWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBwdXNoYnl0ZXMgMHgxZGI3MGNkZCAvLyBtZXRob2QgImdldFByaWNlKGJ5dGUpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGZlZUZyb21TdGFibGU6IHVpbnQ2NCA9IHRoaXMuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbih0b2tlbklkLCBmZWVUb2tlbkFtb3VudCk7CiAgICBiIHN3YXBBbmRCcmlkZ2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbkA1CgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnJlY2VpdmVUb2tlbnMoYW1vdW50OiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHNvdXJjZUNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMsIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCkgLT4gdm9pZDoKcmVjZWl2ZVRva2VuczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTc4LTE4NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZWNlaXZlVG9rZW5zKAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIHNvdXJjZUNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIHJlY2VpdmVUb2tlbjogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICBub25jZTogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDYgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIG90aGVyQnJpZGdlcyA9IEJveE1hcDxCeXRlLCBTdGF0aWNCeXRlczwzMj4+KHsga2V5UHJlZml4OiAnYicgfSk7CiAgICBwdXNoYnl0ZXMgImIiCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODgKICAgIC8vIGFzc2VydCh0aGlzLm90aGVyQnJpZGdlcyhzb3VyY2VDaGFpbklkKS5leGlzdHMsICdCcmlkZ2U6IHNvdXJjZSBub3QgcmVnaXN0ZXJlZCcpOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQnJpZGdlOiBzb3VyY2Ugbm90IHJlZ2lzdGVyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTg5CiAgICAvLyBjb25zdCB2YWx1ZTogdWludDY0ID0gZ2V0UHJldlBheSgxKTsKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGdldFByZXZQYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTkxCiAgICAvLyBhc3NlcnQodmFsdWUgPj0gc3RvcmFnZUZlZSwgJ0JyaWRnZTogbm90IGVub3VnaCBmZWUnKTsKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMjQKICAgIC8vIHJldHVybiAxNTcwMDsKICAgIGludGMgNCAvLyAxNTcwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTEKICAgIC8vIGFzc2VydCh2YWx1ZSA+PSBzdG9yYWdlRmVlLCAnQnJpZGdlOiBub3QgZW5vdWdoIGZlZScpOwogICAgPj0KICAgIGFzc2VydCAvLyBCcmlkZ2U6IG5vdCBlbm91Z2ggZmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjaGFpbklkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTkzCiAgICAvLyBjb25zdCBtZXNzYWdlID0gdGhpcy5oYXNoTWVzc2FnZShhbW91bnQsIHJlY2lwaWVudCwgc291cmNlQ2hhaW5JZCwgdGhpcy5jaGFpbklkLnZhbHVlLCByZWNlaXZlVG9rZW4sIG5vbmNlKTsKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIHVuY292ZXIgMwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaGFzaE1lc3NhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo4MAogICAgLy8gY29uc3QgaDogYnl0ZXMgPSBvcC5rZWNjYWsyNTYob3AuY29uY2F0KG1lc3NhZ2UuYnl0ZXMsIHNlbmRlckFkZHJlc3MpKTsKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIGNvbnN0IG1lc3NhZ2VXaXRoU2VuZGVyID0gaGFzaFdpdGhTZW5kZXJBZGRyZXNzKG1lc3NhZ2UsIFR4bi5zZW5kZXIuYnl0ZXMpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjgwCiAgICAvLyBjb25zdCBoOiBieXRlcyA9IG9wLmtlY2NhazI1NihvcC5jb25jYXQobWVzc2FnZS5ieXRlcywgc2VuZGVyQWRkcmVzcykpOwogICAgY29uY2F0CiAgICBrZWNjYWsyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo4MwogICAgLy8gY29uc3QgZmlyc3QyID0gb3Auc3Vic3RyaW5nKG1lc3NhZ2UuYnl0ZXMsIDAsIDIpOwogICAgc3dhcAogICAgc3Vic3RyaW5nIDAgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjg1CiAgICAvLyBjb25zdCBsYXN0MzAgPSBvcC5zdWJzdHJpbmcoaCwgMiwgMzIpOwogICAgc3dhcAogICAgc3Vic3RyaW5nIDIgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo4OAogICAgLy8gcmV0dXJuIG5ldyBTdGF0aWNCeXRlczwzMj4ob3AuY29uY2F0KGZpcnN0MiwgbGFzdDMwKSk7CiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1OQogICAgLy8gcHJvY2Vzc2VkTWVzc2FnZXMgPSBCb3hNYXA8U3RhdGljQnl0ZXM8MzI+LCBTdGF0aWNCeXRlcz4oeyBrZXlQcmVmaXg6ICdtJyB9KTsKICAgIHB1c2hieXRlcyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBhc3NlcnQoIXRoaXMucHJvY2Vzc2VkTWVzc2FnZXMobWVzc2FnZVdpdGhTZW5kZXIpLmV4aXN0cywgJ0JyaWRnZTogbWVzc2FnZSBwcm9jZXNzZWQnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gQnJpZGdlOiBtZXNzYWdlIHByb2Nlc3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTgKICAgIC8vIHRoaXMucHJvY2Vzc2VkTWVzc2FnZXMobWVzc2FnZVdpdGhTZW5kZXIpLnZhbHVlID0gbmV3IFN0YXRpY0J5dGVzKCk7CiAgICBwdXNoYnl0ZXMgMHgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjAxLTIwNAogICAgLy8gYXNzZXJ0KGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5yZWNlaXZlZE1lc3NhZ2VzLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW21lc3NhZ2VXaXRoU2VuZGVyXSwKICAgIC8vIH0pLnJldHVyblZhbHVlLCAnQnJpZGdlOiBubyBtZXNzYWdlJyk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMDEtMjA0CiAgICAvLyBhc3NlcnQoYWJpQ2FsbChNZXNzZW5nZXIucHJvdG90eXBlLnJlY2VpdmVkTWVzc2FnZXMsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbbWVzc2FnZVdpdGhTZW5kZXJdLAogICAgLy8gfSkucmV0dXJuVmFsdWUsICdCcmlkZ2U6IG5vIG1lc3NhZ2UnKTsKICAgIHB1c2hieXRlcyAweDMzZTE0N2FhIC8vIG1ldGhvZCAicmVjZWl2ZWRNZXNzYWdlcyhieXRlWzMyXSlib29sIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYXNzZXJ0IC8vIEJyaWRnZTogbm8gbWVzc2FnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIGNvbnN0IHRva2VuSWQ6IHVpbnQ2NCA9IG9wLmV4dHJhY3RVaW50NjQocmVjZWl2ZVRva2VuLmJ5dGVzLCAyNCk7CiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIwOC0yMTMKICAgIC8vIGNvbnN0IHJlY2VpdmVBbW91bnQgPSB0aGlzLnJlY2VpdmVBbmRTd2FwRnJvbVZVc2QoCiAgICAvLyAgIHRva2VuSWQsCiAgICAvLyAgIHJlY2lwaWVudEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudCwKICAgIC8vICAgcmVjZWl2ZUFtb3VudE1pbiwKICAgIC8vICk7CiAgICBmcmFtZV9kaWcgLTUKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHJlY2VpdmVBbmRTd2FwRnJvbVZVc2QKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBjb25zdCBleHRyYUdhczogdWludDY0ID0gdmFsdWUgLSBzdG9yYWdlRmVlOwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMyNAogICAgLy8gcmV0dXJuIDE1NzAwOwogICAgaW50YyA0IC8vIDE1NzAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gY29uc3QgZXh0cmFHYXM6IHVpbnQ2NCA9IHZhbHVlIC0gc3RvcmFnZUZlZTsKICAgIC0KICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzI0CiAgICAvLyByZXR1cm4gMTU3MDA7CiAgICBpbnRjIDQgLy8gMTU3MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjE3CiAgICAvLyBpZiAodmFsdWUgPiBzdG9yYWdlRmVlKSB7CiAgICA+CiAgICBieiByZWNlaXZlVG9rZW5zX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMTgtMjIxCiAgICAvLyBwYXltZW50KHsKICAgIC8vICAgYW1vdW50OiBleHRyYUdhcywKICAgIC8vICAgcmVjZWl2ZXI6IHJlY2lwaWVudEFkZHJlc3MuYnl0ZXMsCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtNQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZnJhbWVfZGlnIDIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAoKcmVjZWl2ZVRva2Vuc19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyMwogICAgLy8gZW1pdDxUb2tlbnNSZWNlaXZlZD4oeyByZWNlaXZlQW1vdW50LCByZWNpcGllbnQ6IHJlY2lwaWVudEFkZHJlc3MsIG5vbmNlLCBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsIG1lc3NhZ2U6IG1lc3NhZ2VXaXRoU2VuZGVyIH0pOwogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY29uc3QgQUxMQlJJREdFX01FU1NFTkdFUiA9IG5ldyBCeXRlKDEpOwogICAgYnl0ZWMgMTEgLy8gMHgwMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIGVtaXQ8VG9rZW5zUmVjZWl2ZWQ+KHsgcmVjZWl2ZUFtb3VudCwgcmVjaXBpZW50OiByZWNpcGllbnRBZGRyZXNzLCBub25jZSwgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLCBtZXNzYWdlOiBtZXNzYWdlV2l0aFNlbmRlciB9KTsKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NDU4MzZhZDYgLy8gbWV0aG9kICJUb2tlbnNSZWNlaXZlZCh1aW50NjQsYWRkcmVzcyxieXRlWzMyXSxieXRlLGJ5dGVbMzJdKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVnaXN0ZXJCcmlkZ2UoY2hhaW5JZDogYnl0ZXMsIGJyaWRnZUFkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpyZWdpc3RlckJyaWRnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI2LTIyNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZWdpc3RlckJyaWRnZShjaGFpbklkOiBCeXRlLCBicmlkZ2VBZGRyZXNzOiBTdGF0aWNCeXRlczwzMj4pOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMjgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2MwogICAgLy8gb3RoZXJCcmlkZ2VzID0gQm94TWFwPEJ5dGUsIFN0YXRpY0J5dGVzPDMyPj4oeyBrZXlQcmVmaXg6ICdiJyB9KTsKICAgIHB1c2hieXRlcyAiYiIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyOQogICAgLy8gdGhpcy5vdGhlckJyaWRnZXMoY2hhaW5JZCkudmFsdWUgPSBicmlkZ2VBZGRyZXNzOwogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuYWRkQnJpZGdlVG9rZW4oY2hhaW5JZDogYnl0ZXMsIHRva2VuQWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CmFkZEJyaWRnZVRva2VuOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzItMjMzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGFkZEJyaWRnZVRva2VuKGNoYWluSWQ6IEJ5dGUsIHRva2VuQWRkcmVzczogU3RhdGljQnl0ZXM8MzI+KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzUKICAgIC8vIHRoaXMub3RoZXJCcmlkZ2VUb2tlbnModGhpcy5fZ2V0T3RoZXJCcmlkZ2VUb2tlbnNLZXkoY2hhaW5JZCwgdG9rZW5BZGRyZXNzKSkudmFsdWUgPSBuZXcgU3RhdGljQnl0ZXMoKTsKICAgIHB1c2hieXRlcyAweAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnJlbW92ZUJyaWRnZVRva2VuKGNoYWluSWQ6IGJ5dGVzLCB0b2tlbkFkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVCcmlkZ2VUb2tlbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM4LTIzOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZW1vdmVCcmlkZ2VUb2tlbihjaGFpbklkOiBCeXRlLCB0b2tlbkFkZHJlc3M6IFN0YXRpY0J5dGVzPDMyPik6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gcmV0dXJuIGNoYWluSWQuYnl0ZXMuY29uY2F0KHRva2VuLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIG90aGVyQnJpZGdlVG9rZW5zID0gQm94TWFwPGJ5dGVzLCBTdGF0aWNCeXRlcz4oeyBrZXlQcmVmaXg6ICd0JyB9KTsKICAgIGJ5dGVjIDcgLy8gInQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQxCiAgICAvLyB0aGlzLm90aGVyQnJpZGdlVG9rZW5zKHRoaXMuX2dldE90aGVyQnJpZGdlVG9rZW5zS2V5KGNoYWluSWQsIHRva2VuQWRkcmVzcykpLmRlbGV0ZSgpOwogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2Uud2l0aGRyYXdHYXNUb2tlbnMoYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CndpdGhkcmF3R2FzVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDQtMjQ1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHdpdGhkcmF3R2FzVG9rZW5zKGFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ3CiAgICAvLyBwYXltZW50KHsgYW1vdW50OiBhbW91bnQsIHJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0NwogICAgLy8gcGF5bWVudCh7IGFtb3VudDogYW1vdW50LCByZWNlaXZlcjogdGhpcy5vd25lci52YWx1ZS5ieXRlcyB9KS5zdWJtaXQoKTsKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2Uud2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zKGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdm9pZDoKd2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTAtMjUxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHdpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vucyhhc3NldElkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTQKICAgIC8vIGNvbnN0IGFwcEFjY3Q6IEFjY291bnQgPSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzczsKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjU1CiAgICAvLyBjb25zdCBiYWxhbmNlID0gYXNzZXQuYmFsYW5jZShhcHBBY2N0KTsKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTYKICAgIC8vIGlmIChiYWxhbmNlID4gVWludDY0KDApKSB7CiAgICBieiB3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1Ny0yNjIKICAgIC8vIGFzc2V0VHJhbnNmZXIoewogICAgLy8gICBzZW5kZXI6IGFwcEFjY3QsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBiYWxhbmNlLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjYKICAgIC8vIHByb3RlY3RlZCBvd25lciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIDAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1Ny0yNjIKICAgIC8vIGFzc2V0VHJhbnNmZXIoewogICAgLy8gICBzZW5kZXI6IGFwcEFjY3QsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBiYWxhbmNlLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0Cgp3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmdldEJyaWRnaW5nQ29zdEluVG9rZW5zKGRlc3RpbmF0aW9uQ2hhaW5JZDogYnl0ZXMsIHRva2VuSWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRCcmlkZ2luZ0Nvc3RJblRva2VuczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjY2LTI3MAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRCcmlkZ2luZ0Nvc3RJblRva2VucygKICAgIC8vICAgZGVzdGluYXRpb25DaGFpbklkOiBCeXRlLAogICAgLy8gICB0b2tlbklkOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gY29uc3QgYnJpZGdlR2FzQW1vdW50OiB1aW50NjQgPSB0aGlzLmdldEdhc1VzYWdlKGRlc3RpbmF0aW9uQ2hhaW5JZCk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgZ2V0R2FzVXNhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjcyLTI3NQogICAgLy8gY29uc3QgbWVzc2VuZ2VyR2FzQW1vdW50OiB1aW50NjQgPSBhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUuZ2V0R2FzVXNhZ2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjcyLTI3NQogICAgLy8gY29uc3QgbWVzc2VuZ2VyR2FzQW1vdW50OiB1aW50NjQgPSBhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUuZ2V0R2FzVXNhZ2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJnZXRHYXNVc2FnZShieXRlKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzctMjgwCiAgICAvLyByZXR1cm4gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uR2FzQ29zdEluVVNELCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6OQogICAgLy8gZ2FzT3JhY2xlID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjc5CiAgICAvLyBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkLCBicmlkZ2VHYXNBbW91bnQgKyBtZXNzZW5nZXJHYXNBbW91bnRdLAogICAgY292ZXIgMgogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzctMjgwCiAgICAvLyByZXR1cm4gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uR2FzQ29zdEluVVNELCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIHB1c2hieXRlcyAweDdiZjdkNTBjIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5VU0QoYnl0ZSx1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyODAKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMwogICAgLy8gcHJvdGVjdGVkIGZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ2UnIH0pOwogICAgcHVzaGJ5dGVzICJlIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjc3LTI4MAogICAgLy8gcmV0dXJuIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkdhc0Nvc3RJblVTRCwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWQsIGJyaWRnZUdhc0Ftb3VudCArIG1lc3Nlbmdlckdhc0Ftb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZSAvIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWU7CiAgICAvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuaGFzaE1lc3NhZ2UoYW1vdW50OiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHNvdXJjZUNoYWluSWQ6IGJ5dGVzLCBkZXN0aW5hdGlvbkNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMpIC0+IGJ5dGVzOgpoYXNoTWVzc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjgzLTI5MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBoYXNoTWVzc2FnZSgKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2lwaWVudDogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICBzb3VyY2VDaGFpbklkOiBCeXRlLAogICAgLy8gICBkZXN0aW5hdGlvbkNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIHJlY2VpdmVUb2tlbjogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICBub25jZTogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gKTogU3RhdGljQnl0ZXM8MzI+IHsKICAgIHByb3RvIDYgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTIKICAgIC8vIGNvbnN0IGFtb3VudDMyID0gYnplcm8oMjQpLmNvbmNhdChvcC5pdG9iKGFtb3VudCkpOwogICAgcHVzaGludCAyNCAvLyAyNAogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNgogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5MwogICAgLy8gY29uc3Qgc291cmNlQ2hhaW5JZDMyID0gYnplcm8oMzEpLmNvbmNhdChzb3VyY2VDaGFpbklkLmJ5dGVzKTsKICAgIHB1c2hpbnQgMzEgLy8gMzEKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTQtMjk1CiAgICAvLyBjb25zdCBwYWNrZWQgPSBhbW91bnQzMgogICAgLy8gICAuY29uY2F0KHJlY2lwaWVudC5ieXRlcykKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5NC0yOTYKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgLy8gICAuY29uY2F0KHNvdXJjZUNoYWluSWQzMikKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTQtMjk3CiAgICAvLyBjb25zdCBwYWNrZWQgPSBhbW91bnQzMgogICAgLy8gICAuY29uY2F0KHJlY2lwaWVudC5ieXRlcykKICAgIC8vICAgLmNvbmNhdChzb3VyY2VDaGFpbklkMzIpCiAgICAvLyAgIC5jb25jYXQocmVjZWl2ZVRva2VuLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjk0LTI5OAogICAgLy8gY29uc3QgcGFja2VkID0gYW1vdW50MzIKICAgIC8vICAgLmNvbmNhdChyZWNpcGllbnQuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoc291cmNlQ2hhaW5JZDMyKQogICAgLy8gICAuY29uY2F0KHJlY2VpdmVUb2tlbi5ieXRlcykKICAgIC8vICAgLmNvbmNhdChub25jZS5ieXRlcykKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjb25zdCBBTExCUklER0VfTUVTU0VOR0VSID0gbmV3IEJ5dGUoMSk7CiAgICBieXRlYyAxMSAvLyAweDAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5NC0yOTkKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgLy8gICAuY29uY2F0KHNvdXJjZUNoYWluSWQzMikKICAgIC8vICAgLmNvbmNhdChyZWNlaXZlVG9rZW4uYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQobm9uY2UuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoQUxMQlJJREdFX01FU1NFTkdFUi5ieXRlcyk7CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzAxCiAgICAvLyBjb25zdCBoYXNoID0gb3Aua2VjY2FrMjU2KHBhY2tlZCk7IC8vIDMyIGJ5dGVzCiAgICBrZWNjYWsyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzA0CiAgICAvLyBjb25zdCB3aXRoU3JjID0gb3Auc2V0Qnl0ZShoYXNoLCAwLCBvcC5idG9pKHNvdXJjZUNoYWluSWQuYnl0ZXMpKTsKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIHNldGJ5dGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzA1CiAgICAvLyBjb25zdCB3aXRoRHN0ID0gb3Auc2V0Qnl0ZSh3aXRoU3JjLCAxLCBvcC5idG9pKGRlc3RpbmF0aW9uQ2hhaW5JZC5ieXRlcykpOwogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgc3dhcAogICAgc2V0Ynl0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIHJldHVybiBuZXcgU3RhdGljQnl0ZXM8MzI+KHdpdGhEc3QpOwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGNoYWluSWQ6IGJ5dGVzLCB0b2tlbjogYnl0ZXMpIC0+IHVpbnQ2NDoKaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTAtMzExCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGlzT3RoZXJCcmlkZ2VUb2tlblN1cHBvcnRlZChjaGFpbklkOiBCeXRlLCB0b2tlbjogU3RhdGljQnl0ZXM8MzI+KTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTIKICAgIC8vIHJldHVybiB0aGlzLm90aGVyQnJpZGdlVG9rZW5zKHRoaXMuX2dldE90aGVyQnJpZGdlVG9rZW5zS2V5KGNoYWluSWQsIHRva2VuKSkuZXhpc3RzOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuZ2V0VHJhbnNhY3Rpb25Db3N0KGNoYWluSWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldFRyYW5zYWN0aW9uQ29zdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE1LTMxNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRUcmFuc2FjdGlvbkNvc3QoY2hhaW5JZDogQnl0ZSk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE3CiAgICAvLyByZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQpICsgdGhpcy5nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdCgpOwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyByZXR1cm4gMTU3MDA7CiAgICBpbnRjIDQgLy8gMTU3MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE3CiAgICAvLyByZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQpICsgdGhpcy5nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdCgpOwogICAgKwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnN3YXAodG9rZW5JZDogdWludDY0LCByZWNlaXZlVG9rZW5JZDogdWludDY0LCByZWNpcGllbnQ6IGJ5dGVzLCByZWNlaXZlQW1vdW50TWluOiB1aW50NjQpIC0+IHZvaWQ6CnN3YXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjc4LTg0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHN3YXAoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjZWl2ZVRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBBZGRyZXNzLAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDQgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IHNlbmRlciA9IG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4NwogICAgLy8gY29uc3QgYW1vdW50ID0gZ2V0UHJldkFzc2V0UGF5KHRva2VuSWQpOwogICAgZnJhbWVfZGlnIC00CiAgICBjYWxsc3ViIGdldFByZXZBc3NldFBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4OAogICAgLy8gY29uc3QgdlVzZEFtb3VudCA9IHRoaXMuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZCwgc2VuZGVyLCBhbW91bnQpOwogICAgZnJhbWVfZGlnIC00CiAgICBkaWcgMgogICAgZGlnIDIKICAgIGNhbGxzdWIgc2VuZEFuZFN3YXBUb1ZVc2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6ODkKICAgIC8vIGNvbnN0IHJlY2VpdmVkQW1vdW50ID0gdGhpcy5yZWNlaXZlQW5kU3dhcEZyb21WVXNkKHJlY2VpdmVUb2tlbklkLCByZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4pOwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIHVuY292ZXIgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHJlY2VpdmVBbmRTd2FwRnJvbVZVc2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OTAKICAgIC8vIGVtaXQ8U3dhcHBlZD4oeyBzZW5kZXIsIHJlY2lwaWVudCwgdG9rZW5JZCwgcmVjZWl2ZVRva2VuSWQsIGFtb3VudCwgcmVjZWl2ZWRBbW91bnQgfSk7CiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgNAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTU0MDQ0YjMgLy8gbWV0aG9kICJTd2FwcGVkKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5hZGRQb29sKHBvb2xJZDogdWludDY0LCB0b2tlbklkOiB1aW50NjQpIC0+IHZvaWQ6CmFkZFBvb2w6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMC0xMDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gYWRkUG9vbChwb29sSWQ6IHVpbnQ2NCwgdG9rZW5JZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAyCiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAzCiAgICAvLyB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlID0gcG9vbElkOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMxCiAgICAvLyBwb29scyA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdwJyB9KTsKICAgIGJ5dGVjIDggLy8gInAiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMwogICAgLy8gdGhpcy5wb29scyh0b2tlbklkKS52YWx1ZSA9IHBvb2xJZDsKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDUKICAgIC8vIGNvbnN0IHRva2VuRGVjaW1hbHMgPSBhc3NldC5kZWNpbWFsczsKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy1vcmFjbGUuY29udHJhY3QuYWxnby50czo4CiAgICAvLyBleHBvcnQgY29uc3QgT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTjogdWludDY0ID0gOTsKICAgIHB1c2hpbnQgOSAvLyA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNgogICAgLy8gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzICsgQ0hBSU5fUFJFQ0lTSU9OKTsKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtb3JhY2xlLmNvbnRyYWN0LmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNvbnN0IENIQUlOX1BSRUNJU0lPTjogdWludDY0ID0gNjsKICAgIGludGNfMiAvLyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNgogICAgLy8gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzICsgQ0hBSU5fUFJFQ0lTSU9OKTsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzYKICAgIC8vIHByb3RlY3RlZCBicmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ2YnIH0pOwogICAgcHVzaGJ5dGVzICJmIgogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDYKICAgIC8vIHRoaXMuYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZSA9IDEwICoqIChPUkFDTEVfUFJJQ0VfUFJFQ0lTSU9OIC0gdG9rZW5EZWNpbWFscyArIENIQUlOX1BSRUNJU0lPTik7CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICB1bmNvdmVyIDIKICAgIGV4cAogICAgaXRvYgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMwogICAgLy8gcHJvdGVjdGVkIGZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ2UnIH0pOwogICAgcHVzaGJ5dGVzICJlIgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTA3CiAgICAvLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzKTsKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHVuY292ZXIgMgogICAgZXhwCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIucmVtb3ZlUG9vbCh0b2tlbklkOiB1aW50NjQpIC0+IHZvaWQ6CnJlbW92ZVBvb2w6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMC0xMTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gcmVtb3ZlUG9vbCh0b2tlbklkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTMKICAgIC8vIHRoaXMucG9vbHModG9rZW5JZCkuZGVsZXRlKCk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzEKICAgIC8vIHBvb2xzID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTMKICAgIC8vIHRoaXMucG9vbHModG9rZW5JZCkuZGVsZXRlKCk7CiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zdG9wU3dhcCgpIC0+IHZvaWQ6CnN0b3BTd2FwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2OAogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZS5ieXRlcywgJ1JvdXRlcjogaXMgbm90IHN0b3BBdXRob3JpdHknKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzkKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NjgKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUuYnl0ZXMsICdSb3V0ZXI6IGlzIG5vdCBzdG9wQXV0aG9yaXR5Jyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIFJvdXRlcjogaXMgbm90IHN0b3BBdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEyMgogICAgLy8gdGhpcy5jYW5Td2FwLnZhbHVlID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zdGFydFN3YXAoKSAtPiB2b2lkOgpzdGFydFN3YXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzMAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUwCiAgICAvLyBjYW5Td2FwID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7CiAgICBieXRlY18xIC8vICJjYW5Td2FwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMzEKICAgIC8vIHRoaXMuY2FuU3dhcC52YWx1ZSA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zZXRTdG9wQXV0aG9yaXR5KHN0b3BBdXRob3JpdHk6IGJ5dGVzKSAtPiB2b2lkOgpzZXRTdG9wQXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMzctMTM4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzOQogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM5CiAgICAvLyBwcml2YXRlIHN0b3BBdXRob3JpdHkgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDAKICAgIC8vIHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZSA9IHN0b3BBdXRob3JpdHk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc2V0UmViYWxhbmNlcihyZWJhbGFuY2VyOiBieXRlcykgLT4gdm9pZDoKc2V0UmViYWxhbmNlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTQ2LTE0NwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBzZXRSZWJhbGFuY2VyKHJlYmFsYW5jZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo0OQogICAgLy8gcHJpdmF0ZSByZWJhbGFuY2VyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKGJ6ZXJvKDApKSB9KTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDkKICAgIC8vIHRoaXMucmViYWxhbmNlci52YWx1ZSA9IHJlYmFsYW5jZXI7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIucmVjZWl2ZUFuZFN3YXBGcm9tVlVzZCh0b2tlbklkOiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHZVc2RBbW91bnQ6IHVpbnQ2NCwgcmVjZWl2ZUFtb3VudE1pbjogdWludDY0KSAtPiB1aW50NjQ6CnJlY2VpdmVBbmRTd2FwRnJvbVZVc2Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1Mi0xNTcKICAgIC8vIHByb3RlY3RlZCByZWNlaXZlQW5kU3dhcEZyb21WVXNkKAogICAgLy8gICB0b2tlbklkOiB1aW50NjQsCiAgICAvLyAgIHJlY2lwaWVudDogQWRkcmVzcywKICAgIC8vICAgdlVzZEFtb3VudDogdWludDY0LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gNCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1OAogICAgLy8gYXNzZXJ0KHRoaXMucG9vbHModG9rZW5JZCkuZXhpc3RzLCAnUm91dGVyOiBubyByZWNlaXZlIHBvb2wnKTsKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMQogICAgLy8gcG9vbHMgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAncCcgfSk7CiAgICBieXRlYyA4IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1OAogICAgLy8gYXNzZXJ0KHRoaXMucG9vbHModG9rZW5JZCkuZXhpc3RzLCAnUm91dGVyOiBubyByZWNlaXZlIHBvb2wnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gUm91dGVyOiBubyByZWNlaXZlIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTU5CiAgICAvLyBjb25zdCBwb29sSWQgPSB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTYwLTE2MwogICAgLy8gcmV0dXJuIGFiaUNhbGwoUG9vbC5wcm90b3R5cGUuc3dhcEZyb21WVXNkLCB7CiAgICAvLyAgIGFwcElkOiBwb29sSWQsCiAgICAvLyAgIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjIKICAgIC8vIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHJlYmFsYW5jZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPih7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoYnplcm8oMCkpIH0pOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTYyCiAgICAvLyBhcmdzOiBbcmVjaXBpZW50LCB2VXNkQW1vdW50LCByZWNlaXZlQW1vdW50TWluLCByZWNpcGllbnQgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBieXRlYyA5IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjAtMTYzCiAgICAvLyByZXR1cm4gYWJpQ2FsbChQb29sLnByb3RvdHlwZS5zd2FwRnJvbVZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3JlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbiwgcmVjaXBpZW50ID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBwdXNoYnl0ZXMgMHgwZDFiNGMwNiAvLyBtZXRob2QgInN3YXBGcm9tVlVzZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnNlbmRBbmRTd2FwVG9WVXNkKHRva2VuSWQ6IHVpbnQ2NCwgdXNlcjogYnl0ZXMsIGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6CnNlbmRBbmRTd2FwVG9WVXNkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjcKICAgIC8vIHByb3RlY3RlZCBzZW5kQW5kU3dhcFRvVlVzZCh0b2tlbklkOiB1aW50NjQsIHVzZXI6IEFkZHJlc3MsIGFtb3VudDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjgKICAgIC8vIGFzc2VydCh0aGlzLnBvb2xzKHRva2VuSWQpLmV4aXN0cywgJ1JvdXRlcjogbm8gcG9vbCcpOwogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMxCiAgICAvLyBwb29scyA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdwJyB9KTsKICAgIGJ5dGVjIDggLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTY4CiAgICAvLyBhc3NlcnQodGhpcy5wb29scyh0b2tlbklkKS5leGlzdHMsICdSb3V0ZXI6IG5vIHBvb2wnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gUm91dGVyOiBubyBwb29sCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2OQogICAgLy8gY29uc3QgcG9vbElkID0gdGhpcy5wb29scyh0b2tlbklkKS52YWx1ZTsKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHN3YXAKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3MS0xNzYKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdG9rZW5JZCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbElkKS5hZGRyZXNzLAogICAgLy8gfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzQKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHBvb2xJZCkuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTcxLTE3NQogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0b2tlbklkLAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sSWQpLmFkZHJlc3MsCiAgICAvLyB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzEtMTc2CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRva2VuSWQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHBvb2xJZCkuYWRkcmVzcywKICAgIC8vIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3OC0xODEKICAgIC8vIHJldHVybiBhYmlDYWxsKFBvb2wucHJvdG90eXBlLnN3YXBUb1ZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxODAKICAgIC8vIGFyZ3M6IFt1c2VyLCBhbW91bnQsIHVzZXIgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgcmViYWxhbmNlciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInJlYmFsYW5jZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxODAKICAgIC8vIGFyZ3M6IFt1c2VyLCBhbW91bnQsIHVzZXIgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieXRlYyA5IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzgtMTgxCiAgICAvLyByZXR1cm4gYWJpQ2FsbChQb29sLnByb3RvdHlwZS5zd2FwVG9WVXNkLCB7CiAgICAvLyAgIGFwcElkOiBwb29sSWQsCiAgICAvLyAgIGFyZ3M6IFt1c2VyLCBhbW91bnQsIHVzZXIgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIHB1c2hieXRlcyAweGQ5NzhhZDE0IC8vIG1ldGhvZCAic3dhcFRvVlVzZChhZGRyZXNzLHVpbnQ2NCxib29sKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5nZXRHYXNVc2FnZShjaGFpbklkOiBieXRlcykgLT4gdWludDY0OgpnZXRHYXNVc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTctMTgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0R2FzVXNhZ2UoY2hhaW5JZDogQnl0ZSk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTAKICAgIC8vIGdhc1VzYWdlID0gQm94TWFwPEJ5dGUsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdnJyB9KTsKICAgIGJ5dGVjIDEyIC8vICJnIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTkKICAgIC8vIHJldHVybiB0aGlzLmdhc1VzYWdlKGNoYWluSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6Okdhc1VzYWdlLnNldEdhc1VzYWdlKGNoYWluSWQ6IGJ5dGVzLCBnYXNBbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKc2V0R2FzVXNhZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjIyLTIzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldEdhc1VzYWdlKGNoYWluSWQ6IEJ5dGUsIGdhc0Ftb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjQKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxMAogICAgLy8gZ2FzVXNhZ2UgPSBCb3hNYXA8Qnl0ZSwgdWludDY0Pih7IGtleVByZWZpeDogJ2cnIH0pOwogICAgYnl0ZWMgMTIgLy8gImciCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyNQogICAgLy8gdGhpcy5nYXNVc2FnZShjaGFpbklkKS52YWx1ZSA9IGdhc0Ftb3VudDsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2Uuc2V0R2FzT3JhY2xlKGdhc09yYWNsZTogdWludDY0KSAtPiB2b2lkOgpzZXRHYXNPcmFjbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4LTI5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldEdhc09yYWNsZShnYXNPcmFjbGU6IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzAKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGJ5dGVjIDQgLy8gImdhc09yYWNsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzEKICAgIC8vIHRoaXMuZ2FzT3JhY2xlLnZhbHVlID0gZ2FzT3JhY2xlOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2UuZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdChjaGFpbklkOiBieXRlcykgLT4gdWludDY0OgpnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozNC0zNQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQ6IEJ5dGUpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjEwCiAgICAvLyBnYXNVc2FnZSA9IEJveE1hcDxCeXRlLCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZycgfSk7CiAgICBieXRlYyAxMiAvLyAiZyIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM2CiAgICAvLyBjb25zdCBnYXNBbW91bnQgPSB0aGlzLmdhc1VzYWdlKGNoYWluSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzctNDAKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5OYXRpdmVUb2tlbiwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtjaGFpbklkLCBnYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdhc09yYWNsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM5CiAgICAvLyBhcmdzOiBbY2hhaW5JZCwgZ2FzQW1vdW50XSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzctNDAKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5OYXRpdmVUb2tlbiwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtjaGFpbklkLCBnYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBwdXNoYnl0ZXMgMHhjMmFmY2NkMSAvLyBtZXRob2QgImdldFRyYW5zYWN0aW9uR2FzQ29zdEluTmF0aXZlVG9rZW4oYnl0ZSx1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6Ok93bmFibGUub25seU93bmVyKCkgLT4gdm9pZDoKb25seU93bmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTMKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLCAnT25seSBvd25lcicpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgb3duZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjpPd25hYmxlLnRyYW5zZmVyT3duZXJzaGlwKG5ld093bmVyOiBieXRlcykgLT4gdm9pZDoKdHJhbnNmZXJPd25lcnNoaXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNi0xNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGJ5dGVjXzMgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTkKICAgIC8vIHRoaXMub3duZXIudmFsdWUgPSBuZXdPd25lcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1Ygo=",clear:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},byteCode:{approval:"CiAFAAEGBNR6JhAEFR98dQdjYW5Td2FwCW1lc3NlbmdlcgVvd25lcglnYXNPcmFjbGUHY2hhaW5JZApyZWJhbGFuY2VyAXQBcAEADXN0b3BBdXRob3JpdHkBAQFnBENBeqME90dbggwVH3x1AAAAAAAAPVQxGEAACSKvJwZMZykjZzEbQQDJgg0E//goQQRl9wVzBOg6h6sELJ9oRwQxkZsoBE66ByEExhftcwRXUxVgBGOAgngEBlB8agT1+W6zBEsGLKAEw83ZKicNggkEB9+EKQSAxccPBPqxEaIE7xX4VQRrHuIjBBhwpJIENVcyTQQEsWHxBNKzV+snDoIEBAylrnoEOXuRiwTL/G0CBOF7r7Q2GgCOHAIFAfUB7AHMAawBmgGIAXYBZgFWAT4BGwD/AOsA3wDTALgApACUAIgAfABtAF4ASgA3ACUAEQACIkMxGRREMRhENhoBiAgcI0MxGRREMRhENhoBiAfJFihMULAjQzEZFEQxGEQ2GgEXwDKIB6YjQzEZFEQxGEQ2GgE2GgIXiAeDI0MxGRREMRhENhoBiAdmFihMULAjQzEZFEQxGEQ2GgGIBosjQzEZFEQxGEQ2GgGIBnAjQzEZFEQxGESIBl0jQzEZFEQxGESIBkQjQzEZFEQxGEQ2GgEXiAYkI0MxGRREMRhENhoBFzYaAheIBdcjQzEZFEQxGEQ2GgEXNhoCFzYaAzYaBBeIBXMjQzEZFEQxGEQnD7AjQzEZFEQxGEQnD7AjQzEZFEQxGEQ2GgGIBUAWKExQsCNDMRkURDEYRDYaATYaAogFGScJIk8CVChMULAjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGiAS9KExQsCNDMRkURDEYRDYaATYaAheIBDwWKExQsCNDMRkURDEYRDYaAReIA/cjQzEZFEQxGEQ2GgEXiAPOI0MxGRREMRhENhoBNhoCiAOqI0MxGRREMRhENhoBNhoCiAOFI0MxGRREMRhENhoBNhoCiANjI0MxGRREMRhENhoBFzYaAjYaAzYaBDYaBTYaBheIAokjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGF4gBFyNDMRkURDEYRCNDMRkURDEYRDYaAReIAMkjQzEZFEQxGBRENhoBNhoCNhoDF8AyNhoEF8AyiACPI0OKAQExFkQxFiMJSTgQJRJESTgUMgoSREk4EYv/EkRJOCAyAxJESTgVMgMSRDgSiYoBAYAASTEWi/8MQQAEIowAiTEWi/8JSYwBOBBJjAAjE0EABCKMAImLACMSRIsBOAcyChNBAAQijACJiwE4IDIDE0EABCKMAImLATgJMgMTQQAEIowAiYsBOAiMAImKBAAri/xnJwSL/2cnCov8ZycFi/1nKov+Z4mKAQCIBVCxMgqyFCKyEov/shElshAisgGzgBhCcmlkZ2U6IG9wdC1pbiBjb21wbGV0ZWSwiYoGACIpZUREi/qI/xZJi/8NRIEgr4v7EhREgQKI/zOL/0AA7iKLAUlLAghMFk8CFov/Fk4CUExQgAQ2uvrdTFCwiwCL/wmL+jEATwKIBAgiJwVlRIv8E0SL/Iv9UCcHTFC9RQFEIicFZURLAYv7TwKL/Iv9i/6IAnuL/IgCuYABc0sCUEm9RQEURIAAv0sBVwEBsSIqZUQnDbIashiyGiSyECKyAbO0PklXBABMVwAEKBJEFyIqZURyCEQiKmVEsUyyB0sBsggjshAisgG2gASjJJmJshpPA7IashgkshAisgGzSwEWSwEWUIAES1VBm0xQsAhPAg5EFov7UIv8UIv9UIv+UCcLUIAEIp+67ExQsImL+haAAWZMUL5MF0xEi/8LsSInBGVEIicFZUSABB23DN2yGrIashgkshAisgGztD5JVwQATFcABCgSRBcKQv7TigYAIillRESAAWKL/FC9RQFEI4j96kkhBA9EIicFZUSL+ov7i/xPA4v9i/6IAXNJMQBQAkxRAAJMUQIgUElOAoABbUsBUEm9RQEURIAAv7EiKmVEgAQz4UeqshqyGLIaJLIQIrIBs7Q+SVcEAExXAAQoEkQiU0SL/YEYW4v7i/qL/4gCKkxJIQQJTCEEDUEAELGL+7IHiwKyCCOyECKyAbOLARaL+1CL/lAnC1CLAFCABEWDatZMULCJigIAiAMPgAFii/5Qi/+/iYoCAIgC/4v+i/9QJwdMUIAAv4mKAgCIAuyL/ov/UCcHTFC8SImKAQCIAtqxIitlRLIHi/+yCCOyECKyAbOJigEAiALBMgpJi/9wAExJTwJEQQAasSIrZUSyFIsBshKL/7IRiwCyACWyECKyAbOJigIBi/6IAiqxIiplRCcOshqL/rIashgkshAisgGztD5JVwQATFcABCgSRBexIicEZUROAggWgAR799UMshqL/rIashqyGCSyECKyAbO0PklXBABMVwAEKBJEF4v/FoABZUxQvkwXTEQKiYoGAYEYr4v6FlCBH6+L/FBMi/tQTFCL/lCL/1AnC1ACi/wXIkxWi/0XI0xWSRWBIBJEiYoCAYv+i/9QJwdMUL1FAYmKAQGL/4gBpyEECImKBAAiKWVERDEAi/yI+9GL/EsCSwKIAPyL/Yv+TwKL/4gAm4v8Fov9Fk8DFk8DFk8Ei/5QTwRQTwNQTwJQTFCABBVARLNMULCJigIAiAGPi/8WJwhLAVCL/ha/i/9xAUSBCUwJSSQIgAFmSwNQgQpPApQWv4ABZU8CUIEKTwKUFr+JigEAiAFWi/8WJwhMULxIiTEAIicKZUQSRCkiZ4mIATwpI2eJigEAiAEyJwqL/2eJigEAiAEmJwaL/2eJigQBi/wWJwhMUEm9RQFEvkwXTESxi/4Wi/8WIicGZUSL/RInCSJPAlSABA0bTAayGov9shpPArIaTLIashqyGCSyECKyAbO0PklXBABMVwAEKBJEF4mKAwGL/RYnCExQSb1FAUS+TBdMRLFJcghEshSL/7ISi/2yESWyECKyAbOxi/8WIicGZUSL/hInCSJPAlSABNl4rRSyGov+shpMshqyGrIYJLIQIrIBs7Q+SVcEAExXAAQoEkQXiYoBAScMi/9QvkwXTESJigIAiABRJwyL/lCL/xa/iYoBAIgAQScEi/9niYoBAScMi/9QvkwXTESxIicEZURMFoAEwq/M0bIai/+yGrIashgkshAisgGztD5JVwQATFcABCgSRBeJMQAiK2VEEkSJigEAiP/xK4v/Z4k=",clear:"CoEBQw=="},events:[{name:"BridgingFeeFromTokens",args:[{type:"uint64",name:"feeFromNative"},{type:"uint64",name:"feeFromStable"},{type:"uint64",name:"feeStableTokenAmount"}]},{name:"ReceiveFee",args:[{type:"uint64",name:"bridgeTransactionCost"},{type:"uint64",name:"messageTransactionCost"}]},{name:"TokensSent",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"}]},{name:"TokensReceived",args:[{type:"uint64",name:"receiveAmount"},{type:"address",name:"recipient"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"},{type:"byte[32]",name:"message"}]},{name:"Swapped",args:[{type:"address",name:"sender"},{type:"address",name:"recipient"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"receiveTokenId"},{type:"uint64",name:"amount"},{type:"uint64",name:"receivedAmount"}]}],templateVariables:{}};var C=class r{static get create(){return{_resolveByMethod(i){switch(i.method){case"createApplication":case"createApplication(address,byte,application,application)void":return r.create.createApplication(i)}throw new Error("Unknown ' + verb + ' method")},createApplication(i){return{...i,method:"createApplication(address,byte,application,application)void",args:Array.isArray(i.args)?i.args:[i.args.owner,i.args.chainId,i.args.messenger,i.args.gasOracle]}}}}static optInAsset(i){return{...i,method:"optInAsset(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.assetId]}}static noop(i){return{...i,method:"noop()void",args:Array.isArray(i.args)?i.args:[]}}static swapAndBridge(i){return{...i,method:"swapAndBridge(uint64,byte[32],byte,byte[32],byte[32],uint64)void",args:Array.isArray(i.args)?i.args:[i.args.tokenId,i.args.recipient,i.args.destinationChainId,i.args.receiveToken,i.args.nonce,i.args.feeTokenAmount]}}static receiveTokens(i){return{...i,method:"receiveTokens(uint64,byte[32],byte,byte[32],byte[32],uint64)void",args:Array.isArray(i.args)?i.args:[i.args.amount,i.args.recipient,i.args.sourceChainId,i.args.receiveToken,i.args.nonce,i.args.receiveAmountMin]}}static registerBridge(i){return{...i,method:"registerBridge(byte,byte[32])void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.bridgeAddress]}}static addBridgeToken(i){return{...i,method:"addBridgeToken(byte,byte[32])void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.tokenAddress]}}static removeBridgeToken(i){return{...i,method:"removeBridgeToken(byte,byte[32])void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.tokenAddress]}}static withdrawGasTokens(i){return{...i,method:"withdrawGasTokens(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.amount]}}static withdrawBridgingFeeInTokens(i){return{...i,method:"withdrawBridgingFeeInTokens(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.assetId]}}static getBridgingCostInTokens(i){return{...i,method:"getBridgingCostInTokens(byte,uint64)uint64",args:Array.isArray(i.args)?i.args:[i.args.destinationChainId,i.args.tokenId]}}static hashMessage(i){return{...i,method:"hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]",args:Array.isArray(i.args)?i.args:[i.args.amount,i.args.recipient,i.args.sourceChainId,i.args.destinationChainId,i.args.receiveToken,i.args.nonce]}}static isOtherBridgeTokenSupported(i){return{...i,method:"isOtherBridgeTokenSupported(byte,byte[32])bool",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.token]}}static getTransactionCost(i){return{...i,method:"getTransactionCost(byte)uint64",args:Array.isArray(i.args)?i.args:[i.args.chainId]}}static getReceiveTokensCost(i){return{...i,method:"getReceiveTokensCost()uint64",args:Array.isArray(i.args)?i.args:[]}}static getSendTransactionStorageCost(i){return{...i,method:"getSendTransactionStorageCost()uint64",args:Array.isArray(i.args)?i.args:[]}}static swap(i){return{...i,method:"swap(uint64,uint64,address,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.tokenId,i.args.receiveTokenId,i.args.recipient,i.args.receiveAmountMin]}}static addPool(i){return{...i,method:"addPool(uint64,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.poolId,i.args.tokenId]}}static removePool(i){return{...i,method:"removePool(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.tokenId]}}static stopSwap(i){return{...i,method:"stopSwap()void",args:Array.isArray(i.args)?i.args:[]}}static startSwap(i){return{...i,method:"startSwap()void",args:Array.isArray(i.args)?i.args:[]}}static setStopAuthority(i){return{...i,method:"setStopAuthority(address)void",args:Array.isArray(i.args)?i.args:[i.args.stopAuthority]}}static setRebalancer(i){return{...i,method:"setRebalancer(address)void",args:Array.isArray(i.args)?i.args:[i.args.rebalancer]}}static getGasUsage(i){return{...i,method:"getGasUsage(byte)uint64",args:Array.isArray(i.args)?i.args:[i.args.chainId]}}static setGasUsage(i){return{...i,method:"setGasUsage(byte,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.gasAmount]}}static setGasOracle(i){return{...i,method:"setGasOracle(application)void",args:Array.isArray(i.args)?i.args:[i.args.gasOracle]}}static getTransactionRelayerCost(i){return{...i,method:"getTransactionRelayerCost(byte)uint64",args:Array.isArray(i.args)?i.args:[i.args.chainId]}}static transferOwnership(i){return{...i,method:"transferOwnership(address)void",args:Array.isArray(i.args)?i.args:[i.args.newOwner]}}};var Zn=class r{appClient;constructor(i){this.appClient=i instanceof Wn?i:new Wn({...i,appSpec:Bn})}decodeReturnValue(i,a){return a!==void 0?or(a,this.appClient.getABIMethod(i),Bn.structs):void 0}static async fromCreatorAndName(i){return new r(await Wn.fromCreatorAndName({...i,appSpec:Bn}))}static async fromNetwork(i){return new r(await Wn.fromNetwork({...i,appSpec:Bn}))}get appId(){return this.appClient.appId}get appAddress(){return this.appClient.appAddress}get appName(){return this.appClient.appName}get appSpec(){return this.appClient.appSpec}get algorand(){return this.appClient.algorand}params={clearState:i=>this.appClient.params.bare.clearState(i),optInAsset:i=>this.appClient.params.call(C.optInAsset(i)),noop:(i={args:[]})=>this.appClient.params.call(C.noop(i)),swapAndBridge:i=>this.appClient.params.call(C.swapAndBridge(i)),receiveTokens:i=>this.appClient.params.call(C.receiveTokens(i)),registerBridge:i=>this.appClient.params.call(C.registerBridge(i)),addBridgeToken:i=>this.appClient.params.call(C.addBridgeToken(i)),removeBridgeToken:i=>this.appClient.params.call(C.removeBridgeToken(i)),withdrawGasTokens:i=>this.appClient.params.call(C.withdrawGasTokens(i)),withdrawBridgingFeeInTokens:i=>this.appClient.params.call(C.withdrawBridgingFeeInTokens(i)),getBridgingCostInTokens:i=>this.appClient.params.call(C.getBridgingCostInTokens(i)),hashMessage:i=>this.appClient.params.call(C.hashMessage(i)),isOtherBridgeTokenSupported:i=>this.appClient.params.call(C.isOtherBridgeTokenSupported(i)),getTransactionCost:i=>this.appClient.params.call(C.getTransactionCost(i)),getReceiveTokensCost:(i={args:[]})=>this.appClient.params.call(C.getReceiveTokensCost(i)),getSendTransactionStorageCost:(i={args:[]})=>this.appClient.params.call(C.getSendTransactionStorageCost(i)),swap:i=>this.appClient.params.call(C.swap(i)),addPool:i=>this.appClient.params.call(C.addPool(i)),removePool:i=>this.appClient.params.call(C.removePool(i)),stopSwap:(i={args:[]})=>this.appClient.params.call(C.stopSwap(i)),startSwap:(i={args:[]})=>this.appClient.params.call(C.startSwap(i)),setStopAuthority:i=>this.appClient.params.call(C.setStopAuthority(i)),setRebalancer:i=>this.appClient.params.call(C.setRebalancer(i)),getGasUsage:i=>this.appClient.params.call(C.getGasUsage(i)),setGasUsage:i=>this.appClient.params.call(C.setGasUsage(i)),setGasOracle:i=>this.appClient.params.call(C.setGasOracle(i)),getTransactionRelayerCost:i=>this.appClient.params.call(C.getTransactionRelayerCost(i)),transferOwnership:i=>this.appClient.params.call(C.transferOwnership(i))};createTransaction={clearState:i=>this.appClient.createTransaction.bare.clearState(i),optInAsset:i=>this.appClient.createTransaction.call(C.optInAsset(i)),noop:(i={args:[]})=>this.appClient.createTransaction.call(C.noop(i)),swapAndBridge:i=>this.appClient.createTransaction.call(C.swapAndBridge(i)),receiveTokens:i=>this.appClient.createTransaction.call(C.receiveTokens(i)),registerBridge:i=>this.appClient.createTransaction.call(C.registerBridge(i)),addBridgeToken:i=>this.appClient.createTransaction.call(C.addBridgeToken(i)),removeBridgeToken:i=>this.appClient.createTransaction.call(C.removeBridgeToken(i)),withdrawGasTokens:i=>this.appClient.createTransaction.call(C.withdrawGasTokens(i)),withdrawBridgingFeeInTokens:i=>this.appClient.createTransaction.call(C.withdrawBridgingFeeInTokens(i)),getBridgingCostInTokens:i=>this.appClient.createTransaction.call(C.getBridgingCostInTokens(i)),hashMessage:i=>this.appClient.createTransaction.call(C.hashMessage(i)),isOtherBridgeTokenSupported:i=>this.appClient.createTransaction.call(C.isOtherBridgeTokenSupported(i)),getTransactionCost:i=>this.appClient.createTransaction.call(C.getTransactionCost(i)),getReceiveTokensCost:(i={args:[]})=>this.appClient.createTransaction.call(C.getReceiveTokensCost(i)),getSendTransactionStorageCost:(i={args:[]})=>this.appClient.createTransaction.call(C.getSendTransactionStorageCost(i)),swap:i=>this.appClient.createTransaction.call(C.swap(i)),addPool:i=>this.appClient.createTransaction.call(C.addPool(i)),removePool:i=>this.appClient.createTransaction.call(C.removePool(i)),stopSwap:(i={args:[]})=>this.appClient.createTransaction.call(C.stopSwap(i)),startSwap:(i={args:[]})=>this.appClient.createTransaction.call(C.startSwap(i)),setStopAuthority:i=>this.appClient.createTransaction.call(C.setStopAuthority(i)),setRebalancer:i=>this.appClient.createTransaction.call(C.setRebalancer(i)),getGasUsage:i=>this.appClient.createTransaction.call(C.getGasUsage(i)),setGasUsage:i=>this.appClient.createTransaction.call(C.setGasUsage(i)),setGasOracle:i=>this.appClient.createTransaction.call(C.setGasOracle(i)),getTransactionRelayerCost:i=>this.appClient.createTransaction.call(C.getTransactionRelayerCost(i)),transferOwnership:i=>this.appClient.createTransaction.call(C.transferOwnership(i))};send={clearState:i=>this.appClient.send.bare.clearState(i),optInAsset:async i=>{let a=await this.appClient.send.call(C.optInAsset(i));return{...a,return:a.return}},noop:async(i={args:[]})=>{let a=await this.appClient.send.call(C.noop(i));return{...a,return:a.return}},swapAndBridge:async i=>{let a=await this.appClient.send.call(C.swapAndBridge(i));return{...a,return:a.return}},receiveTokens:async i=>{let a=await this.appClient.send.call(C.receiveTokens(i));return{...a,return:a.return}},registerBridge:async i=>{let a=await this.appClient.send.call(C.registerBridge(i));return{...a,return:a.return}},addBridgeToken:async i=>{let a=await this.appClient.send.call(C.addBridgeToken(i));return{...a,return:a.return}},removeBridgeToken:async i=>{let a=await this.appClient.send.call(C.removeBridgeToken(i));return{...a,return:a.return}},withdrawGasTokens:async i=>{let a=await this.appClient.send.call(C.withdrawGasTokens(i));return{...a,return:a.return}},withdrawBridgingFeeInTokens:async i=>{let a=await this.appClient.send.call(C.withdrawBridgingFeeInTokens(i));return{...a,return:a.return}},getBridgingCostInTokens:async i=>{let a=await this.appClient.send.call(C.getBridgingCostInTokens(i));return{...a,return:a.return}},hashMessage:async i=>{let a=await this.appClient.send.call(C.hashMessage(i));return{...a,return:a.return}},isOtherBridgeTokenSupported:async i=>{let a=await this.appClient.send.call(C.isOtherBridgeTokenSupported(i));return{...a,return:a.return}},getTransactionCost:async i=>{let a=await this.appClient.send.call(C.getTransactionCost(i));return{...a,return:a.return}},getReceiveTokensCost:async(i={args:[]})=>{let a=await this.appClient.send.call(C.getReceiveTokensCost(i));return{...a,return:a.return}},getSendTransactionStorageCost:async(i={args:[]})=>{let a=await this.appClient.send.call(C.getSendTransactionStorageCost(i));return{...a,return:a.return}},swap:async i=>{let a=await this.appClient.send.call(C.swap(i));return{...a,return:a.return}},addPool:async i=>{let a=await this.appClient.send.call(C.addPool(i));return{...a,return:a.return}},removePool:async i=>{let a=await this.appClient.send.call(C.removePool(i));return{...a,return:a.return}},stopSwap:async(i={args:[]})=>{let a=await this.appClient.send.call(C.stopSwap(i));return{...a,return:a.return}},startSwap:async(i={args:[]})=>{let a=await this.appClient.send.call(C.startSwap(i));return{...a,return:a.return}},setStopAuthority:async i=>{let a=await this.appClient.send.call(C.setStopAuthority(i));return{...a,return:a.return}},setRebalancer:async i=>{let a=await this.appClient.send.call(C.setRebalancer(i));return{...a,return:a.return}},getGasUsage:async i=>{let a=await this.appClient.send.call(C.getGasUsage(i));return{...a,return:a.return}},setGasUsage:async i=>{let a=await this.appClient.send.call(C.setGasUsage(i));return{...a,return:a.return}},setGasOracle:async i=>{let a=await this.appClient.send.call(C.setGasOracle(i));return{...a,return:a.return}},getTransactionRelayerCost:async i=>{let a=await this.appClient.send.call(C.getTransactionRelayerCost(i));return{...a,return:a.return}},transferOwnership:async i=>{let a=await this.appClient.send.call(C.transferOwnership(i));return{...a,return:a.return}}};clone(i){return new r(this.appClient.clone(i))}async getBridgingCostInTokens(i){return(await this.appClient.send.call(C.getBridgingCostInTokens(i))).return}async hashMessage(i){return(await this.appClient.send.call(C.hashMessage(i))).return}async isOtherBridgeTokenSupported(i){return(await this.appClient.send.call(C.isOtherBridgeTokenSupported(i))).return}async getTransactionCost(i){return(await this.appClient.send.call(C.getTransactionCost(i))).return}async getReceiveTokensCost(i={args:[]}){return(await this.appClient.send.call(C.getReceiveTokensCost(i))).return}async getSendTransactionStorageCost(i={args:[]}){return(await this.appClient.send.call(C.getSendTransactionStorageCost(i))).return}async getGasUsage(i){return(await this.appClient.send.call(C.getGasUsage(i))).return}async getTransactionRelayerCost(i){return(await this.appClient.send.call(C.getTransactionRelayerCost(i))).return}state={global:{getAll:async()=>{let i=await this.appClient.state.global.getAll();return{chainId:i.chainId,messenger:i.messenger,stopAuthority:i.stopAuthority,rebalancer:i.rebalancer,canSwap:i.canSwap,gasOracle:i.gasOracle,owner:i.owner}},chainId:async()=>await this.appClient.state.global.getValue("chainId"),messenger:async()=>await this.appClient.state.global.getValue("messenger"),stopAuthority:async()=>await this.appClient.state.global.getValue("stopAuthority"),rebalancer:async()=>await this.appClient.state.global.getValue("rebalancer"),canSwap:async()=>await this.appClient.state.global.getValue("canSwap"),gasOracle:async()=>await this.appClient.state.global.getValue("gasOracle"),owner:async()=>await this.appClient.state.global.getValue("owner")},box:{getAll:async()=>{let i=await this.appClient.state.box.getAll();return{}},processedMessages:{getMap:async()=>await this.appClient.state.box.getMap("processedMessages"),value:async i=>await this.appClient.state.box.getMapValue("processedMessages",i)},sentMessages:{getMap:async()=>await this.appClient.state.box.getMap("sentMessages"),value:async i=>await this.appClient.state.box.getMapValue("sentMessages",i)},otherBridges:{getMap:async()=>await this.appClient.state.box.getMap("otherBridges"),value:async i=>await this.appClient.state.box.getMapValue("otherBridges",i)},otherBridgeTokens:{getMap:async()=>await this.appClient.state.box.getMap("otherBridgeTokens"),value:async i=>await this.appClient.state.box.getMapValue("otherBridgeTokens",i)},pools:{getMap:async()=>await this.appClient.state.box.getMap("pools"),value:async i=>await this.appClient.state.box.getMapValue("pools",i)},fromGasOracleScalingFactor:{getMap:async()=>await this.appClient.state.box.getMap("fromGasOracleScalingFactor"),value:async i=>await this.appClient.state.box.getMapValue("fromGasOracleScalingFactor",i)},bridgingFeeConversionScalingFactor:{getMap:async()=>await this.appClient.state.box.getMap("bridgingFeeConversionScalingFactor"),value:async i=>await this.appClient.state.box.getMapValue("bridgingFeeConversionScalingFactor",i)},gasUsage:{getMap:async()=>await this.appClient.state.box.getMap("gasUsage"),value:async i=>await this.appClient.state.box.getMapValue("gasUsage",i)}}};newGroup(){let i=this,a=this.algorand.newGroup(),o=Promise.resolve(),s=[];return{optInAsset(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.optInAsset(d))),s.push(void 0),this},noop(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.noop(d))),s.push(void 0),this},swapAndBridge(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swapAndBridge(d))),s.push(void 0),this},receiveTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.receiveTokens(d))),s.push(void 0),this},registerBridge(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.registerBridge(d))),s.push(void 0),this},addBridgeToken(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.addBridgeToken(d))),s.push(void 0),this},removeBridgeToken(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.removeBridgeToken(d))),s.push(void 0),this},withdrawGasTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.withdrawGasTokens(d))),s.push(void 0),this},withdrawBridgingFeeInTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.withdrawBridgingFeeInTokens(d))),s.push(void 0),this},getBridgingCostInTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getBridgingCostInTokens(d))),s.push(A=>i.decodeReturnValue("getBridgingCostInTokens(byte,uint64)uint64",A)),this},hashMessage(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.hashMessage(d))),s.push(A=>i.decodeReturnValue("hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]",A)),this},isOtherBridgeTokenSupported(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.isOtherBridgeTokenSupported(d))),s.push(A=>i.decodeReturnValue("isOtherBridgeTokenSupported(byte,byte[32])bool",A)),this},getTransactionCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getTransactionCost(d))),s.push(A=>i.decodeReturnValue("getTransactionCost(byte)uint64",A)),this},getReceiveTokensCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getReceiveTokensCost(d))),s.push(A=>i.decodeReturnValue("getReceiveTokensCost()uint64",A)),this},getSendTransactionStorageCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getSendTransactionStorageCost(d))),s.push(A=>i.decodeReturnValue("getSendTransactionStorageCost()uint64",A)),this},swap(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swap(d))),s.push(void 0),this},addPool(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.addPool(d))),s.push(void 0),this},removePool(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.removePool(d))),s.push(void 0),this},stopSwap(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.stopSwap(d))),s.push(void 0),this},startSwap(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.startSwap(d))),s.push(void 0),this},setStopAuthority(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setStopAuthority(d))),s.push(void 0),this},setRebalancer(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setRebalancer(d))),s.push(void 0),this},getGasUsage(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getGasUsage(d))),s.push(A=>i.decodeReturnValue("getGasUsage(byte)uint64",A)),this},setGasUsage(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setGasUsage(d))),s.push(void 0),this},setGasOracle(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setGasOracle(d))),s.push(void 0),this},getTransactionRelayerCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getTransactionRelayerCost(d))),s.push(A=>i.decodeReturnValue("getTransactionRelayerCost(byte)uint64",A)),this},transferOwnership(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.transferOwnership(d))),s.push(void 0),this},clearState(d){return o=o.then(()=>a.addAppCall(i.params.clearState(d))),this},addTransaction(d,A){return o=o.then(()=>a.addTransaction(d,A)),this},async composer(){return await o,a},async simulate(d){await o;let A=await(d?a.simulate(d):a.simulate());return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}},async send(d){await o;let A=await a.send(d);return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}}}}};import{populateAppCallResources as rr}from"@algorandfoundation/algokit-utils";import sr,{ABIMethod as dr,AtomicTransactionComposer as Ar,makeBasicAccountTransactionSigner as gr}from"algosdk";var cr=new dr({name:"noop",args:[],returns:{type:"void"}});function yt(r){let{composer:i,appId:a,sender:o,signer:s,count:d}=r;for(let A=0;A<d;A++)i.addAppCallMethodCall({appId:a,method:cr,args:[],sender:o,signer:s,note:`noop_${A}`})}function dt(r){return(r*1e3).microAlgos()}async function Xi(r,i,a){let o=new Ar,s=gr({addr:i,sk:new Uint8Array(64)});r.forEach(g=>{o.addTransaction({txn:g,signer:s})});let A=(await rr(o,a)).buildGroup().map(g=>g.txn);return _e(...A)}function _e(...r){return r.map(a=>sr.encodeUnsignedTransaction(a)).map(a=>Buffer.from(a).toString("hex"))}async function Gn(r,i,a){typeof r=="string"&&(r=BigInt(r));let s=(await a.account.getInformation(i)).assets;return s?s.find(({assetId:A})=>A===r)!==void 0:!1}async function Fn(r,i,a){typeof r=="string"&&(r=BigInt(r));let s=(await a.account.getInformation(i)).appsLocalState;return s?s.find(({id:A})=>A===r)!==void 0:!1}var Ae=class{};import{PublicKey as lr}from"@solana/web3.js";import{Address as ur}from"@stellar/stellar-sdk";import mr,{Address as pr}from"algosdk";import{Big as ye}from"big.js";import Za from"randombytes";import{utils as Wa}from"tronweb";import{Big as R}from"big.js";import Vi from"bn.js";function Si(r,i){return R(100).minus(R(100).times(i).div(r)).toNumber()}function At(r,i){return Re(r,i,3).round(0,R.roundDown)}function be(r,i){return Re(r,3,i)}function Re(r,i,a){let o=R(a).minus(i).toNumber();return R(r).times(xt(o))}function xt(r){return R(10).pow(r)}function f(r,i){return R(r).times(xt(i))}function F(r,i){let a=R(r);return a.eq(0)?R(0):R(a).div(xt(i))}function te(r){return F(R(r.tokenBalance).minus(r.vUsdBalance).toFixed(),3).div(2).toFixed()}function je(r,{feeShare:i,decimals:a},o){let s=R(r);if(s.lte(0))return"0";let d=s.times(i),A=s.minus(d),g=At(A,a),c=R(o.tokenBalance).plus(g),l=Je(c,o.aValue,o.dValue);return R(o.vUsdBalance).minus(l).round(0,R.roundDown).toFixed()}function Ot(r,{feeShare:i,decimals:a},o){let s=R(r);if(s.lte(0))return R(0).toFixed();let d=s.plus(o.vUsdBalance),A=Je(d,o.aValue,o.dValue),g=be(R(o.tokenBalance).minus(A),a),c=R(g).times(i);return R(g).minus(c).round(0,R.roundDown).toFixed()}function ba(r,i){let a=R(r);if(a.lte(0))return i;let o=a.plus(i.vUsdBalance),s=Je(o,i.aValue,i.dValue);return{aValue:i.aValue,dValue:i.dValue,tokenBalance:s.toFixed(0),vUsdBalance:o.toFixed(0)}}function ya(r,{feeShare:i,decimals:a},o){if(R(r).lte(0))return R(0);let s=R(o.vUsdBalance).minus(r);if(s.lte(0))throw new Ke;let d=Je(s,o.aValue,o.dValue),A=R(d).minus(o.tokenBalance),g=be(A,a),c=R(i).div(R(1).minus(i)),l=R(g).times(c).round(0,R.roundUp);return R(g).plus(l).round(0,R.roundDown)}function ha(r,{feeShare:i,decimals:a},o){if(R(r).lte(0))return R(0);let s=R(i).div(R(1).minus(i)),d=R(r).times(s).round(0,R.roundUp),A=R(r).plus(d),g=At(A,a),c=R(o.tokenBalance).minus(g);if(c.lte(0))throw new Ke;let l=Je(c,o.aValue,o.dValue);return R(l).minus(o.vUsdBalance).round(0,R.roundDown)}function Je(r,i,a){let o=R(4).times(i).times(R(a).minus(r)).minus(a),s=R(a).pow(3),d=o.pow(2),A=R(r).times(R(r).times(d).plus(R(4).times(i).times(s))).sqrt().round(0,R.roundDown),g=R(8).times(i).times(r),c=o.times(r).plus(A).div(g).round(0,R.roundDown);return c.eq(0)?R(0):c.plus(1)}function va(r,i,a,o){let s=new Vi(r),d=new Vi(a),A=new Vi(i);return s.mul(d).shrn(o).sub(A).toString()}function Ya(r){return R(r).gt(0)?`${Number(R(r).times(100).toFixed(2)).toLocaleString()}%`:"N/A"}function Ra(r,i,a){let o=R(i).times(a),s=R(i).plus(a),d=R(8).times(r).times(o).times(s),A=o.times(R(16).times(r).minus(4)).div(3),g=d.times(d),c=A.times(A).times(A),l=g.plus(c),u=R(l).sqrt(),m=R(Math.cbrt(+d.plus(u).toFixed())),p=R(Math.cbrt(+d.minus(u).toFixed()));return m.plus(p).toFixed()}function Ue(r,i,a){let o;switch(i){case"EVM":{o=Ba(r);break}case"SOLANA":{o=new lr(r).toBuffer();break}case"TRX":{o=Ir(r);break}case"SRB":{o=new ur(r).toBuffer();break}case"SUI":{o=Ba(r);break}case"ALG":{o=Cr(r);break}}switch(a){case"EVM":return"0x"+o.toString("hex");case"SOLANA":return Array.from(o);case"TRX":return o;case"SRB":return o.toJSON().data;case"SUI":return"0x"+o.toString("hex");case"ALG":return o}}function Te(r){return r.replace(/^0x/i,"")}function Ga(r){return Buffer.from(r.replace(/^0x/i,""),"hex")}function Ba(r){let a=Ga(r);return Buffer.concat([Buffer.alloc(32-a.length,0),a],32)}function Cr(r){if(mr.isValidAddress(r))return Buffer.from(pr.fromString(r).publicKey);if(/^\d+$/.test(r)){let i=BigInt(r).toString(16);return i=i.padStart(64,"0"),Buffer.from(i,"hex")}throw new I(`Unexpected Alg address: ${r}`)}function Ir(r){let i=Qt(r),a=Ga(i);return br(a,32)}function Qt(r){let i=Wa.crypto.decodeBase58Address(r);return i?Wa.bytes.byteArray2hexStr(i).replace(/^41/,"0x"):""}function br(r,i){if(r.length>=i)return r;let a=Buffer.alloc(i,0);return r.copy(a,i-r.length),a}function ht(){return Za(32)}function ke(){let r=Za(32).readBigInt64BE();return r<0?r*-1n:r}function We(r,i){let a={},o=i.sourceToken;switch(a.amount=f(i.amount,o.decimals).toFixed(),a.contractAddress=o.bridgeAddress,a.fromAccountAddress=i.fromAccountAddress,r){case"SUI":{if(!o.originTokenAddress)throw new I("SUI sourceToken must contain 'originTokenAddress'");a.fromTokenAddress=o.originTokenAddress;break}case"ALG":{a.fromTokenAddress=o.tokenAddress;break}default:a.fromTokenAddress=Ue(o.tokenAddress,r,r)}switch(a.toAccountAddress=i.toAccountAddress,r){case"SUI":{if(!i.destinationToken.originTokenAddress)throw new I("SUI destinationToken must contain 'originTokenAddress'");a.toTokenAddress=i.destinationToken.originTokenAddress;break}case"ALG":{a.toTokenAddress=i.destinationToken.tokenAddress;break}default:a.toTokenAddress=Ue(i.destinationToken.tokenAddress,r,r)}return a.minimumReceiveAmount=i.minimumReceiveAmount?f(i.minimumReceiveAmount,i.destinationToken.decimals).toFixed():"0",a}async function he(r,i,a){let o={};o.fromChainId=i.sourceToken.allbridgeChainId,o.fromChainSymbol=i.sourceToken.chainSymbol;let s=X.getChainProperty(i.destinationToken.chainSymbol).chainType;if(r==="SUI"){if(!i.sourceToken.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");o.fromTokenAddress=i.sourceToken.originTokenAddress}else o.fromTokenAddress=i.sourceToken.tokenAddress;o.toChainId=i.destinationToken.allbridgeChainId,o.toTokenAddress=i.destinationToken.tokenAddress,i.gasFeePaymentMethod==="stablecoin"?o.gasFeePaymentMethod="stablecoin":o.gasFeePaymentMethod="native";let d=i.sourceToken;switch(i.messenger){case 3:if(!d.cctpAddress||!i.destinationToken.cctpAddress)throw new se("Such route does not support CCTP protocol");o.contractAddress=d.cctpAddress;break;case 4:if(!d.cctpV2Address||!i.destinationToken.cctpV2Address)throw new se("Such route does not support CCTP V2 protocol");o.contractAddress=d.cctpV2Address;break;case 5:if(!d.oftBridgeAddress||!i.destinationToken.oftBridgeAddress||d.oftId!==i.destinationToken.oftId)throw new de("Such route does not support OFT protocol");o.contractAddress=d.oftBridgeAddress;break;case 1:case 2:o.contractAddress=d.bridgeAddress;break}o.messenger=i.messenger,o.fromAccountAddress=i.fromAccountAddress,o.amount=f(i.amount,d.decimals).toFixed();let{fee:A,feeFormat:g}=i;if(!A){let m=(await Mi(i.sourceToken,o.toChainId,o.messenger,a))[o.gasFeePaymentMethod];if(!m)throw new Jt;A=m.int,g="int"}if(g=="float")switch(o.gasFeePaymentMethod){case"native":o.fee=f(A,X.getChainDecimalsByType(d.chainType)).toFixed(0);break;case"stablecoin":o.fee=f(A,d.decimals).toFixed(0);break}else o.fee=A;let{extraGas:c,extraGasFormat:l}=i;if(c&&+c>0){let u=await Hi(d,i.destinationToken,o.messenger,a),m,p;switch(o.gasFeePaymentMethod){case"native":m=X.getChainDecimalsByType(d.chainType),p=ye(u.exchangeRate);break;case"stablecoin":m=d.decimals,p=ye(u.exchangeRate).div(u.sourceNativeTokenPrice);break}switch(l??"int"){case"float":{o.extraGas=f(c,m).toFixed(0);let b=p.mul(c);o.extraGasDest=f(b,X.getChainDecimalsByType(i.destinationToken.chainType)).toFixed(0,ye.roundDown);break}case"int":{o.extraGas=c;let b=F(o.extraGas,X.getChainDecimalsByType(d.chainType)),W=p.mul(b);o.extraGasDest=f(W,X.getChainDecimalsByType(i.destinationToken.chainType)).toFixed(0,ye.roundDown);break}}hr(o.extraGas,o.gasFeePaymentMethod,u)}return["SUI","ALG"].includes(r)||(o.fromTokenAddress=Ue(o.fromTokenAddress,r,r)),o.toAccountAddress=Ue(i.toAccountAddress,s,r),o.toTokenAddress=Ue(o.toTokenAddress,s,r),o.gasFeePaymentMethod=="stablecoin"&&yr(o.amount,d.decimals,o.fee,o.extraGas),o}function yr(r,i,a,o){let s=ye(r).minus(a).minus(o??0);if(s.lte(0))throw new It(`Amount not enough to pay fee, ${F(ye(s).minus(1).neg(),i).toFixed()} stables is missing`)}async function Mi(r,i,a,o){let s=await o.getReceiveTransactionCost({sourceChainId:r.allbridgeChainId,destinationChainId:i,messenger:a,sourceToken:r.tokenAddress}),d={native:{int:s.fee,float:F(s.fee,X.getChainDecimalsByType(r.chainType)).toFixed()},adminFeeShareWithExtras:s.adminFeeShareWithExtras};if(s.sourceNativeTokenPrice){let A=Re(new ye(s.fee).mul(s.sourceNativeTokenPrice),X.getChainDecimalsByType(r.chainType),r.decimals).toFixed(0,ye.roundUp);d.stablecoin={int:A,float:F(A,r.decimals).toFixed()}}return d}function hr(r,i,a){let o=a.extraGasMax[i];if(!o)throw new Jt(`Impossible to pay extra gas by '${i}' payment method`);let s=o.int;if(ye(r).gt(s))throw new bn(`Extra gas ${r} in int format, exceeded limit ${s} for '${i}' payment method`)}async function Hi(r,i,a,o){let s={},d=await o.getReceiveTransactionCost({sourceChainId:r.allbridgeChainId,destinationChainId:i.allbridgeChainId,messenger:a,sourceToken:r.tokenAddress}),A=i.txCostAmount.maxAmount,g=F(A,X.getChainDecimalsByType(i.chainType)).toFixed(),c=ye(g).div(d.exchangeRate).toFixed(X.getChainDecimalsByType(r.chainType),ye.roundDown),l=f(c,X.getChainDecimalsByType(r.chainType)).toFixed(0);if(s.native={int:l,float:c},d.sourceNativeTokenPrice){let u=ye(c).mul(d.sourceNativeTokenPrice).toFixed(r.decimals,ye.roundDown);s.stablecoin={int:f(u,r.decimals).toFixed(0),float:u}}return{extraGasMax:s,destinationChain:{gasAmountMax:{int:A,float:g},swap:{int:i.txCostAmount.swap,float:F(i.txCostAmount.swap,X.getChainDecimalsByType(i.chainType)).toFixed()},transfer:{int:i.txCostAmount.transfer,float:F(i.txCostAmount.transfer,X.getChainDecimalsByType(i.chainType)).toFixed()}},exchangeRate:d.exchangeRate,sourceNativeTokenPrice:d.sourceNativeTokenPrice}}function Fa(r){return r.sourceToken.chainSymbol!==r.destinationToken.chainSymbol}var Kt=class extends Ae{constructor(a,o){super();this.algorand=a;this.api=o;a.setDefaultSigner(fa.makeBasicAccountTransactionSigner(fa.mnemonicToSecretKey("tunnel gym elevator pulse motor evolve release orange culture make sister approve winter chair armor grocery distance festival tiger holiday dish wisdom region absorb secret")))}chainType="ALG";send(a){throw new k}async buildRawTransactionSend(a){let o=await he(this.chainType,a,this.api);if(!a.sourceToken.bridgeId)throw new I("ALG sourceToken must contain 'bridgeId'");let s=BigInt(a.sourceToken.bridgeId),d=this.getBridge(s),A=Na.fromString(a.fromAccountAddress),g=BigInt(a.sourceToken.tokenAddress),c=o.toChainId,l=o.toAccountAddress,u=o.toTokenAddress,m=ht(),p=BigInt(o.amount),b=BigInt(o.fee);o.extraGas&&(b=b+BigInt(o.extraGas));let W=o.gasFeePaymentMethod==="stablecoin",y=this.algorand.newGroup(),Z;W?Z=b:(y.addPayment({sender:A,receiver:d.appAddress,amount:vr.MicroAlgo(b)}),Z=0n),y.addAssetTransfer({assetId:g,amount:p,sender:A,receiver:d.appAddress}).addAppCallMethodCall(await d.params.swapAndBridge({args:{tokenId:g,recipient:l,destinationChainId:c,receiveToken:u,nonce:m,feeTokenAmount:Z},sender:A,extraFee:dt(W?9:8)})),yt({composer:y,appId:s,sender:A,count:W?3:2});let{transactions:v}=await y.buildTransactions();return Xi(v,A,this.algorand.client.algod)}async buildRawTransactionSwap(a){let o=We(this.chainType,a),s=Na.fromString(a.fromAccountAddress),d=a.toAccountAddress,A=BigInt(a.sourceToken.tokenAddress),g=BigInt(a.destinationToken.tokenAddress),c=BigInt(o.minimumReceiveAmount),l=BigInt(o.amount);if(!a.sourceToken.bridgeId)throw new I("ALG sourceToken must contain 'bridgeId'");let u=BigInt(a.sourceToken.bridgeId),m=this.getBridge(u),p=this.algorand.newGroup();a.fromAccountAddress===d&&(await Gn(g,d,this.algorand)||p.addAssetOptIn({sender:s,assetId:g})),p.addAssetTransfer({assetId:A,amount:l,sender:s,receiver:m.appAddress}),p.addAppCallMethodCall(await m.params.swap({args:{tokenId:A,recipient:d,receiveTokenId:g,receiveAmountMin:c},sender:s,extraFee:dt(4)})),yt({composer:p,appId:u,sender:s,count:1});let{transactions:b}=await p.buildTransactions();return Xi(b,s,this.algorand.client.algod)}getBridge(a){return this.algorand.client.getTypedAppClientById(Zn,{appId:a})}};import{Big as Fr}from"big.js";var Yr={abi:[{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"uint256",name:"_chainPrecision",type:"uint256"},{internalType:"contract Messenger",name:"_allbridgeMessenger",type:"address"},{internalType:"contract WormholeMessenger",name:"_wormholeMessenger",type:"address"},{internalType:"contract IGasOracle",name:"_gasOracle",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"gas",type:"uint256"}],name:"BridgingFeeFromTokens",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"bridgeTransactionCost",type:"uint256"},{indexed:!1,internalType:"uint256",name:"messageTransactionCost",type:"uint256"}],name:"ReceiveFee",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Received",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"bytes32",name:"sendToken",type:"bytes32"},{indexed:!1,internalType:"bytes32",name:"receiveToken",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"sendAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receiveAmount",type:"uint256"}],name:"Swapped",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{indexed:!1,internalType:"bytes32",name:"message",type:"bytes32"}],name:"TokensReceived",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"receiveToken",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"}],name:"TokensSent",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"addBridgeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract Pool",name:"pool",type:"address"},{internalType:"bytes32",name:"token",type:"bytes32"}],name:"addPool",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"canSwap",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"gasUsage",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"address",name:"tokenAddress",type:"address"}],name:"getBridgingCostInTokens",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"getMessageCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"getMessageGasUsage",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"getTransactionCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"message",type:"bytes32"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"hasReceivedMessage",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"message",type:"bytes32"}],name:"hasSentMessage",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"}],name:"hashMessage",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"otherBridgeTokens",outputs:[{internalType:"bool",name:"isSupported",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"otherBridges",outputs:[{internalType:"bytes32",name:"bridgeAddress",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"tokenId",type:"bytes32"}],name:"pools",outputs:[{internalType:"contract Pool",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"messageHash",type:"bytes32"}],name:"processedMessages",outputs:[{internalType:"uint256",name:"isProcessed",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"}],name:"receiveTokens",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"bridgeAddress",type:"bytes32"}],name:"registerBridge",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"removeBridgeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"messageHash",type:"bytes32"}],name:"sentMessages",outputs:[{internalType:"uint256",name:"isSent",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract Messenger",name:"_allbridgeMessenger",type:"address"}],name:"setAllbridgeMessenger",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IGasOracle",name:"_gasOracle",type:"address"}],name:"setGasOracle",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"uint256",name:"gasAmount",type:"uint256"}],name:"setGasUsage",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_rebalancer",type:"address"}],name:"setRebalancer",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_stopAuthority",type:"address"}],name:"setStopAuthority",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract WormholeMessenger",name:"_wormholeMessenger",type:"address"}],name:"setWormholeMessenger",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startSwap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopSwap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"token",type:"bytes32"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"}],name:"swap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"token",type:"bytes32"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"uint256",name:"feeTokenAmount",type:"uint256"}],name:"swapAndBridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IERC20",name:"token",type:"address"}],name:"withdrawBridgingFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"withdrawGasTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},Ta=Yr;var Rr={abi:[{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"chainPrecision_",type:"uint256"},{internalType:"address",name:"tokenAddress",type:"address"},{internalType:"address",name:"cctpMessenger_",type:"address"},{internalType:"address",name:"cctpTransmitter_",type:"address"},{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedExtraGas",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedGas",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"newRecipient",type:"bytes32"}],name:"RecipientReplaced",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"recipientWalletAddress",type:"bytes32"}],name:"TokensSentExtras",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromTokens",type:"uint256"},{indexed:!1,internalType:"uint256",name:"relayerFee",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"adminFeeTokenAmount",type:"uint256"}],name:"TokensSent",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"}],name:"bridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"bytes32",name:"recipientWalletAddress",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"}],name:"bridgeWithWalletAddress",outputs:[],stateMutability:"payable",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes",name:"originalMessage",type:"bytes"},{internalType:"bytes",name:"originalAttestation",type:"bytes"},{internalType:"bytes32",name:"newRecipient",type:"bytes32"}],name:"changeRecipient",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"gasUsage",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"destinationChainId",type:"uint256"}],name:"getBridgingCostInTokens",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"getDomainByChainId",outputs:[{internalType:"uint32",name:"",type:"uint32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"getTransactionCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"uint64",name:"nonce",type:"uint64"}],name:"isMessageProcessed",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"bytes",name:"message",type:"bytes"},{internalType:"bytes",name:"signature",type:"bytes"}],name:"receiveTokens",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint32",name:"domain",type:"uint32"}],name:"registerBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"adminFeeShareBP_",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],name:"setGasOracle",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"uint256",name:"gasAmount",type:"uint256"}],name:"setGasUsage",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"unregisterBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"withdrawFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"withdrawGas",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},wa=Rr;var Wr={abi:[{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"chainPrecision_",type:"uint256"},{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[{internalType:"uint16",name:"optionType",type:"uint16"}],name:"InvalidOptionType",type:"error"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"address",name:"tokenAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromTokens",type:"uint256"},{indexed:!1,internalType:"uint256",name:"relayerFeeWithExtraGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"adminFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"extraGasDestinationToken",type:"uint256"}],name:"OftTokensSent",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedGas",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[{internalType:"address",name:"oft_",type:"address"}],name:"addToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"}],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"feeShare",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"},{internalType:"uint256",name:"extraGasInDestinationToken",type:"uint256"},{internalType:"uint256",name:"slippageBP",type:"uint256"}],name:"bridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"destinationChainId_",type:"uint256"},{internalType:"uint128",name:"extraGasAmount_",type:"uint128"}],name:"extraGasPrice",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"getEidByChainId",outputs:[{internalType:"uint32",name:"",type:"uint32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"}],name:"oftAddress",outputs:[{internalType:"address",name:"oftAddress",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint32",name:"eid_",type:"uint32"},{internalType:"uint128",name:"lzGasLimit_",type:"uint128"}],name:"registerBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"destinationChainId_",type:"uint256"}],name:"relayerFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"oft_",type:"address"}],name:"removeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"adminFeeShareBP_",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint128",name:"lzGasLimit_",type:"uint128"}],name:"setLzGasLimit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"maxExtraGas_",type:"uint256"}],name:"setMaxExtraGas",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"unregisterBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IERC20",name:"token_",type:"address"}],name:"withdrawFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount_",type:"uint256"}],name:"withdrawGas",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},Xa=Wr;import*as Nn from"@project-serum/anchor";import{PublicKey as ka}from"@solana/web3.js";import*as ae from"@project-serum/anchor";import{PublicKey as ge}from"@solana/web3.js";async function we(r,i){return ae.utils.token.associatedAddress({mint:i,owner:r})}async function qe(r){let[i]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("config")],r);return i}async function Va(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("lock"),Uint8Array.from(r)],i);return a}async function Ut(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("price_v2"),Uint8Array.from([r])],i);return a}async function vt(r){let i=await qe(r),[a]=await ge.findProgramAddress([i.toBuffer()],r);return a}async function Sa(r,i){let[a]=await ge.findProgramAddress([r.toBuffer()],i);return a}async function Yt(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("token"),r.toBytes()],i);return a}async function Ma(r,i,a){let[o]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("other_bridge_token"),Buffer.from([r]),i],a);return o}async function Li(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("chain_bridge"),Uint8Array.from([r])],i);return a}async function Pi(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("gas_usage"),Uint8Array.from([r])],i);return a}async function Ha(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("sent_message"),r],i);return a}async function ji(r,i,a){let[o]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("user_deposit"),i.toBytes(),r.toBytes()],a);return o}async function La(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("cctp_bridge"),r.toBytes()],i);return a}async function Pa(r,i){let[a]=await ge.findProgramAddress([ae.utils.bytes.utf8.encode("token"),r.toBytes()],i);return a}function ja(r,i){let[a]=ge.findProgramAddressSync([ae.utils.bytes.utf8.encode("lock"),i.toBuffer()],r);return a}function Ja(r,i,a,o){let s=gt("message_transmitter",a),d=gt("token_messenger",o),A=gt("__event_authority",o),g=gt("token_minter",o),c=gt("local_token",o,[i]),l=gt("remote_token_messenger",o,[r.toString()]),u=gt("sender_authority",o);return{messageTransmitterAccount:s,tokenMessenger:d,tokenMessengerEventAuthority:A,tokenMinter:g,localToken:c,remoteTokenMessengerKey:l,authorityPda:u}}function gt(r,i,a=[]){let o=[Buffer.from(ae.utils.bytes.utf8.encode(r))];for(let d of a)typeof d=="string"?o.push(Buffer.from(ae.utils.bytes.utf8.encode(d))):Array.isArray(d)||Buffer.isBuffer(d)?o.push(Buffer.from(Uint8Array.from(d))):o.push(Buffer.from(Uint8Array.from(d.toBuffer())));return ge.findProgramAddressSync(o,i)[0]}import{AnchorProvider as Br}from"@project-serum/anchor";import{Connection as Zr,PublicKey as Gr}from"@solana/web3.js";function et(r,i){let a=new Zr(r,"confirmed"),o=new Gr(i);return new Br(a,{publicKey:o},{preflightCommitment:"confirmed",commitment:"confirmed"})}async function Tn(r,i,a,o){let s,d=new ka(i),A=new ka(a),g=await we(d,A),c=et(o,i);Nn.setProvider(c);let l=await Nn.Spl.token(c).account.token.fetchNullable(g);if(l?.authority.equals(d))s=Ue(g.toBase58(),"SOLANA",r);else{let u=await c.connection.getTokenAccountsByOwner(d,{mint:A});if(u.value.length===0&&!l)s=Ue(g.toBase58(),"SOLANA",r);else if(u.value.length>0){let m=u.value[0];if(!m?.pubkey)throw new I("First token account or its public key is undefined");s=Ue(m.pubkey.toBase58(),"SOLANA",r)}else throw new I("Associated account has wrong owner")}return s}var Dt=class extends Ae{constructor(a,o,s){super();this.web3=a;this.api=o;this.nodeRpcUrlsConfig=s}chainType="EVM";async send(a){let o=await this.buildRawTransactionSend(a);return this.sendRawTransaction(o)}async buildRawTransactionSwap(a){let o=We(this.chainType,a);return await this.buildRawTransactionSwapFromParams(o)}async buildRawTransactionSwapFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toAccountAddress:g,toTokenAddress:c,minimumReceiveAmount:l}=a,m=this.getBridgeContract(s).methods.swap(o,A,c,g,l);return Promise.resolve({from:d,to:s,data:m.encodeABI()})}async buildRawTransactionSend(a){let o=await he(this.chainType,a,this.api),{amount:s,contractAddress:d,fromAccountAddress:A,fromTokenAddress:g,toChainId:c,toAccountAddress:l,toTokenAddress:u,messenger:m,fee:p,gasFeePaymentMethod:b,extraGas:W,extraGasDest:y}=o,Z="0x"+ht().toString("hex"),v,Y,B=p;switch(W&&(B=Fr(B).plus(W).toFixed()),m){case 3:case 4:{let w=await this.buildRawTransactionCctpSend(a,o,B);v=w.sendMethod,Y=w.value;break}case 5:{let w=this.buildRawTransactionOftSend(a,o,B,y);v=w.sendMethod,Y=w.value;break}case 1:case 2:{let w=this.getBridgeContract(d);b==="stablecoin"?(v=w.methods.swapAndBridge(g,s,l,c,u,Z,m,B),Y="0"):(v=w.methods.swapAndBridge(g,s,l,c,u,Z,m,0),Y=B)}break}return Promise.resolve({from:A,to:d,value:Y,data:v.encodeABI()})}async buildRawTransactionCctpSend(a,o,s){let{amount:d,contractAddress:A,toChainId:g,toAccountAddress:c,gasFeePaymentMethod:l}=o,u=this.getCctpBridgeContract(A),m,p;if(a.destinationToken.chainType==="SOLANA"){let b=await Tn(this.chainType,a.toAccountAddress,a.destinationToken.tokenAddress,this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"));l==="stablecoin"?(m=u.methods.bridgeWithWalletAddress(d,b,c,g,s),p="0"):(m=u.methods.bridgeWithWalletAddress(d,b,c,g,0),p=s)}else l==="stablecoin"?(m=u.methods.bridge(d,c,g,s),p="0"):(m=u.methods.bridge(d,c,g,0),p=s);return{sendMethod:m,value:p}}buildRawTransactionOftSend(a,o,s,d){let{amount:A,contractAddress:g,toChainId:c,toAccountAddress:l,gasFeePaymentMethod:u}=o,m=this.getOftBridgeContract(g),p,b;return u==="stablecoin"?(p=m.methods.bridge(a.sourceToken.tokenAddress,A,l,c,s,d??"0","10"),b="0"):(p=m.methods.bridge(a.sourceToken.tokenAddress,A,l,c,0,d??"0","10"),b=s),{sendMethod:p,value:b}}async sendRawTransaction(a){let o=await this.web3.eth.estimateGas(a),s={maxPriorityFeePerGas:null,maxFeePerGas:null},{transactionHash:d}=await this.web3.eth.sendTransaction({...a,gas:o,...s});return{txId:d.toString()}}getBridgeContract(a){return new this.web3.eth.Contract(Ta.abi,a)}getCctpBridgeContract(a){return new this.web3.eth.Contract(wa.abi,a)}getOftBridgeContract(a){return new this.web3.eth.Contract(Xa.abi,a)}};var wn=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s}async approve(i,a){let o,s;a?(o=i,s=a):s=i;let d=Et(s.token,s.messenger);return this.tokenService.buildRawTransactionApprove({...s,spender:d},o)}async send(i,a){return V(i.amount),H("amount",i.amount,i.sourceToken.decimals),Fa(i)?Xn(i.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionSend(i):Xn(i.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionSwap(i)}};import{BN as Bt,Program as zi,Spl as Lr,web3 as tt}from"@project-serum/anchor";import{Keypair as eo,PublicKey as Q,SystemProgram as Pr}from"@solana/web3.js";import{Big as Xe}from"big.js";var _t={version:"0.1.0",name:"bridge",instructions:[{name:"initialize",accounts:[{name:"admin",isMut:!0,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializeArgs"}}]},{name:"initializePool",accounts:[{name:"payer",isMut:!0,isSigner:!0},{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"token",isMut:!0,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializePoolArgs"}}]},{name:"initDepositAccount",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"deposit",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"withdraw",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"amountLp",type:"u64"}]},{name:"swapAndBridge",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"messenger",isMut:!1,isSigner:!1},{name:"messengerConfig",isMut:!0,isSigner:!1},{name:"sentMessageAccount",isMut:!0,isSigner:!1},{name:"messengerGasUsage",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"swapAndBridgeWormhole",accounts:[{name:"user",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"wormholeMessenger",isMut:!1,isSigner:!1},{name:"wormholeMessengerConfig",isMut:!0,isSigner:!1},{name:"wormholeProgram",isMut:!1,isSigner:!1},{name:"bridge",isMut:!0,isSigner:!1},{name:"message",isMut:!0,isSigner:!0},{name:"sequence",isMut:!0,isSigner:!1},{name:"feeCollector",isMut:!0,isSigner:!1},{name:"messengerGasUsage",isMut:!1,isSigner:!1},{name:"clock",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"swap",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"sendMint",isMut:!1,isSigner:!1},{name:"receiveMint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"sendPool",isMut:!0,isSigner:!1},{name:"receivePool",isMut:!0,isSigner:!1},{name:"sendBridgeToken",isMut:!0,isSigner:!1},{name:"receiveBridgeToken",isMut:!0,isSigner:!1},{name:"sendUserToken",isMut:!0,isSigner:!1},{name:"receiveUserToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1}],args:[{name:"amount",type:"u64"},{name:"receiveAmountMin",type:"u64"}]},{name:"registerChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"RegisterChainBridgeArgs"}}]},{name:"updateChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1}],args:[{name:"args",type:{defined:"UpdateChainBridgeArgs"}}]},{name:"receiveAndSwap",accounts:[{name:"user",isMut:!0,isSigner:!1},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"receivedMessageAccount",isMut:!1,isSigner:!1},{name:"unlock",isMut:!0,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"messengerProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"UnlockArgs"}}]},{name:"receiveAndSwapWormhole",accounts:[{name:"user",isMut:!0,isSigner:!1},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"receivedMessageAccount",isMut:!1,isSigner:!1},{name:"unlock",isMut:!0,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"messengerProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"UnlockArgs"}}]},{name:"withdrawGasToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"recipient",isMut:!0,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"claimRewards",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"setAdmin",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"newAdmin",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[]},{name:"startBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"actionType",type:{defined:"ActionType"}}]},{name:"stopBridge",accounts:[{name:"stopAuthority",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"actionType",type:{defined:"ActionType"}}]},{name:"setRebalancer",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"rebalancer",isMut:!1,isSigner:!1}],args:[]},{name:"setStopAuthority",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"newAuthority",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[]},{name:"setAllbridgeMessengerProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setWormholeMessengerProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setGasOracleProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setPoolFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"setBalanceRatioMin",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"balanceRatioMinBp",type:"u16"}]},{name:"setPoolAdminFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"addOtherBridgeToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"chainId",type:"u8"},{name:"tokenAddress",type:{array:["u8",32]}}]},{name:"removeOtherBridgeToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"chainId",type:"u8"},{name:"tokenAddress",type:{array:["u8",32]}}]},{name:"withdrawAdminFee",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"adminToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"adjustTotalLpAmount",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1}],args:[]}],accounts:[{name:"chainBridge",type:{kind:"struct",fields:[{name:"address",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"config",type:{kind:"struct",fields:[{name:"admin",type:"publicKey"},{name:"allbridgeMessengerProgramId",type:"publicKey"},{name:"wormholeMessengerProgramId",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"},{name:"rebalancer",type:"publicKey"},{name:"stopAuthority",type:"publicKey"},{name:"authorityBumpSeed",type:"u8"},{name:"canSwap",type:"bool"},{name:"canDeposit",type:"bool"},{name:"canWithdraw",type:"bool"}]}},{name:"lock",type:{kind:"struct",fields:[{name:"sender",type:"publicKey"},{name:"sentTokenAddress",type:"publicKey"},{name:"amount",type:"u64"},{name:"vusdAmount",type:"u64"},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"nonce",type:{array:["u8",32]}},{name:"messenger",type:{defined:"Messenger"}},{name:"slot",type:"u64"},{name:"fee",type:"u64"}]}},{name:"otherBridgeToken",type:{kind:"struct",fields:[]}},{name:"pool",type:{kind:"struct",fields:[{name:"mint",type:"publicKey"},{name:"a",type:"u64"},{name:"d",type:"u64"},{name:"tokenBalance",type:"u64"},{name:"vUsdBalance",type:"u64"},{name:"reserves",type:"u64"},{name:"decimals",type:"u8"},{name:"totalLpAmount",type:"u64"},{name:"feeShareBp",type:"u64"},{name:"adminFeeShareBp",type:"u64"},{name:"accRewardPerShareP",type:"u128"},{name:"adminFeeAmount",type:"u64"},{name:"balanceRatioMinBp",type:"u16"}]}},{name:"unlock",type:{kind:"struct",fields:[{name:"hash",type:{array:["u8",32]}},{name:"amount",type:"u64"},{name:"fee",type:"u64"},{name:"vUsdAmount",type:"u64"},{name:"slot",type:"u64"}]}},{name:"userDeposit",type:{kind:"struct",fields:[{name:"userAddress",type:"publicKey"},{name:"mint",type:"publicKey"},{name:"lpAmount",type:"u64"},{name:"rewardDebt",type:"u64"}]}}],types:[{name:"RegisterChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainBridgeAddress",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"UpdateChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainBridgeAddress",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"InitializeArgs",type:{kind:"struct",fields:[{name:"allbridgeMessengerProgramId",type:"publicKey"},{name:"wormholeMessengerProgramId",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"}]}},{name:"InitializePoolArgs",type:{kind:"struct",fields:[{name:"a",type:"u64"},{name:"feeShareBp",type:"u64"},{name:"adminFeeShareBp",type:"u64"},{name:"balanceRatioMinBp",type:"u16"}]}},{name:"BridgeArgs",type:{kind:"struct",fields:[{name:"nonce",type:{array:["u8",32]}},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"vusdAmount",type:"u64"}]}},{name:"UnlockArgs",type:{kind:"struct",fields:[{name:"nonce",type:{array:["u8",32]}},{name:"amount",type:"u64"},{name:"recipient",type:"publicKey"},{name:"sourceChainId",type:"u8"},{name:"receiveToken",type:"publicKey"},{name:"messenger",type:{defined:"Messenger"}},{name:"hash",type:{array:["u8",32]}},{name:"receiveAmountMin",type:"u64"}]}},{name:"RewardError",type:{kind:"enum",variants:[{name:"FeeTooHigh"}]}},{name:"Messenger",type:{kind:"enum",variants:[{name:"None"},{name:"Allbridge"},{name:"Wormhole"}]}},{name:"ActionType",type:{kind:"enum",variants:[{name:"Deposit"},{name:"Withdraw"},{name:"Swap"}]}}],errors:[{code:6e3,name:"AccountAlreadyInitialized",msg:"This account has already been initialized"},{code:6001,name:"AdminAuthorityInvalid",msg:"This instruction requires admin authority"},{code:6002,name:"InvalidSignature",msg:"Provided signature has wrong signer or message"},{code:6003,name:"InvalidHash",msg:"Wrong unlock message hash"},{code:6004,name:"PoolOverflow",msg:"PoolInfo overflow"},{code:6005,name:"ReservesExhausted",msg:"Reserves exhausted"},{code:6006,name:"ZeroAmount",msg:"Zero amount"},{code:6007,name:"ZeroChanges",msg:"Zero changes"},{code:6008,name:"HighVusdAmount",msg:"vUSD amount is too high"},{code:6009,name:"BalanceRatioExceeded",msg:"Balance ratio exceeded"},{code:6010,name:"InsufficientReceivedAmount",msg:"Received insufficient amount"},{code:6011,name:"ForbiddenAction",msg:"ForbiddenAction"},{code:6012,name:"ValueTooHigh",msg:"Value is too high"}]};var za={version:"0.1.0",name:"cctp_bridge",instructions:[{name:"initialize",accounts:[{name:"payer",isMut:!0,isSigner:!0},{name:"admin",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializeArgs"}}]},{name:"bridge",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"messageSentEventData",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!0,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1},{name:"cctpMessenger",isMut:!1,isSigner:!1},{name:"messageTransmitterProgram",isMut:!1,isSigner:!1},{name:"messageTransmitterAccount",isMut:!0,isSigner:!1},{name:"tokenMessenger",isMut:!1,isSigner:!1},{name:"tokenMinter",isMut:!1,isSigner:!1},{name:"localToken",isMut:!0,isSigner:!1},{name:"remoteTokenMessengerKey",isMut:!1,isSigner:!1},{name:"authorityPda",isMut:!1,isSigner:!1},{name:"eventAuthority",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"registerChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"RegisterChainBridgeArgs"}}]},{name:"updateChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1}],args:[{name:"args",type:{defined:"UpdateChainBridgeArgs"}}]},{name:"setAdminFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"setGasOracleProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"withdrawGasToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"recipient",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"withdrawAdminFee",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"adminToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"setCctpTokenMessengerMinter",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]}],accounts:[{name:"cctpBridge",type:{kind:"struct",fields:[{name:"mint",type:"publicKey"},{name:"admin",type:"publicKey"},{name:"cctpTokenMessengerMinter",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"},{name:"authorityBumpSeed",type:"u8"},{name:"adminFeeShareBp",type:"u64"},{name:"adminFeeAmount",type:"u64"}]}},{name:"chainBridge",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"}]}},{name:"lock",type:{kind:"struct",fields:[{name:"sender",type:"publicKey"},{name:"amount",type:"u64"},{name:"adminFee",type:"u64"},{name:"relayerFee",type:"u64"},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"slot",type:"u64"}]}}],types:[{name:"RegisterChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"},{name:"mint",type:"publicKey"}]}},{name:"UpdateChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"},{name:"mint",type:"publicKey"}]}},{name:"BridgeArgs",type:{kind:"struct",fields:[{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"amount",type:"u64"}]}},{name:"InitializeArgs",type:{kind:"struct",fields:[{name:"gasOracleProgramId",type:"publicKey"},{name:"cctpTokenMessengerMinter",type:"publicKey"}]}}],errors:[{code:6e3,name:"ValueTooHigh",msg:"Value is too high"}]};import{Spl as fr}from"@project-serum/anchor";import Nr from"big.js";import{Web3 as Vn}from"web3";async function Rt(r,i){return await fr.token(i).account.token.fetch(r)}async function xa(r,i,a){let o=await i.account.pool.fetch(a),s=o.decimals,d=Nr(o.feeShareBp.toString()).div(1e4).toFixed(),A={aValue:o.a.toString(),dValue:o.d.toString(),totalLpAmount:o.totalLpAmount.toString(),tokenBalance:o.tokenBalance.toString(),vUsdBalance:o.vUsdBalance.toString(),accRewardPerShareP:o.accRewardPerShareP.toString()};return je(r,{decimals:s,feeShare:d},A)}function Oa(r){let i=r.amount,a="0x"+r.recipient.toString("hex"),o=r.sourceChainId,s=r.destinationChainId,d="0x"+r.receiveToken.toString("hex"),A="0x"+r.nonce.toString("hex"),g=1,c="0x"+r.chainBridge.toString("hex"),l=Vn.utils.encodePacked({t:"uint256",v:i},{t:"bytes32",v:a},{t:"uint256",v:o},{t:"bytes32",v:d},{t:"uint256",v:A},{t:"uint8",v:g});if(!l)throw new I("message cannot be undefined");let u=Vn.utils.keccak256(Buffer.from(l.replace("0x",""),"hex")),m=Buffer.from(u.replace("0x",""),"hex");m[0]=o,m[1]=s;let p=Vn.utils.encodePacked({t:"bytes32",v:"0x"+m.toString("hex")},{t:"bytes32",v:c});if(!p)throw new bt("messageWithSigner cannot be undefined");let b=Vn.utils.keccak256(Buffer.from(p.replace("0x",""),"hex")),W=Buffer.from(b.replace("0x",""),"hex");return W[0]=m[0],W[1]=m[1],W}import{ComputeBudgetInstruction as Ka,ComputeBudgetProgram as Sn,Connection as Ua,TransactionMessage as Tr}from"@solana/web3.js";import{Big as wr}from"big.js";import{AddressLookupTableAccount as Qa}from"@solana/web3.js";async function ct(r,i){return await Promise.all(r.message.addressTableLookups.map(async a=>new Qa({key:a.accountKey,state:Qa.deserialize(await i.getAccountInfo(a.accountKey).then(o=>{if(!o)throw new I("Cannot get AccountInfo");return o.data}))})))}var Ji="AUTO";async function Wt(r,i,a){let o=new Ua(a,"confirmed"),s=(await o.simulateTransaction(r)).value.unitsConsumed;await Ea(r.instructions,s,i,o)}async function Da(r,i,a){let o=new Ua(a,"confirmed"),s=await ct(r,o),d=Tr.decompile(r.message,{addressLookupTableAccounts:s});if(r.serialize().length>1232)throw new Yn;await Ea(d.instructions,769230,i,o),r.message=d.compileToV0Message(s)}async function Ea(r,i,a,o){if(i>0){let s=Xr(i,r);if(a?.solana){let d=a.solana;if(d===Ji)await ki(r,o);else if("pricePerUnitInMicroLamports"in d)await ki(r,o,d.pricePerUnitInMicroLamports);else{let A=wr(d.extraFeeInLamports).div(s).mul(xt(6)).toFixed(0);await ki(r,o,A)}}}}function Xr(r,i){let a=i.findIndex(d=>d.programId.equals(Sn.programId)&&Ka.decodeInstructionType(d)==="SetComputeUnitLimit"),o=Number((r*1.3).toFixed(0)),s=Sn.setComputeUnitLimit({units:o});return a>=0?i[a]=s:i.push(s),o.toString()}async function ki(r,i,a){let o=r.findIndex(A=>A.programId.equals(Sn.programId)&&Ka.decodeInstructionType(A)==="SetComputeUnitPrice"),s=BigInt(a||await Vr(i)),d=Sn.setComputeUnitPrice({microLamports:s});return o>=0?r[o]=d:r.push(d),s.toString()}async function Vr(r){let i=await r.getRecentPrioritizationFees(),a=0;for(let o of i)a+=o.prioritizationFee;return(a/i.length).toFixed(0)}import{NATIVE_MINT as Sr}from"@solana/spl-token";import{Connection as Mr,TransactionMessage as _a,VersionedTransaction as Hr}from"@solana/web3.js";import $a,{AxiosError as qa}from"axios";var Mn=class{connection;jupiterUrl;apiKeyHeader;maxAccounts;constructor(i,a){this.connection=new Mr(i),this.jupiterUrl=a.jupiterUrl.replace(/\/$/,""),this.apiKeyHeader=a.jupiterApiKeyHeader,this.maxAccounts=a.jupiterMaxAccounts}async getJupiterSwapTx(i,a,o,s){let d;try{let m=s?"ExactOut":"ExactIn",p=`${this.jupiterUrl}/quote?inputMint=${a}&outputMint=${Sr.toString()}&amount=${o}&swapMode=${m}&slippageBps=100&onlyDirectRoutes=true`;this.maxAccounts&&(p+=`&maxAccounts=${this.maxAccounts}`),d=await $a.get(p,{headers:this.apiKeyHeader?{"x-api-key":this.apiKeyHeader}:void 0})}catch(m){throw m instanceof qa&&m.response&&m.response.data&&m.response.data.error?new ie(m.response.data.error):new ie("Cannot get route")}let A;if(s&&d?.data?.inAmount)A=d.data.inAmount;else if(s)throw new ie("Cannot get inAmount");let g;try{g=await $a.post(`${this.jupiterUrl}/swap`,{quoteResponse:d.data,userPublicKey:i,wrapAndUnwrapSol:!0},{headers:this.apiKeyHeader?{"x-api-key":this.apiKeyHeader}:void 0})}catch(m){throw m instanceof qa&&m.response&&m.response.data&&m.response.data.error?new ie(m.response.data.error):new ie("Cannot get swap transaction")}let c;if(g?.data?.swapTransaction)c=g.data.swapTransaction;else throw new ie("Cannot get swap transaction");let l=Buffer.from(c,"base64"),u=Hr.deserialize(l);return s?{tx:u,amountIn:A}:{tx:u}}async amendJupiterWithSdkTx(i,a){try{let o=await ct(i,this.connection),s=await ct(a,this.connection),d=_a.decompile(i.message,{addressLookupTableAccounts:o}),A=_a.decompile(a.message,{addressLookupTableAccounts:s});if(A.instructions.shift(),d.instructions.push(...A.instructions),o.push(...s),i.message=d.compileToV0Message(o),a.message.header.numRequiredSignatures===2&&i.signatures.length===1){let g=a.signatures[0];if(!g)throw new I("Signature is undefined");i.signatures.push(g)}return i}catch(o){throw o instanceof Error&&o.message?new ie(`Some error occurred during creation final swap and bridge transaction. ${o.message}`):new ie("Some error occurred during creation final swap and bridge transaction")}}};var xi=1e6,to=1.1,Hn=class extends Ae{constructor(a,o,s){super();this.solanaRpcUrl=a;this.params=o;this.api=s;this.jupiterService=new Mn(a,o.jupiterParams)}chainType="SOLANA";jupiterService;async buildRawTransactionSwap(a){let o=We(this.chainType,a);return await this.buildSwapTransaction(o,a.sourceToken.poolAddress,a.destinationToken.poolAddress,a.txFeeParams)}async buildSwapTransaction(a,o,s,d){let{fromAccountAddress:A,amount:g,contractAddress:c,fromTokenAddress:l,toTokenAddress:u,toAccountAddress:m,minimumReceiveAmount:p}=a,b=A,W=c,y=l,Z=u,v=s,Y=m,B=new Q(b),w=et(this.solanaRpcUrl,B.toString()),O=new zi(_t,W,w),P=await vt(O.programId),pe=await qe(O.programId),_=new Q(y),Me=await Yt(_,O.programId),He=new Q(o),Oe=await we(B,_),Ge=new Q(Y),ue=new Q(Z),ve=await Yt(ue,O.programId),Fe=new Q(v),Ce=await we(Ge,ue),Le=[tt.ComputeBudgetProgram.setComputeUnitLimit({units:xi})];try{await Rt(Ce,w)}catch{let Uo=await Lr.associatedToken(w).methods.create().accounts({mint:ue,owner:Ge,associatedAccount:Ce}).instruction();Le.push(Uo)}let Pe=await O.methods.swap(new Bt(g),new Bt(p||0)).accounts({payer:B,config:pe,bridgeAuthority:P,user:B,sendBridgeToken:Me,sendMint:_,sendPool:He,sendUserToken:Oe,receiveBridgeToken:ve,receiveMint:ue,receivePool:Fe,receiveUserToken:Ce}).preInstructions(Le).transaction(),fe=w.connection;return Pe.recentBlockhash=(await fe.getLatestBlockhash()).blockhash,Pe.feePayer=B,await Wt(Pe,d,this.solanaRpcUrl),await this.convertToVersionedTransaction(Pe,fe)}async buildRawTransactionSend(a){let o=await he(this.chainType,a,this.api),s=this.addPoolAddress(a,o),d=s.gasFeePaymentMethod=="stablecoin",A;if(d)try{let{tx:l,solTxSendUpdatedParams:u}=await this.processJup(s,a,!0);A=l,s={...s,...u}}catch{try{let{tx:u,solTxSendUpdatedParams:m}=await this.processJup(s,a,!1);A=u,s={...s,...m}}catch(u){throw u instanceof K?u:u instanceof Error&&u.message?new ie(`Some error occurred during creation Jupiter swap transaction. ${u.message}`):new ie("Some error occurred during creation Jupiter swap transaction")}}let g,c;switch(o.messenger){case 1:{let l=await this.prepareSwapAndBridgeData(s);g=await this.buildSwapAndBridgeAllbridgeTransaction(l);break}case 2:{let l=await this.prepareSwapAndBridgeData(s),{transaction:u,messageAccount:m}=await this.buildSwapAndBridgeWormholeTransaction(l);g=u,c=m;break}case 3:case 4:{let l=await this.prepareSwapAndBridgeCctpData(s),{transaction:u,messageSentEventDataKeypair:m}=await this.buildSwapAndBridgeCctpTransaction(a.destinationToken.chainSymbol,l);g=u,c=m;break}case 5:throw new de("Messenger OFT is not supported yet.")}if(d){if(!A)throw new ie("Swap tx is absent");g=await this.jupiterService.amendJupiterWithSdkTx(A,g)}return await Da(g,a.txFeeParams,this.solanaRpcUrl),c&&g.sign([c]),g}async processJup(a,o,s){let{fee:d,extraGas:A,gasFeePaymentMethod:g}=await this.convertStableCoinFeeAndExtraGasToNativeCurrency(o.sourceToken,a),c=s?Xe(d):Xe(a.fee);A&&(c=c.plus(A)),s||(c=c.mul(to));let{tx:l,amountIn:u}=await this.jupiterService.getJupiterSwapTx(o.fromAccountAddress,o.sourceToken.tokenAddress,c.toFixed(0),s),m;if(s){if(!u)throw new ie("Cannot get inAmount");m=Xe(a.amount).minus(Xe(u).mul(to)).toFixed(0)}else m=Xe(a.amount).minus(c).toFixed(0);if(Xe(m).lte(0))throw new It(`Amount not enough to pay fee, ${F(Xe(m).minus(1).neg(),o.sourceToken.decimals).toFixed()} stables is missing`);return{tx:l,solTxSendUpdatedParams:{amount:m,fee:d,extraGas:A,gasFeePaymentMethod:g}}}addPoolAddress(a,o){return{...o,poolAddress:a.sourceToken.poolAddress}}async convertStableCoinFeeAndExtraGasToNativeCurrency(a,o){if(o.gasFeePaymentMethod=="stablecoin"){let s=(await this.api.getReceiveTransactionCost({sourceChainId:o.fromChainId,destinationChainId:o.toChainId,messenger:o.messenger,sourceToken:a.tokenAddress})).sourceNativeTokenPrice,d=Xe(o.fee).div(s).mul(Xe(10).pow(X.getChainDecimalsByType("SOLANA")-a.decimals)).toFixed(0),A;return o.extraGas&&(A=Xe(o.extraGas).div(s).mul(Xe(10).pow(X.getChainDecimalsByType("SOLANA")-a.decimals)).toFixed(0)),{fee:d,extraGas:A,gasFeePaymentMethod:"native"}}return{fee:o.fee,extraGas:o.extraGas,gasFeePaymentMethod:"native"}}getExtraGasInstruction(a,o,s){return tt.SystemProgram.transfer({fromPubkey:o,toPubkey:s,lamports:+a})}async prepareSwapAndBridgeData(a){let{amount:o,contractAddress:s,fromChainId:d,fromAccountAddress:A,fromTokenAddress:g,toChainId:c,toAccountAddress:l,toTokenAddress:u,poolAddress:m,extraGas:p}=a,b=g,W=A,y=c,Z=u,v=l,Y=s,B=d,w=et(this.solanaRpcUrl,W),O=new zi(_t,Y,w),P=Array.from(ht()),pe=new Q(m),_=await xa(o,O,pe),Me=await Va(P,O.programId),He=await vt(O.programId),Oe=await we(new Q(W),new Q(b)),Ge=await Yt(new Q(b),O.programId),ue=await Li(y,O.programId),ve=await Ma(y,Buffer.from(Z),O.programId),Fe=await qe(O.programId),Ce=await O.account.config.fetch(Fe),Le=await Ut(y,Ce.gasOracleProgramId),Pe=await Ut(B,Ce.gasOracleProgramId),fe=Oa({amount:_,recipient:Buffer.from(v),nonce:Buffer.from(P),receiveToken:Buffer.from(Z),destinationChainId:y,sourceChainId:B,chainBridge:(await vt(O.programId)).toBuffer()}),J={};return J.bridge=O,J.amount=new Bt(o),J.vusdAmount=new Bt(_),J.nonce=P,J.recipient=Array.from(v),J.receiveToken=Array.from(Z),J.poolAccount=pe,J.lockAccount=Me,J.bridgeAuthority=He,J.userToken=Oe,J.bridgeTokenAccount=Ge,J.chainBridgeAccount=ue,J.otherBridgeTokenAccount=ve,J.userAccount=new Q(W),J.destinationChainId=y,J.mint=new Q(b),J.config=Fe,J.configAccountInfo=Ce,J.gasPrice=Le,J.thisGasPrice=Pe,J.message=fe,p&&(J.extraGasInstruction=this.getExtraGasInstruction(p,J.userAccount,Fe)),J}async buildSwapAndBridgeAllbridgeTransaction(a){let{bridge:o,vusdAmount:s,nonce:d,recipient:A,receiveToken:g,poolAccount:c,lockAccount:l,bridgeAuthority:u,userToken:m,bridgeTokenAccount:p,chainBridgeAccount:b,otherBridgeTokenAccount:W,userAccount:y,destinationChainId:Z,mint:v,config:Y,configAccountInfo:B,gasPrice:w,thisGasPrice:O,message:P,extraGasInstruction:pe}=a,_=B.allbridgeMessengerProgramId,Me=await Pi(Z,_),He=await qe(_),Oe=await Ha(P,_),Ge=[];pe&&Ge.push(pe);let ue=await o.methods.swapAndBridge({vusdAmount:s,nonce:d,destinationChainId:Z,recipient:A,receiveToken:g}).accounts({mint:v,user:y,config:Y,lock:l,pool:c,gasPrice:w,thisGasPrice:O,bridgeAuthority:u,userToken:m,bridgeToken:p,chainBridge:b,messenger:_,messengerGasUsage:Me,messengerConfig:He,sentMessageAccount:Oe,otherBridgeToken:W}).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:xi})]).postInstructions(Ge).transaction(),ve=et(this.solanaRpcUrl,y.toString()).connection;return ue.recentBlockhash=(await ve.getLatestBlockhash()).blockhash,ue.feePayer=y,await this.convertToVersionedTransaction(ue,ve)}async convertToVersionedTransaction(a,o){let s=await o.getAddressLookupTable(new Q(this.params.solanaLookUpTable)).then(A=>A.value);if(!s)throw new I("Cannot find allbridgeLookupTableAccount");let d=new tt.TransactionMessage({payerKey:a.feePayer,recentBlockhash:a.recentBlockhash,instructions:a.instructions}).compileToV0Message([s]);return new tt.VersionedTransaction(d)}async buildSwapAndBridgeWormholeTransaction(a){let{bridge:o,vusdAmount:s,nonce:d,recipient:A,receiveToken:g,poolAccount:c,lockAccount:l,bridgeAuthority:u,userToken:m,bridgeTokenAccount:p,chainBridgeAccount:b,otherBridgeTokenAccount:W,userAccount:y,destinationChainId:Z,mint:v,config:Y,configAccountInfo:B,gasPrice:w,thisGasPrice:O,message:P,extraGasInstruction:pe}=a,_=this.params.wormholeMessengerProgramId,[Me]=Q.findProgramAddressSync([Buffer.from("Bridge")],new Q(_)),[He]=Q.findProgramAddressSync([Buffer.from("fee_collector")],new Q(_)),[Oe]=Q.findProgramAddressSync([Buffer.from("Sequence"),u.toBuffer()],new Q(_)),Ge=await Pi(Z,B.wormholeMessengerProgramId),ue=await qe(B.wormholeMessengerProgramId),ve=eo.generate(),Fe=et(this.solanaRpcUrl,y.toString()),Ce=await Fe.connection.getAccountInfo(Me);if(Ce==null)throw new I("Cannot fetch wormhole bridge account info");let Le=new Bt(Ce.data.slice(16,24),"le").toString(),Pe=Pr.transfer({fromPubkey:y,toPubkey:He,lamports:+Le}),fe=[];pe&&fe.push(pe);let J={mint:v,user:y,config:Y,lock:l,pool:c,gasPrice:w,thisGasPrice:O,bridgeAuthority:u,userToken:m,bridgeToken:p,chainBridge:b,otherBridgeToken:W,messengerGasUsage:Ge,wormholeProgram:_,bridge:Me,message:ve.publicKey,wormholeMessenger:B.wormholeMessengerProgramId,sequence:Oe,feeCollector:He,wormholeMessengerConfig:ue,clock:tt.SYSVAR_CLOCK_PUBKEY},pn=await o.methods.swapAndBridgeWormhole({vusdAmount:s,nonce:d,destinationChainId:Z,recipient:A,receiveToken:g}).accounts(J).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:xi}),Pe]).postInstructions(fe).signers([ve]).transaction();return pn.recentBlockhash=(await Fe.connection.getLatestBlockhash()).blockhash,pn.feePayer=y,{transaction:await this.convertToVersionedTransaction(pn,Fe.connection),messageAccount:ve}}async prepareSwapAndBridgeCctpData(a){let{contractAddress:o,amount:s,fromAccountAddress:d,fromTokenAddress:A,toChainId:g,toAccountAddress:c,toTokenAddress:l,extraGas:u}=a,m=o;if(!m)throw new se("Such route does not support CCTP protocol");let p=4,b=d,W=l,y=c,Z=et(this.solanaRpcUrl,b),v=new zi(za,m,Z),Y=new Q(A),B=await La(Y,v.programId),w=new Q(b),O=await v.account.cctpBridge.fetch(B),P={};return P.cctpBridge=v,P.cctpBridgeAccount=B,P.cctpAddressAccount=new Q(m),P.amount=new Bt(s),P.recipient=Array.from(y),P.receiveToken=Array.from(W),P.userToken=await we(w,Y),P.bridgeAuthority=await Sa(B,v.programId),P.bridgeTokenAccount=await Pa(Y,v.programId),P.chainBridgeAccount=await Li(g,v.programId),P.userAccount=w,P.destinationChainId=g,P.mint=Y,P.gasPrice=await Ut(g,O.gasOracleProgramId),P.thisGasPrice=await Ut(p,O.gasOracleProgramId),P.provider=Z,u&&(P.extraGasInstruction=this.getExtraGasInstruction(u,P.userAccount,B)),P}async buildSwapAndBridgeCctpTransaction(a,o){let{cctpBridge:s,cctpBridgeAccount:d,amount:A,recipient:g,receiveToken:c,bridgeAuthority:l,userToken:u,bridgeTokenAccount:m,chainBridgeAccount:p,userAccount:b,destinationChainId:W,mint:y,gasPrice:Z,thisGasPrice:v,extraGasInstruction:Y,provider:B}=o,w=this.params.cctpParams.cctpDomains[a],O=this.params.cctpParams.cctpTransmitterProgramId,P=this.params.cctpParams.cctpTokenMessengerMinter;if(w==null||!O||!P)throw new I("CCTP is not configured");let pe=new Q(O),_=new Q(P),{messageTransmitterAccount:Me,tokenMessenger:He,tokenMessengerEventAuthority:Oe,tokenMinter:Ge,localToken:ue,remoteTokenMessengerKey:ve,authorityPda:Fe}=Ja(w,y,pe,_),Ce=[];Y&&Ce.push(Y);let Le=eo.generate(),Pe=ja(s.programId,Le.publicKey),fe=await s.methods.bridge({amount:A,destinationChainId:W,recipient:g,receiveToken:c}).accounts({mint:y,user:b,cctpBridge:d,messageSentEventData:Le.publicKey,lock:Pe,cctpMessenger:_,messageTransmitterProgram:pe,messageTransmitterAccount:Me,tokenMessenger:He,tokenMinter:Ge,localToken:ue,remoteTokenMessengerKey:ve,authorityPda:Fe,eventAuthority:Oe,bridgeToken:m,gasPrice:Z,thisGasPrice:v,chainBridge:p,userToken:u,bridgeAuthority:l}).preInstructions([tt.ComputeBudgetProgram.setComputeUnitLimit({units:2e6})]).postInstructions(Ce).transaction(),J=B.connection;return fe.recentBlockhash=(await J.getLatestBlockhash()).blockhash,fe.feePayer=b,{transaction:await this.convertToVersionedTransaction(fe,J),messageSentEventDataKeypair:Le}}send(a){throw new k}};import{Address as Oi,contract as BW}from"@stellar/stellar-sdk";import{Big as kr}from"big.js";import{contract as n}from"@stellar/stellar-sdk";var jr=n.Spec,Jr=n.Client;var $t=class extends Jr{constructor(a){super(new jr(["AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABAAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAApnYXNfb3JhY2xlAAAAAAATAAAAAAAAAAxuYXRpdmVfdG9rZW4AAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAPc3dhcF9hbmRfYnJpZGdlAAAAAAkAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACXJlY2lwaWVudAAAAAAAA+4AAAAgAAAAAAAAABRkZXN0aW5hdGlvbl9jaGFpbl9pZAAAAAQAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAFbm9uY2UAAAAAAAAMAAAAAAAAAApnYXNfYW1vdW50AAAAAAAKAAAAAAAAABBmZWVfdG9rZW5fYW1vdW50AAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOcmVjZWl2ZV90b2tlbnMAAAAAAAgAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAA9zb3VyY2VfY2hhaW5faWQAAAAABAAAAAAAAAANcmVjZWl2ZV90b2tlbgAAAAAAA+4AAAAgAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAAAAAAJZXh0cmFfZ2FzAAAAAAAD6AAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAEc3dhcAAAAAYAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAA+4AAAAgAAAAAAAAAA1yZWNlaXZlX3Rva2VuAAAAAAAD7gAAACAAAAAAAAAACXJlY2lwaWVudAAAAAAAABMAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAJc3RvcF9zd2FwAAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAKc3RhcnRfc3dhcAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOc2V0X2dhc19vcmFjbGUAAAAAAAEAAAAAAAAAC25ld19hZGRyZXNzAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOc2V0X3JlYmFsYW5jZXIAAAAAAAEAAAAAAAAACnJlYmFsYW5jZXIAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc2V0X21lc3NlbmdlcgAAAAAAAAEAAAAAAAAACW1lc3NlbmdlcgAAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc2V0X2dhc191c2FnZQAAAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAJZ2FzX3VzYWdlAAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAPcmVnaXN0ZXJfYnJpZGdlAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAOYnJpZGdlX2FkZHJlc3MAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAQYWRkX2JyaWRnZV90b2tlbgAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAANdG9rZW5fYWRkcmVzcwAAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAATcmVtb3ZlX2JyaWRnZV90b2tlbgAAAAACAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAIYWRkX3Bvb2wAAAACAAAAAAAAAARwb29sAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAATd2l0aGRyYXdfZ2FzX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAfd2l0aGRyYXdfYnJpZGdpbmdfZmVlX2luX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAVaGFzX3Byb2Nlc3NlZF9tZXNzYWdlAAAAAAAAAQAAAAAAAAAHbWVzc2FnZQAAAAPuAAAAIAAAAAEAAAPpAAAAAQAAAAM=","AAAAAAAAAAAAAAAUaGFzX3JlY2VpdmVkX21lc3NhZ2UAAAABAAAAAAAAAAdtZXNzYWdlAAAAA+4AAAAgAAAAAQAAA+kAAAABAAAAAw==","AAAAAAAAAAAAAAAQZ2V0X3Bvb2xfYWRkcmVzcwAAAAEAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAKZ2V0X2NvbmZpZwAAAAAAAAAAAAEAAAPpAAAH0AAAAAZCcmlkZ2UAAAAAAAM=","AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==","AAAAAAAAAAAAAAAUZ2V0X3RyYW5zYWN0aW9uX2Nvc3QAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAAAoAAAAD","AAAAAAAAAAAAAAANZ2V0X2dhc191c2FnZQAAAAAAAAEAAAAAAAAACGNoYWluX2lkAAAABAAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAOZ2V0X2dhc19vcmFjbGUAAAAAAAAAAAABAAAD6QAAABMAAAAD","AAAAAAAAAAAAAAASZ2V0X2Fub3RoZXJfYnJpZGdlAAAAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAB9AAAAANQW5vdGhlckJyaWRnZQAAAAAAAAM=","AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAQAAAAAAAAAAAAAAB1N3YXBwZWQAAAAABgAAAAAAAAAOcmVjZWl2ZV9hbW91bnQAAAAAAAoAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAAEwAAAAAAAAALc2VuZF9hbW91bnQAAAAACgAAAAAAAAAKc2VuZF90b2tlbgAAAAAD7gAAACAAAAAAAAAABnNlbmRlcgAAAAAAEw==","AAAAAQAAAAAAAAAAAAAAClRva2Vuc1NlbnQAAAAAAAUAAAAAAAAABmFtb3VudAAAAAAACgAAAAAAAAAUZGVzdGluYXRpb25fY2hhaW5faWQAAAAEAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=","AAAAAQAAAAAAAAAAAAAADlRva2Vuc1JlY2VpdmVkAAAAAAAEAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAB21lc3NhZ2UAAAAD7gAAACAAAAAAAAAABW5vbmNlAAAAAAAADAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=","AAAAAQAAAAAAAAAAAAAAClJlY2VpdmVGZWUAAAAAAAMAAAAAAAAAF2JyaWRnZV90cmFuc2FjdGlvbl9jb3N0AAAAAAoAAAAAAAAACWV4dHJhX2dhcwAAAAAAAAoAAAAAAAAAGG1lc3NhZ2VfdHJhbnNhY3Rpb25fY29zdAAAAAo=","AAAAAQAAAAAAAAAAAAAAFUJyaWRnaW5nRmVlRnJvbVRva2VucwAAAAAAAAIAAAAAAAAAEGZlZV90b2tlbl9hbW91bnQAAAAKAAAAAAAAAANnYXMAAAAACg==","AAAAAQAAAAAAAAAAAAAADUFub3RoZXJCcmlkZ2UAAAAAAAACAAAAAAAAAAdhZGRyZXNzAAAAA+4AAAAgAAAAAAAAAAZ0b2tlbnMAAAAAA+wAAAPuAAAAIAAAAAE=","AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAABgAAAGBwcmVjb21wdXRlZCB2YWx1ZXMgb2YgdGhlIHNjYWxpbmcgZmFjdG9yIHJlcXVpcmVkIGZvciBwYXlpbmcgdGhlIGJyaWRnaW5nIGZlZSB3aXRoIHN0YWJsZSB0b2tlbnMAAAAeYnJpZGdpbmdfZmVlX2NvbnZlcnNpb25fZmFjdG9yAAAAAAPsAAAAEwAAAAoAAAAAAAAACGNhbl9zd2FwAAAAAQAAAGxwcmVjb21wdXRlZCB2YWx1ZXMgdG8gZGl2aWRlIGJ5IHRvIGNoYW5nZSB0aGUgcHJlY2lzaW9uIGZyb20gdGhlIEdhcyBPcmFjbGUgcHJlY2lzaW9uIHRvIHRoZSB0b2tlbiBwcmVjaXNpb24AAAAWZnJvbV9nYXNfb3JhY2xlX2ZhY3RvcgAAAAAD7AAAABMAAAAKAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAAVwb29scwAAAAAAA+wAAAPuAAAAIAAAABMAAAAAAAAACnJlYmFsYW5jZXIAAAAAABM=","AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAwAAAAEAAAAAAAAAC090aGVyQnJpZGdlAAAAAAEAAAAEAAAAAQAAAAAAAAALU2VudE1lc3NhZ2UAAAAAAQAAA+4AAAAgAAAAAQAAAAAAAAAPUmVjZWl2ZWRNZXNzYWdlAAAAAAEAAAPuAAAAIA==","AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==","AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT","AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ"]),a);this.options=a}fromJSON={initialize:this.txFromJSON,swap_and_bridge:this.txFromJSON,receive_tokens:this.txFromJSON,swap:this.txFromJSON,stop_swap:this.txFromJSON,start_swap:this.txFromJSON,set_gas_oracle:this.txFromJSON,set_stop_authority:this.txFromJSON,set_rebalancer:this.txFromJSON,set_messenger:this.txFromJSON,set_gas_usage:this.txFromJSON,register_bridge:this.txFromJSON,add_bridge_token:this.txFromJSON,remove_bridge_token:this.txFromJSON,add_pool:this.txFromJSON,withdraw_gas_tokens:this.txFromJSON,withdraw_bridging_fee_in_tokens:this.txFromJSON,has_processed_message:this.txFromJSON,has_received_message:this.txFromJSON,get_pool_address:this.txFromJSON,get_config:this.txFromJSON,get_stop_authority:this.txFromJSON,get_transaction_cost:this.txFromJSON,get_gas_usage:this.txFromJSON,get_admin:this.txFromJSON,get_gas_oracle:this.txFromJSON,get_another_bridge:this.txFromJSON,set_admin:this.txFromJSON,upgrade:this.txFromJSON}};var Ln=class extends Ae{constructor(a,o,s){super();this.nodeRpcUrlsConfig=a;this.params=o;this.api=s}chainType="SRB";async buildRawTransactionSend(a){let o=await he(this.chainType,a,this.api);return await this.buildRawTransactionSendFromParams(o)}async buildRawTransactionSendFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toChainId:g,toAccountAddress:c,toTokenAddress:l,fee:u,gasFeePaymentMethod:m,extraGas:p}=a,b=u;p&&(b=kr(b).plus(p).toFixed());let W=this.getContract($t,s,d),y;return m==="stablecoin"?y=await W.swap_and_bridge({sender:d,token:Oi.contract(Buffer.from(A)).toString(),amount:BigInt(o),recipient:Buffer.from(c),destination_chain_id:+g,receive_token:Buffer.from(l),nonce:ke(),gas_amount:BigInt(0),fee_token_amount:BigInt(b)}):y=await W.swap_and_bridge({sender:d,token:Oi.contract(Buffer.from(A)).toString(),amount:BigInt(o),recipient:Buffer.from(c),destination_chain_id:+g,receive_token:Buffer.from(l),nonce:ke(),gas_amount:BigInt(b),fee_token_amount:BigInt(0)}),y.toXDR()}async buildRawTransactionSwap(a){let o=We(this.chainType,a);return await this.buildRawTransactionSwapFromParams(o)}async buildRawTransactionSwapFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toAccountAddress:g,toTokenAddress:c,minimumReceiveAmount:l}=a;return(await this.getContract($t,s,d).swap({sender:d,amount:BigInt(o),token:Oi.contract(Buffer.from(A)).toBuffer(),receive_token:Buffer.from(c),recipient:g,receive_amount_min:BigInt(l)})).toXDR()}send(a){throw new k}getContract(a,o,s){let d={publicKey:s,contractId:o,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new a(d)}};import{SuiClient as ts}from"@mysten/sui/client";import{coinWithBalance as D,Transaction as ia}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as Io}from"@mysten/sui/utils";import{Big as aa}from"big.js";var oa=Ne(nt());var De=Ne(nt());ne();function ao(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::swap`,typeArguments:i,arguments:[N(r,a.bridge),N(r,a.coin),Be(r,a.receiveAmountMin,"u64")]})}function oo(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::deposit`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.userDeposit),N(r,a.coin)]})}function ro(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::withdraw`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.userDeposit),Be(r,a.amountLp,"u64")]})}function so(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::claim_reward`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.userDeposit)]})}function Ao(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::pool`,typeArguments:[i],arguments:[N(r,a)]})}function Ki(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::swap_and_bridge_wormhole`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.messenger),N(r,a.wormholeState),N(r,a.theClock),N(r,a.gasOracle),N(r,a.amount),N(r,a.recipient),Be(r,a.destinationChainId,"u8"),N(r,a.receiveToken),Be(r,a.nonce,"u256"),N(r,a.feeSuiCoin),N(r,a.feeTokenCoin)]})}function go(r,i){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::new_user_deposit`,typeArguments:[i],arguments:[]})}function Ui(r,i,a){return r.moveCall({target:`${De.PUBLISHED_AT}::bridge_interface::swap_and_bridge`,typeArguments:[i],arguments:[N(r,a.bridge),N(r,a.messenger),N(r,a.gasOracle),N(r,a.amount),N(r,a.recipient),Be(r,a.destinationChainId,"u8"),N(r,a.receiveToken),Be(r,a.nonce,"u256"),N(r,a.feeSuiCoin),N(r,a.feeTokenCoin)]})}var bo=Ne(Ei());var lo=Ne(Ei());ne();function _i(r,i,a){return r.moveCall({target:`${lo.PUBLISHED_AT}::cctp_bridge_interface::bridge`,typeArguments:[i],arguments:[N(r,a.cctpBridge),N(r,a.gasOracle),N(r,a.tokenMessengerMinterState),N(r,a.messageTransmitterState),N(r,a.treasury),N(r,a.denyList),N(r,a.amount),N(r,a.feeSuiCoin),N(r,a.feeTokenCoin),Be(r,a.destinationChainId,"u8"),N(r,a.recipient),N(r,a.recipientWalletAddress)]})}var yo=Ne(qi());var Co=Ne(qi());ne();import{bcs as it}from"@mysten/sui/bcs";import{fromHEX as Dr,toHEX as Er}from"@mysten/sui/utils";import{bcs as Ur}from"@mysten/sui/bcs";ne();var ea=class r{__VectorClass=!0;static $typeName="vector";static $numTypeParams=1;static $isPhantom=[!1];$typeName="vector";$fullTypeName;$typeArgs;$isPhantom=[!1];elements;constructor(i,a){this.$fullTypeName=j(this.$typeName,...i),this.$typeArgs=i,this.elements=a}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs(qt(i)),fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),new:a=>new r([T(i)],a),kind:"VectorClassReified"}}static get r(){return r.reified}static get bcs(){return Ur.vector}static fromFields(i,a){return r.reified(i).new(a.map(o=>L(i,o)))}static fromFieldsWithTypes(i,a){return r.reified(i).new(a.map(o=>S(i,o)))}static fromBcs(i,a){return r.fromFields(i,r.bcs(qt(i)).parse(a))}toJSONField(){return this.elements.map(i=>lt(this.$typeArgs[0],i))}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,elements:this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new(a.map(o=>M(i,o)))}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a vector json object");return r.fromJSONField(i,a.elements)}};function Zt(r){return ea.r(r)}function U(r){return typeof r=="string"?{phantomType:r,kind:"PhantomReified"}:{phantomType:r.fullTypeName,kind:"PhantomReified"}}var _r=it.bytes(32).transform({input:r=>Dr(r),output:r=>Er(r)});function qt(r){switch(r){case"bool":return it.bool();case"u8":return it.u8();case"u16":return it.u16();case"u32":return it.u32();case"u64":return it.u64();case"u128":return it.u128();case"u256":return it.u256();case"address":return _r;default:return r.bcs}}function T(r){switch(r){case"u8":case"u16":case"u32":case"u64":case"u128":case"u256":case"bool":case"address":return r}switch(r.kind){case"PhantomReified":return r.phantomType;case"StructClassReified":return r.fullTypeName;case"VectorClassReified":return r.fullTypeName}throw new Error("unreachable")}function L(r,i){switch(r){case"bool":case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return BigInt(i);case"address":return`0x${i}`}if(r.kind==="VectorClassReified")return r.fromFields(i).elements;switch(r.typeName){case"0x1::string::String":case"0x1::ascii::String":return new TextDecoder().decode(Uint8Array.from(i.bytes)).toString();case"0x2::url::Url":return new TextDecoder().decode(Uint8Array.from(i.url.bytes)).toString();case"0x2::object::ID":return`0x${i.bytes}`;case"0x2::object::UID":return`0x${i.id.bytes}`;case"0x1::option::Option":return i.vec.length===0?null:r.fromFields(i).vec[0];default:return r.fromFields(i)}}function S(r,i){switch(r){case"bool":case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return BigInt(i);case"address":return i}if(r.kind==="VectorClassReified")return r.fromFieldsWithTypes(i).elements;switch(r.typeName){case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":return i;case"0x2::object::UID":return i.id;case"0x2::balance::Balance":return r.fromFields({value:BigInt(i)});case"0x1::option::Option":return i===null?null:S(r.reifiedTypeArgs[0],i);default:return r.fromFieldsWithTypes(i)}}function Ve(r,i,a){if(a.length!==i.length)throw new Error(`provided item has mismatching number of type argments ${r} (expected ${a.length}, got ${i.length}))`);for(let o=0;o<i.length;o++)if(G(i[o])!==G(T(a[o])))throw new Error(`provided item has mismatching type argments ${r} (expected ${T(a[o])}, got ${i[o]}))`)}function ze(r,i){let{typeArgs:a}=oe(r.type);Ve(r.type,a,i)}function lt(r,i){let{typeName:a,typeArgs:o}=oe(r);switch(a){case"bool":return i;case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return i.toString();case"address":case"signer":return i;case"vector":return i.map(s=>lt(o[0],s));case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":case"0x2::object::UID":return i;case"0x1::option::Option":return i===null?null:lt(o[0],i);default:return i.toJSONField()}}function M(r,i){switch(r){case"bool":case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return BigInt(i);case"address":return i}if(r.kind==="VectorClassReified")return r.fromJSONField(i).elements;switch(r.typeName){case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":case"0x2::object::UID":return i;case"0x1::option::Option":return i===null?null:M(r.reifiedTypeArgs[0],i);default:return r.fromJSONField(i)}}ne();var Pn="0x1";import{bcs as tu}from"@mysten/sui/bcs";import{fromB64 as iu}from"@mysten/sui/utils";ne();import{bcs as ta}from"@mysten/sui/bcs";import{fromB64 as $r}from"@mysten/sui/utils";function jn(r){return r=G(r),r===`${Pn}::string::String`}var Jn=class r{__StructClass=!0;static get $typeName(){return`${Pn}::string::String`}static $numTypeParams=0;static $isPhantom=[];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;bytes;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.bytes=a.bytes}static reified(){return{typeName:r.$typeName,fullTypeName:j(r.$typeName),typeArgs:[],isPhantom:r.$isPhantom,reifiedTypeArgs:[],fromFields:i=>r.fromFields(i),fromFieldsWithTypes:i=>r.fromFieldsWithTypes(i),fromBcs:i=>r.fromBcs(i),bcs:r.bcs,fromJSONField:i=>r.fromJSONField(i),fromJSON:i=>r.fromJSON(i),fromSuiParsedData:i=>r.fromSuiParsedData(i),fromSuiObjectData:i=>r.fromSuiObjectData(i),fetch:async(i,a)=>r.fetch(i,a),new:i=>new r([],i),kind:"StructClassReified"}}static get r(){return r.reified()}static phantom(){return U(r.reified())}static get p(){return r.phantom()}static get bcs(){return ta.struct("String",{bytes:ta.vector(ta.u8())})}static fromFields(i){return r.reified().new({bytes:L(Zt("u8"),i.bytes)})}static fromFieldsWithTypes(i){if(!jn(i.type))throw new Error("not a String type");return r.reified().new({bytes:S(Zt("u8"),i.fields.bytes)})}static fromBcs(i){return r.fromFields(r.bcs.parse(i))}toJSONField(){return{bytes:lt("vector<u8>",this.bytes)}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i){return r.reified().new({bytes:M(Zt("u8"),i.bytes)})}static fromJSON(i){if(i.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return r.fromJSONField(i)}static fromSuiParsedData(i){if(i.dataType!=="moveObject")throw new Error("not an object");if(!jn(i.type))throw new Error(`object at ${i.fields.id} is not a String object`);return r.fromFieldsWithTypes(i)}static fromSuiObjectData(i){if(i.bcs){if(i.bcs.dataType!=="moveObject"||!jn(i.bcs.type))throw new Error("object at is not a String object");return r.fromBcs($r(i.bcs.bcsBytes))}if(i.content)return r.fromSuiParsedData(i.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a){let o=await i.getObject({id:a,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching String object at id ${a}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!jn(o.data.bcs.type))throw new Error(`object at id ${a} is not a String object`);return r.fromSuiObjectData(o.data)}};ne();ne();var at="0x2";import{bcs as na}from"@mysten/sui/bcs";import{fromB64 as po,fromHEX as qr,toHEX as es}from"@mysten/sui/utils";function kn(r){return r=G(r),r===`${at}::object::ID`}var ut=class r{__StructClass=!0;static get $typeName(){return`${at}::object::ID`}static $numTypeParams=0;static $isPhantom=[];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;bytes;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.bytes=a.bytes}static reified(){return{typeName:r.$typeName,fullTypeName:j(r.$typeName),typeArgs:[],isPhantom:r.$isPhantom,reifiedTypeArgs:[],fromFields:i=>r.fromFields(i),fromFieldsWithTypes:i=>r.fromFieldsWithTypes(i),fromBcs:i=>r.fromBcs(i),bcs:r.bcs,fromJSONField:i=>r.fromJSONField(i),fromJSON:i=>r.fromJSON(i),fromSuiParsedData:i=>r.fromSuiParsedData(i),fromSuiObjectData:i=>r.fromSuiObjectData(i),fetch:async(i,a)=>r.fetch(i,a),new:i=>new r([],i),kind:"StructClassReified"}}static get r(){return r.reified()}static phantom(){return U(r.reified())}static get p(){return r.phantom()}static get bcs(){return na.struct("ID",{bytes:na.bytes(32).transform({input:i=>qr(i),output:i=>es(i)})})}static fromFields(i){return r.reified().new({bytes:L("address",i.bytes)})}static fromFieldsWithTypes(i){if(!kn(i.type))throw new Error("not a ID type");return r.reified().new({bytes:S("address",i.fields.bytes)})}static fromBcs(i){return r.fromFields(r.bcs.parse(i))}toJSONField(){return{bytes:this.bytes}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i){return r.reified().new({bytes:M("address",i.bytes)})}static fromJSON(i){if(i.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return r.fromJSONField(i)}static fromSuiParsedData(i){if(i.dataType!=="moveObject")throw new Error("not an object");if(!kn(i.type))throw new Error(`object at ${i.fields.id} is not a ID object`);return r.fromFieldsWithTypes(i)}static fromSuiObjectData(i){if(i.bcs){if(i.bcs.dataType!=="moveObject"||!kn(i.bcs.type))throw new Error("object at is not a ID object");return r.fromBcs(po(i.bcs.bcsBytes))}if(i.content)return r.fromSuiParsedData(i.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a){let o=await i.getObject({id:a,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching ID object at id ${a}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!kn(o.data.bcs.type))throw new Error(`object at id ${a} is not a ID object`);return r.fromSuiObjectData(o.data)}};function zn(r){return r=G(r),r===`${at}::object::UID`}var Ze=class r{__StructClass=!0;static get $typeName(){return`${at}::object::UID`}static $numTypeParams=0;static $isPhantom=[];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;id;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.id=a.id}static reified(){return{typeName:r.$typeName,fullTypeName:j(r.$typeName),typeArgs:[],isPhantom:r.$isPhantom,reifiedTypeArgs:[],fromFields:i=>r.fromFields(i),fromFieldsWithTypes:i=>r.fromFieldsWithTypes(i),fromBcs:i=>r.fromBcs(i),bcs:r.bcs,fromJSONField:i=>r.fromJSONField(i),fromJSON:i=>r.fromJSON(i),fromSuiParsedData:i=>r.fromSuiParsedData(i),fromSuiObjectData:i=>r.fromSuiObjectData(i),fetch:async(i,a)=>r.fetch(i,a),new:i=>new r([],i),kind:"StructClassReified"}}static get r(){return r.reified()}static phantom(){return U(r.reified())}static get p(){return r.phantom()}static get bcs(){return na.struct("UID",{id:ut.bcs})}static fromFields(i){return r.reified().new({id:L(ut.reified(),i.id)})}static fromFieldsWithTypes(i){if(!zn(i.type))throw new Error("not a UID type");return r.reified().new({id:S(ut.reified(),i.fields.id)})}static fromBcs(i){return r.fromFields(r.bcs.parse(i))}toJSONField(){return{id:this.id}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i){return r.reified().new({id:M(ut.reified(),i.id)})}static fromJSON(i){if(i.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return r.fromJSONField(i)}static fromSuiParsedData(i){if(i.dataType!=="moveObject")throw new Error("not an object");if(!zn(i.type))throw new Error(`object at ${i.fields.id} is not a UID object`);return r.fromFieldsWithTypes(i)}static fromSuiObjectData(i){if(i.bcs){if(i.bcs.dataType!=="moveObject"||!zn(i.bcs.type))throw new Error("object at is not a UID object");return r.fromBcs(po(i.bcs.bcsBytes))}if(i.content)return r.fromSuiParsedData(i.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a){let o=await i.getObject({id:a,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching UID object at id ${a}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!zn(o.data.bcs.type))throw new Error(`object at id ${a} is not a UID object`);return r.fromSuiObjectData(o.data)}};function Se(r,i){return r.moveCall({target:`${Co.PUBLISHED_AT}::bytes32::from_hex`,arguments:[Be(r,i,`${Jn.$typeName}`)]})}async function xe(r,i,a=[]){let o=await r(i),s=a.concat(o.data);return o.hasNextPage&&o.nextCursor?xe(r,o.nextCursor,s):s}var Gt=class extends Ae{constructor(a,o){super();this.nodeRpcUrlsConfig=a;this.api=o;this.client=new ts({url:a.getNodeRpcUrl(this.chainSymbol)})}chainType="SUI";chainSymbol="SUI";client;send(){throw new I("Method send not implemented.")}async buildRawTransactionSwap(a){let o=a.sourceToken.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");(0,oa.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin);let s=We(this.chainType,a);return await this.buildRawTransactionSwapFromParams(s,o)}async buildRawTransactionSwapFromParams(a,o){let{amount:s,fromAccountAddress:d,fromTokenAddress:A,toTokenAddress:g,minimumReceiveAmount:c}=a,l=new ia;l.setSender(d);let u={bridge:o.bridgeObjectAddress,coin:D({balance:BigInt(s),type:A}),receiveAmountMin:BigInt(c)},m=ao(l,[A,g],u),p=await xe(b=>this.client.getCoins({owner:a.toAccountAddress,coinType:g,cursor:b}));return p.length===0||!p[0]?l.transferObjects([m],a.toAccountAddress):l.mergeCoins(p[0].coinObjectId,[m]),await l.toJSON({client:this.client})}async buildRawTransactionSendFromCustomTx(a,o,s){let d=ia.from(a);return this.buildRawTransactionSendFromTx(s,d,o)}async buildRawTransactionSend(a){return this.buildRawTransactionSendFromTx(a,new ia)}async buildRawTransactionSendFromTx(a,o,s){let d=await he(this.chainType,a,this.api),{messenger:A}=d,g=a.sourceToken.suiAddresses;if(!g)throw new I("SUI token must contain 'suiAddresses'");switch((0,oa.setAddress)(g.bridgeAddress,g.bridgeAddressOrigin),(0,yo.setAddress)(g.utilsAddress),A){case 1:return this.buildRawTransactionAllbridgeSend(d,g,o,s);case 2:return this.buildRawTransactionWormholeSend(d,g,o,s);case 3:case 4:return this.buildRawTransactionCctpSend(a,d,g,o,s);case 5:throw new de("Messenger OFT is not supported yet.")}}async buildRawTransactionAllbridgeSend(a,o,s,d){let{amount:A,fromAccountAddress:g,fromTokenAddress:c,toChainId:l,toAccountAddress:u,toTokenAddress:m,fee:p,gasFeePaymentMethod:b,extraGas:W}=a,y=p;if(W&&(y=aa(y).plus(W).toFixed()),s.setSender(g),b==="stablecoin"){let Z=BigInt(A)-BigInt(y),v,Y;if(d){let[w]=s.splitCoins(d,[y]);v=d,Y=w}else v=D({balance:Z,type:c}),Y=D({balance:BigInt(y),type:c});let B={bridge:o.bridgeObjectAddress,messenger:o.allbridgeMessengerObjectAddress,amount:v,destinationChainId:l,nonce:ke(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:Y,feeSuiCoin:D({balance:BigInt(0),useGasCoin:!1})};Ui(s,c,B)}else{let Z=y==="0"?D({balance:BigInt(y),useGasCoin:!1}):D({balance:BigInt(y)}),v={bridge:o.bridgeObjectAddress,messenger:o.allbridgeMessengerObjectAddress,amount:d??D({balance:BigInt(A),type:c}),destinationChainId:l,nonce:ke(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:D({balance:BigInt(0),type:c}),feeSuiCoin:Z};Ui(s,c,v)}return await s.toJSON({client:this.client})}async buildRawTransactionWormholeSend(a,o,s,d){let{amount:A,fromAccountAddress:g,fromTokenAddress:c,toChainId:l,toAccountAddress:u,toTokenAddress:m,fee:p,gasFeePaymentMethod:b,extraGas:W}=a,y=p;if(W&&(y=aa(y).plus(W).toFixed()),s.setSender(g),b==="stablecoin"){let Z=BigInt(A)-BigInt(y),v,Y;if(d){let[w]=s.splitCoins(d,[y]);v=d,Y=w}else v=D({balance:Z,type:c}),Y=D({balance:BigInt(y),type:c});let B={bridge:o.bridgeObjectAddress,messenger:o.wormholeMessengerObjectAddress,wormholeState:o.wormholeStateObjectAddress,theClock:Io,amount:v,destinationChainId:l,nonce:ke(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:Y,feeSuiCoin:D({balance:BigInt(0),useGasCoin:!1})};Ki(s,c,B)}else{let Z=y==="0"?D({balance:BigInt(y),useGasCoin:!1}):D({balance:BigInt(y)}),v={bridge:o.bridgeObjectAddress,messenger:o.wormholeMessengerObjectAddress,wormholeState:o.wormholeStateObjectAddress,theClock:Io,amount:d??D({balance:BigInt(A),type:c}),destinationChainId:l,nonce:ke(),recipient:Se(s,Te(u)),receiveToken:Se(s,Te(m)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:D({balance:BigInt(0),type:c}),feeSuiCoin:Z};Ki(s,c,v)}return await s.toJSON({client:this.client})}async buildRawTransactionCctpSend(a,o,s,d,A){let{amount:g,fromAccountAddress:c,fromTokenAddress:l,toChainId:u,toAccountAddress:m,fee:p,gasFeePaymentMethod:b,extraGas:W}=o;(0,bo.setAddress)(s.cctpAddress,s.cctpAddressOrigin);let y=p;W&&(y=aa(y).plus(W).toFixed()),d.setSender(c);let Z=Se(d,Te(m)),v;if(a.destinationToken.chainType==="SOLANA"){let Y=await Tn(this.chainType,a.toAccountAddress,a.destinationToken.tokenAddress,this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"));v=Se(d,Te(Y))}else v=Z;if(b==="stablecoin"){let Y=BigInt(g)-BigInt(y),B,w;if(A){let[P]=d.splitCoins(A,[y]);B=A,w=P}else B=D({balance:Y,type:l}),w=D({balance:BigInt(y),type:l});let O={cctpBridge:s.cctpObjectAddress,tokenMessengerMinterState:s.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:s.cctpMessageTransmitterStateObjectAddress,treasury:s.cctpTreasuryObjectAddress,denyList:s.cctpDenyListObjectAddress,amount:B,destinationChainId:u,recipient:v,recipientWalletAddress:Z,gasOracle:s.gasOracleObjectAddress,feeTokenCoin:w,feeSuiCoin:D({balance:BigInt(0),useGasCoin:!1})};_i(d,l,O)}else{let Y=y==="0"?D({balance:BigInt(y),useGasCoin:!1}):D({balance:BigInt(y)}),B={cctpBridge:s.cctpObjectAddress,tokenMessengerMinterState:s.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:s.cctpMessageTransmitterStateObjectAddress,treasury:s.cctpTreasuryObjectAddress,denyList:s.cctpDenyListObjectAddress,amount:A??D({balance:BigInt(g),type:l}),destinationChainId:u,recipient:v,recipientWalletAddress:Z,gasOracle:s.gasOracleObjectAddress,feeTokenCoin:D({balance:BigInt(0),type:l}),feeSuiCoin:Y};_i(d,l,B)}return await d.toJSON({client:this.client})}};import{Big as as}from"big.js";import ns from"bn.js";function xn(r){return"0x"+new ns(r).toString("hex")}function ho(r){return new Promise(i=>setTimeout(()=>i(),r))}async function On(r,i){let a=await r.trx.sign(i);if(!a.signature)throw new bt("Transaction was not signed properly");let s=(await r.trx.sendRawTransaction(a)).transaction.txID;return await is(r,s),{txId:s}}async function is(r,i,a=1e4){let o=Date.now();for(;;){if(Date.now()-o>a)throw new kt("Transaction not found");let s=await r.trx.getUnconfirmedTransactionInfo(i);if(!s?.receipt){await ho(2e3);continue}if(s.receipt.result==="SUCCESS")return s;throw new kt(`Transaction status is ${s.receipt.result}`)}}var en=class extends Ae{constructor(a,o){super();this.tronWeb=a;this.api=o}chainType="TRX";async send(a){let o=await he(this.chainType,a,this.api),s=await this.buildRawTransactionSendFromParams(a,o);return await On(this.tronWeb,s)}async buildRawTransactionSwap(a){let o=We(this.chainType,a);return await this.buildRawTransactionSwapFromParams(o)}async buildRawTransactionSwapFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toAccountAddress:g,toTokenAddress:c,minimumReceiveAmount:l}=a,u=[{type:"uint256",value:o},{type:"bytes32",value:A},{type:"bytes32",value:c},{type:"address",value:g},{type:"uint256",value:l}];return this.buildRawTransaction(s,"swap(uint256,bytes32,bytes32,address,uint256)",u,"0",d)}async buildRawTransactionSend(a){let o=await he(this.chainType,a,this.api);return this.buildRawTransactionSendFromParams(a,o)}async buildRawTransactionSendFromParams(a,o){let{amount:s,contractAddress:d,fromAccountAddress:A,fromTokenAddress:g,toChainId:c,toAccountAddress:l,toTokenAddress:u,messenger:m,fee:p,gasFeePaymentMethod:b,extraGas:W,extraGasDest:y}=o,Z=p;W&&(Z=as(Z).plus(W).toFixed());let v=ke().toString(),Y,B,w;switch(m){case 3:case 4:b==="stablecoin"?(Y=[{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:Z}],B="0"):(Y=[{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:0}],B=Z),w="bridge(uint256,bytes32,uint256,uint256)";break;case 5:b==="stablecoin"?(Y=[{type:"address",value:a.sourceToken.tokenAddress},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:Z},{type:"uint256",value:y??"0"},{type:"uint256",value:"10"}],B="0"):(Y=[{type:"address",value:a.sourceToken.tokenAddress},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:0},{type:"uint256",value:y??"0"},{type:"uint256",value:"10"}],B=Z),w="bridge(address,uint256,bytes32,uint256,uint256,uint256,uint256)";break;case 1:case 2:b==="stablecoin"?(Y=[{type:"bytes32",value:g},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"bytes32",value:u},{type:"uint256",value:v},{type:"uint8",value:m},{type:"uint256",value:Z}],B="0"):(Y=[{type:"bytes32",value:g},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"bytes32",value:u},{type:"uint256",value:v},{type:"uint8",value:m},{type:"uint256",value:0}],B=Z),w="swapAndBridge(bytes32,uint256,bytes32,uint256,bytes32,uint256,uint8,uint256)";break}return this.buildRawTransaction(d,w,Y,B,A)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}};var Qn=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new wn(i,a,o,s)}rawTxBuilder;async getAllowance(i,a){let o,s;a?(o=i,s=a):s=i;let d=Et(s.token,s.messenger);return await this.tokenService.getAllowance({...s,spender:d},o)}async checkAllowance(i,a){let o,s;a?(o=i,s=a):s=i;let d=Et(s.token,s.messenger);return this.tokenService.checkAllowance({...s,spender:d},o)}async approve(i,a){let o=Et(a.token,a.messenger);return this.tokenService.approve(i,{...a,spender:o})}async send(i,a){return V(a.amount),H("amount",a.amount,a.sourceToken.decimals),Xn(a.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,i).send(a)}};function Et(r,i=1){switch(i){case 3:if(r.cctpAddress)return r.cctpAddress;throw new se("Such route does not support CCTP protocol");case 4:if(r.cctpV2Address)return r.cctpV2Address;throw new se("Such route does not support CCTP V2 protocol");case 5:if(r.oftBridgeAddress)return r.oftBridgeAddress;throw new de("Such route does not support OFT protocol");case 1:case 2:return r.bridgeAddress}}function Xn(r,i,a,o,s){switch(X.getChainProperty(r).chainType){case"EVM":{if(s)return new Dt(s,i,a);{let d=a.getNodeRpcUrl(r);return new Dt(new rs(d),i,a)}}case"TRX":{if(s)return new en(s,i);{let d=a.getNodeRpcUrl(r);return new en(new os({fullHost:d,solidityNode:d,eventServer:d}),i)}}case"SOLANA":return new Hn(a.getNodeRpcUrl("SOL"),{wormholeMessengerProgramId:o.wormholeMessengerProgramId,solanaLookUpTable:o.solanaLookUpTable,cctpParams:o.cctpParams,jupiterParams:{jupiterUrl:o.jupiterUrl,jupiterApiKeyHeader:o.jupiterApiKeyHeader,jupiterMaxAccounts:o.jupiterMaxAccounts}},i);case"SRB":return new Ln(a,o,i);case"SUI":return new Gt(a,i);case"ALG":if(s){let d=s,A=vo.fromClients({algod:d});return new Kt(A,i)}else{let d=a.getNodeRpcUrl(r),A=vo.fromConfig({algodConfig:{server:d}});return new Kt(A,i)}}}import{AlgorandClient as No}from"@algorandfoundation/algokit-utils";import{Big as Gs}from"big.js";import Fs from"timed-cache";import{TronWeb as fs}from"tronweb";import{FMT_BYTES as Ns,FMT_NUMBER as Ts,Web3 as ws}from"web3";import{Big as Ee}from"big.js";function Yo(r,i,a,o,s){let d=f(r,3),A=Ee(d),g=Ee(a),c=Ee(o).plus(s),l,u;if(g.eq(0)||c.eq(0)){let p=A.div(2);l=Ee(o).plus(p),u=Ee(s).plus(p)}else l=Ee(o).plus(A.mul(o).div(c)),u=Ee(s).plus(A.mul(s).div(c));return Ee(Ra(i,l.toFixed(),u.toFixed())).minus(g).toFixed()}function Ro(r){let i=f(r,3);return Ee(i).round().toFixed()}import{assignGroupID as ra,bytesToBigInt as As}from"algosdk";import{getArc56ReturnValue as ss}from"@algorandfoundation/algokit-utils/types/app-arc56";import{AppClient as Kn}from"@algorandfoundation/algokit-utils/types/app-client";import{AppFactory as tp}from"@algorandfoundation/algokit-utils/types/app-factory";import{encodeAddress as ds}from"algosdk";var Un={name:"Pool",structs:{},methods:[{name:"createApplication",args:[{type:"address",name:"owner"},{type:"address",name:"router"},{type:"uint64",name:"a"},{type:"uint64",name:"assetId"},{type:"uint64",name:"feeShareBP"},{type:"uint64",name:"balanceRatioMinBP"}],returns:{type:"void"},actions:{create:["NoOp"],call:[]},readonly:!1,events:[],recommendations:{}},{name:"optInToApplication",args:[],returns:{type:"void"},actions:{create:[],call:["OptIn"]},readonly:!1,events:[],recommendations:{}},{name:"optInAsset",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,desc:"Opt-in the application account to the ASA stored in `this.asset`.\nThis performs an inner axfer of 0 to the app's own address.\nCall once after deploy (or whenever you change the asset).",events:[],recommendations:{}},{name:"noop",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"deposit",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]},{name:"Deposit",args:[{type:"address",name:"to"},{type:"uint64",name:"lpAmount"}]}],recommendations:{}},{name:"withdraw",args:[{type:"uint64",name:"amountLp",desc:"The Withdrawn amount"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]},{name:"Withdraw",args:[{type:"address",name:"from"},{type:"uint64",name:"lpAmount"}]}],recommendations:{}},{name:"swapToVUsd",args:[{type:"address",name:"user"},{type:"uint64",name:"amount",desc:"The amount of tokens to swap."},{type:"bool",name:"zeroFee",desc:`When true it allows to swap without incurring any fees. It is intended for use with service
1
+ var pr=Object.create;var Fa=Object.defineProperty;var mr=Object.getOwnPropertyDescriptor;var br=Object.getOwnPropertyNames;var Cr=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty;var Ir=(r,i)=>()=>(r&&(i=r(r=0)),i);var Pi=(r,i)=>()=>(i||r((i={exports:{}}).exports,i),i.exports);var hr=(r,i,a,o)=>{if(i&&typeof i=="object"||typeof i=="function")for(let s of br(i))!yr.call(r,s)&&s!==a&&Fa(r,s,{get:()=>i[s],enumerable:!(o=mr(i,s))||o.enumerable});return r};var we=(r,i,a)=>(a=r!=null?pr(Cr(r)):{},hr(i||!r||!r.__esModule?Fa(a,"default",{value:r,enumerable:!0}):a,r));import{bcs as ye}from"@mysten/sui/bcs";function ms(r,i=["<",">"]){let[a,o]=i,s=[],d="",A=0;for(let g=0;g<r.length;g++){let c=r[g];if(c===a&&A++,c===o&&A--,A===0&&c===","){s.push(d.trim()),d="";continue}d+=c}return s.push(d.trim()),s}function de(r){if(typeof r!="string")throw new Error(`Illegal type passed as a name of the type: ${r}`);let[i,a]=["<",">"],o=r.indexOf(i),s=Array.from(r).reverse().indexOf(a);if(o===-1&&s===-1)return{typeName:r,typeArgs:[]};if(o===-1||s===-1)throw new Error(`Unclosed generic in name '${r}'`);let d=r.slice(0,o),A=ms(r.slice(o+1,r.length-s-1),[i,a]);return{typeName:d,typeArgs:A}}function Ro(r){return!r||typeof r!="object"||Array.isArray(r)?!1:"GasCoin"in r||"Input"in r||"Result"in r||"NestedResult"in r}function G(r,i){return Ro(i)?i:r.object(i)}function fe(r,i,a){if(Ro(i))return G(r,i);function o(l){let{typeName:u,typeArgs:p}=de(l);switch(u){case"bool":return ye.Bool;case"u8":return ye.U8;case"u16":return ye.U16;case"u32":return ye.U32;case"u64":return ye.U64;case"u128":return ye.U128;case"u256":return ye.U256;case"address":return ye.Address;case"0x1::string::String":case"0x1::ascii::String":return ye.String;case"0x2::object::ID":return ye.Address;case"0x1::option::Option":return ye.option(o(p[0]));case"vector":return ye.vector(o(p[0]));default:throw new Error(`invalid primitive type ${l}`)}}function s(l){for(let u of l){if(typeof u>"u"||u===null)return!0;if(Array.isArray(u))return s(u)}return!1}function d(l){for(let u of l){if(!Array.isArray(u)){if(u===null)continue;switch(typeof u){case"string":case"number":case"bigint":case"boolean":continue;default:return!1}}return d(u)}return!0}function A(l){for(let u of l){if(!Array.isArray(u))switch(typeof u){case"string":case"number":case"bigint":case"boolean":return!0;default:continue}return A(u)}return!1}let{typeName:g,typeArgs:c}=de(a);switch(g){case"0x1::option::Option":if(i===null)return r.pure.option("bool",null);if(d([i]))return r.pure(o(a).serialize(i));if(A([i]))throw new Error("mixing primitive and TransactionArgument values is not supported");return r.moveCall({target:"0x1::option::some",typeArguments:[c[0]],arguments:[fe(r,i,c[0])]});case"vector":if(!Array.isArray(i))throw new Error("expected an array for vector type");if(i.length===0)return r.pure(ye.vector(ye.Bool).serialize([]));if(s(i))throw new Error("the provided array contains undefined or null values");if(d(i))return r.pure(o(a).serialize(i));if(A(i))throw new Error("mixing primitive and TransactionArgument values is not supported");return r.makeMoveVec({type:c[0],elements:i});default:return r.pure(o(a).serialize(i))}}function bs(r){let i=r.split("0x").join("");for(let a=0;a<i.length;a++)if(i[a]!=="0")return`0x${i.substring(a)}`;return"0x0"}function T(r){let{typeName:i,typeArgs:a}=de(r);switch(i){case"bool":case"u8":case"u16":case"u32":case"u64":case"u128":case"u256":case"address":case"signer":return i;case"vector":return`vector<${T(a[0])}>`;default:{let o=i.split("::");o[0]=bs(o[0]);let s=o.join("::");return a.length>0?`${s}<${a.map(d=>T(d)).join(",")}>`:s}}}function k(r,...i){return i.length>0?`${r}<${i.join(", ")}>`:r}var ie=Ir(()=>{"use strict"});var ot=Pi((yu,Yo)=>{"use strict";ie();var ta=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return T(r.$PACKAGE_ID)}get PUBLISHED_AT(){return T(r.$PUBLISHED_AT)}get PKG_V1(){return T(r.$PKG_V[1])}setPackageId(i){r.$PACKAGE_ID=i}setPublishedAt(i){r.$PUBLISHED_AT=i}setPkgV(i,a){r.$PKG_V[i]=a}setAddress(i,a){r.$PACKAGE_ID=i,r.$PUBLISHED_AT=i,r.$PKG_V[1]=a||i}},Cs=new ta;Yo.exports=Cs});var oa=Pi((Ru,Go)=>{"use strict";ie();var aa=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return T(r.$PACKAGE_ID)}get PUBLISHED_AT(){return T(r.$PUBLISHED_AT)}get PKG_V1(){return T(r.$PKG_V[1])}setPackageId(i){r.$PACKAGE_ID=i}setPublishedAt(i){r.$PUBLISHED_AT=i}setPkgV(i,a){r.$PKG_V[i]=a}setAddress(i,a){r.$PACKAGE_ID=i,r.$PUBLISHED_AT=i,r.$PKG_V[1]=a||i}},ys=new aa;Go.exports=ys});var da=Pi((fu,wo)=>{"use strict";ie();var sa=class r{static $PACKAGE_ID="";static $PUBLISHED_AT="";static $PKG_V=[];get PACKAGE_ID(){return T(r.$PACKAGE_ID)}get PUBLISHED_AT(){return T(r.$PUBLISHED_AT)}get PKG_V1(){return T(r.$PKG_V[1])}setPackageId(i){r.$PACKAGE_ID=i}setPublishedAt(i){r.$PUBLISHED_AT=i}setPkgV(i,a){r.$PKG_V[i]=a}setAddress(i,a){r.$PACKAGE_ID=i,r.$PUBLISHED_AT=i,r.$PKG_V[1]=a||i}},Is=new sa;wo.exports=Is});var hn={coreApiUrl:"https://core.api.allbridgecoreapi.net",coreApiQueryParams:{},coreApiHeaders:{},jupiterUrl:"https://lite-api.jup.ag/swap/v1",wormholeMessengerProgramId:"worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth",solanaLookUpTable:"2JcBAEVnAwVo4u8d61iqgHPrzZuugur7cVTjWubsVLHj",sorobanNetworkPassphrase:"Public Global Stellar Network ; September 2015",tronJsonRpc:"https://api.trongrid.io/jsonrpc",cctpParams:{cctpTransmitterProgramId:"CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd",cctpTokenMessengerMinter:"CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3",cctpDomains:{ETH:0,AVA:1,OPT:2,ARB:3,SOL:5,BAS:6,POL:7,SUI:8}},cachePoolInfoChainSec:20},iA={solanaRpcUrl:"https://api.mainnet-beta.solana.com",tronRpcUrl:"https://api.trongrid.io"},aA={SOL:"https://api.mainnet-beta.solana.com",TRX:"https://api.trongrid.io",SRB:"https://rpc.stellar.org:443",STLR:"https://horizon.stellar.org",SUI:"https://fullnode.mainnet.sui.io",STX:"https://api.hiro.so"};import{AlgorandClient as jo}from"@algorandfoundation/algokit-utils";import{TronWeb as Ns}from"tronweb";import{Web3 as ws}from"web3";var K=class extends Error{errorCode;constructor(i,a){super(a),this.errorCode=i}},I=class extends K{constructor(i){super("SdkError",i)}},Ke=class extends K{constructor(i){super("InvalidAmountError",i)}},ht=class extends K{constructor(i){super("AmountNotEnoughError",i)}},Ue=class extends K{constructor(i){super("InsufficientPoolLiquidityError",i)}},re=class extends K{constructor(i){super("JupiterError",i)}},xt=class extends K{constructor(i){super("InvalidGasFeePaymentOptionError",i)}},vn=class extends K{constructor(i){super("InvalidMessengerOptionError",i)}},X=class extends K{constructor(i){super("MethodNotSupportedError",i)}},Ot=class extends K{constructor(i){super("VerifyTxError",i)}},vt=class extends K{constructor(i){super("InvalidTxError",i)}},Rn=class extends K{constructor(i){super("ExtraGasMaxLimitExceededError",i)}},Yn=class extends K{constructor(i,a,o){super("ArgumentInvalidDecimalsError",`Argument '${i}' decimals '${a}' cannot be greater than '${o}'`)}},Qt=class extends K{constructor(i){super("TimeoutError",i)}},Bn=class extends K{constructor(i){super("NodeRpcUrlNotInitializedError",`For chain '${i}' Node RPC URL not initialized`)}},ce=class extends K{constructor(i){super("CCTPDoesNotSupportedError",i)}},le=class extends K{constructor(i){super("OFTDoesNotSupportedError",i)}},Wn=class extends K{constructor(i){super("YieldDoesNotSupportedError",i)}},fn=class extends K{constructor(){super("TxTooLargeError","Transaction too large: try again later or switch to another messenger or pay relayer fee in native gas currency")}},vr=(C=>(C.SDK_ERROR="SdkError",C.INVALID_AMOUNT_ERROR="InvalidAmountError",C.AMOUNT_NOT_ENOUGH_ERROR="AmountNotEnoughError",C.INSUFFICIENT_POOL_LIQUIDITY_ERROR="InsufficientPoolLiquidityError",C.JUPITER_ERROR="JupiterError",C.INVALID_GAS_FEE_PAYMENT_OPTION_ERROR="InvalidGasFeePaymentOptionError",C.INVALID_MESSENGER_OPTION_ERROR="InvalidMessengerOptionError",C.METHOD_NOT_SUPPORTED_ERROR="MethodNotSupportedError",C.VERIFY_TX_ERROR="VerifyTxError",C.INVALID_TX_ERROR="InvalidTxError",C.EXTRA_GAS_MAX_LIMIT_EXCEEDED_ERROR="ExtraGasMaxLimitExceededError",C.ARGUMENT_INVALID_DECIMALS_ERROR="ArgumentInvalidDecimalsError",C.TIMEOUT_ERROR="TimeoutError",C.NODE_RPC_URL_NOT_INITIALIZED_ERROR="NodeRpcUrlNotInitializedError",C.CCTP_DOES_NOT_SUPPORTED_ERROR="CCTPDoesNotSupportedError",C.OFT_DOES_NOT_SUPPORTED_ERROR="OFTDoesNotSupportedError",C.YIELD_DOES_NOT_SUPPORTED_ERROR="YieldDoesNotSupportedError",C.TX_TOO_LARGE="TxTooLargeError",C))(vr||{});var he=(C=>(C.BSC="BSC",C.ETH="ETH",C.BAS="BAS",C.SOL="SOL",C.TRX="TRX",C.POL="POL",C.ARB="ARB",C.CEL="CEL",C.AVA="AVA",C.SRB="SRB",C.STLR="STLR",C.OPT="OPT",C.SUI="SUI",C.SNC="SNC",C.UNI="UNI",C.LIN="LIN",C.ALG="ALG",C.STX="STX",C))(he||{}),J=(g=>(g.EVM="EVM",g.SOLANA="SOLANA",g.TRX="TRX",g.SRB="SRB",g.SUI="SUI",g.ALG="ALG",g.STX="STX",g))(J||{});var Rr={EVM:18,SOLANA:9,TRX:6,SRB:7,SUI:9,ALG:6,STX:6},Yr={BSC:{chainSymbol:"BSC",chainId:"0x38",name:"BNB Chain",chainType:"EVM"},ETH:{chainSymbol:"ETH",chainId:"0x1",name:"Ethereum",chainType:"EVM"},BAS:{chainSymbol:"BAS",chainId:"0x2105",name:"Base",chainType:"EVM"},ARB:{chainSymbol:"ARB",chainId:"0xa4b1",name:"Arbitrum",chainType:"EVM"},AVA:{chainSymbol:"AVA",chainId:"0xa86a",name:"Avalanche",chainType:"EVM"},CEL:{chainSymbol:"CEL",chainId:"0xa4ec",name:"Celo",chainType:"EVM"},POL:{chainSymbol:"POL",chainId:"0x89",name:"Polygon",chainType:"EVM"},OPT:{chainSymbol:"OPT",chainId:"0xa",name:"OP Mainnet",chainType:"EVM"},SNC:{chainSymbol:"SNC",chainId:"0x92",name:"Sonic",chainType:"EVM"},UNI:{chainSymbol:"UNI",chainId:"0x82",name:"Unichain",chainType:"EVM"},LIN:{chainSymbol:"LIN",chainId:"0xe708",name:"Linea",chainType:"EVM"},SOL:{chainSymbol:"SOL",name:"Solana",chainType:"SOLANA"},TRX:{chainSymbol:"TRX",name:"Tron",chainType:"TRX"},SRB:{chainSymbol:"SRB",name:"Stellar",chainType:"SRB"},STLR:{chainSymbol:"STLR",name:"Stellar",chainType:"SRB"},SUI:{chainSymbol:"SUI",name:"Sui",chainType:"SUI"},ALG:{chainSymbol:"ALG",name:"Algorand",chainType:"ALG"},STX:{chainSymbol:"STX",name:"Stacks",chainType:"STX"}},S=(()=>{let r={...Yr};return{addChainsProperties(i){r={...r,...i}},getChainProperty(i){let a=r[i];if(!a)throw new I(`Cannot find chain properties for ${i}`);return a},getChainsProperties(){return r},getChainDecimalsByType(i){return Rr[i]}}})();var Li=(A=>(A.OK="OK",A.INVALID="INVALID",A.FORBIDDEN="FORBIDDEN",A.UNINITIALIZED="UNINITIALIZED",A.CONTRACT_ADDRESS="CONTRACT_ADDRESS",A.WRONG_ASSOCIATED_ACCOUNT_OWNER="WRONG_ASSOCIATED_ACCOUNT_OWNER",A))(Li||{});var Be=(d=>(d[d.ALLBRIDGE=1]="ALLBRIDGE",d[d.WORMHOLE=2]="WORMHOLE",d[d.CCTP=3]="CCTP",d[d.CCTP_V2=4]="CCTP_V2",d[d.OFT=5]="OFT",d))(Be||{});import{Big as Za}from"big.js";async function ee(r,i){return await r.getPoolInfoByKey({chainSymbol:i.chainSymbol,poolAddress:i.poolAddress})}function V(r){if(Za(r).lte(0))throw new Ke("Amount must be greater than zero")}function H(r,i,a){let o=Za(i).toFixed(),[s,d]=o.split(".");if(d&&d.length>a)throw new Yn(r,d.length,a)}async function Tn(r,i,a){return await Promise.race([r,new Promise((o,s)=>{setTimeout(()=>s(new Qt(i)),a)})])}async function Hi(r,i,a,o){if(a<1)throw new Error(`Bad argument: 'maxRetries' must be greater than 0, but ${a} was received.`);let s=0;for(;;)try{return await Tn(r(),i,o)}catch{if(++s>=a)throw new Qt(i)}}async function Ga(r,i,a,o=1.5,s=!1){let d=[],A=0,g=await r();if(d.push(g),!i(g))return d;let c=new Date(Date.now()+a*1e3).valueOf(),l=1e3,u=l;for(;Date.now()<c;){let p=d[d.length-1];if(p===void 0||!i(p))break;A++,s&&console.info(`Waiting ${l}ms before trying again (bringing the total wait time to ${u}ms so far, of total ${a*1e3}ms)`),await new Promise(y=>setTimeout(y,l)),l=l*o,new Date(Date.now()+l).valueOf()>c&&(l=c-Date.now(),s&&console.info(`was gonna wait too long; new waitTime: ${l}ms`)),u=l+u;let m=await r(p);d.push(m),s&&i(m)&&console.info(`${A}. Called ${r.name}; ${d.length} prev attempts. Most recent: ${JSON.stringify(d[d.length-1],null,2)}`)}return d}import{AlgoAmount as kr}from"@algorandfoundation/algokit-utils/types/amount";import za,{Address as xa}from"algosdk";import{getArc56ReturnValue as Br}from"@algorandfoundation/algokit-utils/types/app-arc56";import{AppClient as Fn}from"@algorandfoundation/algokit-utils/types/app-client";import{AppFactory as XA}from"@algorandfoundation/algokit-utils/types/app-factory";var Zn={name:"Bridge",structs:{},methods:[{name:"createApplication",args:[{type:"address",name:"owner"},{type:"byte",name:"chainId"},{type:"application",name:"messenger"},{type:"application",name:"gasOracle"}],returns:{type:"void"},actions:{create:["NoOp"],call:[]},readonly:!1,events:[],recommendations:{}},{name:"optInAsset",args:[{type:"uint64",name:"assetId"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"noop",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"swapAndBridge",args:[{type:"uint64",name:"tokenId"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"uint64",name:"feeTokenAmount",defaultValue:{source:"literal",data:"AAAAAAAAAAA=",type:"uint64"}}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"BridgingFeeFromTokens",args:[{type:"uint64",name:"feeFromNative"},{type:"uint64",name:"feeFromStable"},{type:"uint64",name:"feeStableTokenAmount"}]},{name:"ReceiveFee",args:[{type:"uint64",name:"bridgeTransactionCost"},{type:"uint64",name:"messageTransactionCost"}]},{name:"TokensSent",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"}]}],recommendations:{}},{name:"receiveTokens",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"sourceChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"uint64",name:"receiveAmountMin"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"TokensReceived",args:[{type:"uint64",name:"receiveAmount"},{type:"address",name:"recipient"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"},{type:"byte[32]",name:"message"}]}],recommendations:{}},{name:"registerBridge",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"bridgeAddress"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"addBridgeToken",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"tokenAddress"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"removeBridgeToken",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"tokenAddress"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"withdrawGasTokens",args:[{type:"uint64",name:"amount"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"withdrawBridgingFeeInTokens",args:[{type:"uint64",name:"assetId"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"getBridgingCostInTokens",args:[{type:"byte",name:"destinationChainId"},{type:"uint64",name:"tokenId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"hashMessage",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"sourceChainId"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"}],returns:{type:"byte[32]"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"isOtherBridgeTokenSupported",args:[{type:"byte",name:"chainId"},{type:"byte[32]",name:"token"}],returns:{type:"bool"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"getTransactionCost",args:[{type:"byte",name:"chainId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"getReceiveTokensCost",args:[],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"getSendTransactionStorageCost",args:[],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"swap",args:[{type:"uint64",name:"tokenId",desc:"The token to be swapped."},{type:"uint64",name:"receiveTokenId",desc:"The token to receive in exchange for the swapped token."},{type:"address",name:"recipient",desc:"The address to receive the tokens."},{type:"uint64",name:"receiveAmountMin",desc:"The minimum amount of tokens required to receive during the swap."}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"Swapped",args:[{type:"address",name:"sender"},{type:"address",name:"recipient"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"receiveTokenId"},{type:"uint64",name:"amount"},{type:"uint64",name:"receivedAmount"}]}],recommendations:{}},{name:"addPool",args:[{type:"uint64",name:"poolId",desc:"The address of the `Pool` contract."},{type:"uint64",name:"tokenId",desc:"The address of the token in the liquidity pool."}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"removePool",args:[{type:"uint64",name:"tokenId"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"stopSwap",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"startSwap",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setStopAuthority",args:[{type:"address",name:"stopAuthority"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setRebalancer",args:[{type:"address",name:"rebalancer"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"getGasUsage",args:[{type:"byte",name:"chainId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"setGasUsage",args:[{type:"byte",name:"chainId"},{type:"uint64",name:"gasAmount"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setGasOracle",args:[{type:"application",name:"gasOracle"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"getTransactionRelayerCost",args:[{type:"byte",name:"chainId"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"transferOwnership",args:[{type:"address",name:"newOwner"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}}],arcs:[22,28],networks:{},state:{schema:{global:{ints:3,bytes:4},local:{ints:0,bytes:0}},keys:{global:{chainId:{keyType:"AVMString",valueType:"byte",key:"Y2hhaW5JZA=="},messenger:{keyType:"AVMString",valueType:"AVMUint64",key:"bWVzc2VuZ2Vy"},stopAuthority:{keyType:"AVMString",valueType:"address",key:"c3RvcEF1dGhvcml0eQ=="},rebalancer:{keyType:"AVMString",valueType:"address",key:"cmViYWxhbmNlcg=="},canSwap:{keyType:"AVMString",valueType:"AVMUint64",key:"Y2FuU3dhcA=="},gasOracle:{keyType:"AVMString",valueType:"AVMUint64",key:"Z2FzT3JhY2xl"},owner:{keyType:"AVMString",valueType:"address",key:"b3duZXI="}},local:{},box:{}},maps:{global:{},local:{},box:{processedMessages:{keyType:"byte[32]",valueType:"byte[0]",prefix:"bQ=="},sentMessages:{keyType:"byte[32]",valueType:"byte[0]",prefix:"cw=="},otherBridges:{keyType:"byte",valueType:"byte[32]",prefix:"Yg=="},otherBridgeTokens:{keyType:"AVMBytes",valueType:"byte[0]",prefix:"dA=="},pools:{keyType:"uint64",valueType:"uint64",prefix:"cA=="},fromGasOracleScalingFactor:{keyType:"uint64",valueType:"uint64",prefix:"ZQ=="},bridgingFeeConversionScalingFactor:{keyType:"uint64",valueType:"uint64",prefix:"Zg=="},gasUsage:{keyType:"byte",valueType:"uint64",prefix:"Zw=="}}}},bareActions:{create:[],call:[]},sourceInfo:{approval:{sourceInfo:[{pc:[906],errorMessage:"Asset must go to app"},{pc:[889],errorMessage:"Asset txn missing"},{pc:[1391,1858,2149,2235,2329,2371],errorMessage:"Box must have value"},{pc:[1122],errorMessage:"Bridge: amount too low for fee"},{pc:[1130],errorMessage:"Bridge: bridge to the zero address"},{pc:[1518],errorMessage:"Bridge: message processed"},{pc:[1561],errorMessage:"Bridge: no message"},{pc:[1352,1469],errorMessage:"Bridge: not enough fee"},{pc:[1460],errorMessage:"Bridge: source not registered"},{pc:[1242],errorMessage:"Bridge: tokens already sent"},{pc:[1205],errorMessage:"Bridge: unknown chain or token"},{pc:[1192],errorMessage:"Bridge: wrong destination chain"},{pc:[1283,1437,1558,1797,1844,2213,2314,2415],errorMessage:"Bytes has valid prefix"},{pc:[927],errorMessage:"CloseTo not allowed"},{pc:[1248],errorMessage:"Index access is out of bounds"},{pc:[341,356,376,394,413,433,448,463,475,487,503,523,550,562,574,594,622,657,681,697,713,731,749,767,799,831,840,856],errorMessage:"OnCompletion is not NoOp"},{pc:[2425],errorMessage:"Only owner"},{pc:[920],errorMessage:"Rekey not allowed"},{pc:[2094],errorMessage:"Router: is not stopAuthority"},{pc:[2230],errorMessage:"Router: no pool"},{pc:[2144],errorMessage:"Router: no receive pool"},{pc:[1112,1450,1947],errorMessage:"Router: swap prohibited"},{pc:[913],errorMessage:"Wrong asset"},{pc:[1724],errorMessage:"account opted into asset"},{pc:[1291,2240],errorMessage:"application exists"},{pc:[2035],errorMessage:"asset exists"},{pc:[860],errorMessage:"can only call when creating"},{pc:[344,359,379,397,416,436,451,466,478,490,506,526,553,565,577,597,625,660,684,700,716,734,752,770,802,834,843],errorMessage:"can only call when not creating"},{pc:[1111,1188,1210,1255,1288,1295,1400,1405,1449,1474,1526,1692,1732,1767,1804,1946,2092,2161,2266,2377,2423],errorMessage:"check GlobalState exists"},{pc:[1910],errorMessage:"invalid size"},{pc:[899],errorMessage:"transaction type is axfer"},{pc:[975],errorMessage:"transaction type is pay"}],pcOffsetMethod:"none"},clear:{sourceInfo:[],pcOffsetMethod:"none"}},source:{approval:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDYgNCAxNTcwMAogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJjYW5Td2FwIiAibWVzc2VuZ2VyIiAib3duZXIiICJnYXNPcmFjbGUiICJjaGFpbklkIiAicmViYWxhbmNlciIgInQiICJwIiAweDAwICJzdG9wQXV0aG9yaXR5IiAweDAxICJnIiAweDQzNDE3YWEzIDB4Zjc0NzViODIgMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgcmViYWxhbmNlciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ6ZXJvCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUAzNgogICAgcHVzaGJ5dGVzcyAweGZmZjgyODQxIDB4NjVmNzA1NzMgMHhlODNhODdhYiAweDJjOWY2ODQ3IDB4MzE5MTliMjggMHg0ZWJhMDcyMSAweGM2MTdlZDczIDB4NTc1MzE1NjAgMHg2MzgwODI3OCAweDA2NTA3YzZhIDB4ZjVmOTZlYjMgMHg0YjA2MmNhMCAweGMzY2RkOTJhIC8vIG1ldGhvZCAiY3JlYXRlQXBwbGljYXRpb24oYWRkcmVzcyxieXRlLGFwcGxpY2F0aW9uLGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgIm9wdEluQXNzZXQodWludDY0KXZvaWQiLCBtZXRob2QgIm5vb3AoKXZvaWQiLCBtZXRob2QgInN3YXBBbmRCcmlkZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlY2VpdmVUb2tlbnModWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZVszMl0sYnl0ZVszMl0sdWludDY0KXZvaWQiLCBtZXRob2QgInJlZ2lzdGVyQnJpZGdlKGJ5dGUsYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAiYWRkQnJpZGdlVG9rZW4oYnl0ZSxieXRlWzMyXSl2b2lkIiwgbWV0aG9kICJyZW1vdmVCcmlkZ2VUb2tlbihieXRlLGJ5dGVbMzJdKXZvaWQiLCBtZXRob2QgIndpdGhkcmF3R2FzVG9rZW5zKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnModWludDY0KXZvaWQiLCBtZXRob2QgImdldEJyaWRnaW5nQ29zdEluVG9rZW5zKGJ5dGUsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiaGFzaE1lc3NhZ2UodWludDY0LGJ5dGVbMzJdLGJ5dGUsYnl0ZSxieXRlWzMyXSxieXRlWzMyXSlieXRlWzMyXSIsIG1ldGhvZCAiaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGJ5dGUsYnl0ZVszMl0pYm9vbCIKICAgIGJ5dGVjIDEzIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25Db3N0KGJ5dGUpdWludDY0IgogICAgcHVzaGJ5dGVzcyAweDA3ZGY4NDI5IDB4ODBjNWM3MGYgMHhmYWIxMTFhMiAweGVmMTVmODU1IDB4NmIxZWUyMjMgMHgxODcwYTQ5MiAweDM1NTczMjRkIDB4MDRiMTYxZjEgMHhkMmIzNTdlYiAvLyBtZXRob2QgImdldFJlY2VpdmVUb2tlbnNDb3N0KCl1aW50NjQiLCBtZXRob2QgImdldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0KCl1aW50NjQiLCBtZXRob2QgInN3YXAodWludDY0LHVpbnQ2NCxhZGRyZXNzLHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJhZGRQb29sKHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAicmVtb3ZlUG9vbCh1aW50NjQpdm9pZCIsIG1ldGhvZCAic3RvcFN3YXAoKXZvaWQiLCBtZXRob2QgInN0YXJ0U3dhcCgpdm9pZCIsIG1ldGhvZCAic2V0U3RvcEF1dGhvcml0eShhZGRyZXNzKXZvaWQiLCBtZXRob2QgInNldFJlYmFsYW5jZXIoYWRkcmVzcyl2b2lkIgogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJnZXRHYXNVc2FnZShieXRlKXVpbnQ2NCIKICAgIHB1c2hieXRlc3MgMHgwY2E1YWU3YSAweDM5N2I5MThiIDB4Y2JmYzZkMDIgMHhlMTdiYWZiNCAvLyBtZXRob2QgInNldEdhc1VzYWdlKGJ5dGUsdWludDY0KXZvaWQiLCBtZXRob2QgInNldEdhc09yYWNsZShhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGJ5dGUpdWludDY0IiwgbWV0aG9kICJ0cmFuc2Zlck93bmVyc2hpcChhZGRyZXNzKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDUgbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDYgbWFpbl9ub29wX3JvdXRlQDcgbWFpbl9zd2FwQW5kQnJpZGdlX3JvdXRlQDggbWFpbl9yZWNlaXZlVG9rZW5zX3JvdXRlQDkgbWFpbl9yZWdpc3RlckJyaWRnZV9yb3V0ZUAxMCBtYWluX2FkZEJyaWRnZVRva2VuX3JvdXRlQDExIG1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTIgbWFpbl93aXRoZHJhd0dhc1Rva2Vuc19yb3V0ZUAxMyBtYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNCBtYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1IG1haW5faGFzaE1lc3NhZ2Vfcm91dGVAMTYgbWFpbl9pc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWRfcm91dGVAMTcgbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTggbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOSBtYWluX2dldFNlbmRUcmFuc2FjdGlvblN0b3JhZ2VDb3N0X3JvdXRlQDIwIG1haW5fc3dhcF9yb3V0ZUAyMSBtYWluX2FkZFBvb2xfcm91dGVAMjIgbWFpbl9yZW1vdmVQb29sX3JvdXRlQDIzIG1haW5fc3RvcFN3YXBfcm91dGVAMjQgbWFpbl9zdGFydFN3YXBfcm91dGVAMjUgbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDI2IG1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNyBtYWluX2dldEdhc1VzYWdlX3JvdXRlQDI4IG1haW5fc2V0R2FzVXNhZ2Vfcm91dGVAMjkgbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzAgbWFpbl9nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0X3JvdXRlQDMxIG1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzIKCm1haW5fYWZ0ZXJfaWZfZWxzZUAzNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIGludGNfMCAvLyAwCiAgICByZXR1cm4KCm1haW5fdHJhbnNmZXJPd25lcnNoaXBfcm91dGVAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdHJhbnNmZXJPd25lcnNoaXAKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdF9yb3V0ZUAzMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzQKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM0CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRHYXNPcmFjbGVfcm91dGVAMzA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0R2FzT3JhY2xlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldEdhc1VzYWdlX3JvdXRlQDI5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjIKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRHYXNVc2FnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRHYXNVc2FnZV9yb3V0ZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjE3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0R2FzVXNhZ2UKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0UmViYWxhbmNlcl9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTQ2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiBzZXRSZWJhbGFuY2VyCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3NldFN0b3BBdXRob3JpdHlfcm91dGVAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTM3CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0U3RvcEF1dGhvcml0eQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFydFN3YXBfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEyOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RhcnRTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0b3BTd2FwX3JvdXRlQDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTkKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0b3BTd2FwCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3JlbW92ZVBvb2xfcm91dGVAMjM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTEwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlUG9vbAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9hZGRQb29sX3JvdXRlQDIyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGFkZFBvb2wKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcF9yb3V0ZUAyMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjc4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdF9yb3V0ZUAyMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzI3CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRSZWNlaXZlVG9rZW5zQ29zdF9yb3V0ZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzIwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgYnl0ZWMgMTUgLy8gMHgxNTFmN2M3NTAwMDAwMDAwMDAwMDNkNTQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9nZXRUcmFuc2FjdGlvbkNvc3Rfcm91dGVAMTg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMxNQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE1CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgZ2V0VHJhbnNhY3Rpb25Db3N0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2lzT3RoZXJCcmlkZ2VUb2tlblN1cHBvcnRlZF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzEwCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgY2FsbHN1YiBpc090aGVyQnJpZGdlVG9rZW5TdXBwb3J0ZWQKICAgIGJ5dGVjIDkgLy8gMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2hhc2hNZXNzYWdlX3JvdXRlQDE2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyODMKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI4MwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGhhc2hNZXNzYWdlCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2dldEJyaWRnaW5nQ29zdEluVG9rZW5zX3JvdXRlQDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNjYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI2NgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBjYWxsc3ViIGdldEJyaWRnaW5nQ29zdEluVG9rZW5zCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3dpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vuc19yb3V0ZUAxNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjUwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiB3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fd2l0aGRyYXdHYXNUb2tlbnNfcm91dGVAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgd2l0aGRyYXdHYXNUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVtb3ZlQnJpZGdlVG9rZW5fcm91dGVAMTI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzOAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVtb3ZlQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fYWRkQnJpZGdlVG9rZW5fcm91dGVAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYWRkQnJpZGdlVG9rZW4KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVnaXN0ZXJCcmlkZ2Vfcm91dGVAMTA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgcmVnaXN0ZXJCcmlkZ2UKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fcmVjZWl2ZVRva2Vuc19yb3V0ZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzgKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHJlY2VpdmVUb2tlbnMKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcEFuZEJyaWRnZV9yb3V0ZUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NAogICAgLy8gZXhwb3J0IGNsYXNzIEJyaWRnZSBleHRlbmRzIFJvdXRlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcsIElCcmlkZ2UgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo5My05NwogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIGNhbGxzdWIgc3dhcEFuZEJyaWRnZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9ub29wX3JvdXRlQDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcHRJbkFzc2V0X3JvdXRlQDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU0CiAgICAvLyBleHBvcnQgY2xhc3MgQnJpZGdlIGV4dGVuZHMgUm91dGVyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZywgSUJyaWRnZSB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc0CiAgICAvLyBvcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCk6IHZvaWQgewogICAgY2FsbHN1YiBvcHRJbkFzc2V0CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2NyZWF0ZUFwcGxpY2F0aW9uX3JvdXRlQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTQKICAgIC8vIGV4cG9ydCBjbGFzcyBCcmlkZ2UgZXh0ZW5kcyBSb3V0ZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nLCBJQnJpZGdlIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6Z2V0UHJldkFzc2V0UGF5KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRQcmV2QXNzZXRQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzQKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2QXNzZXRQYXkoYXNzZXRJZDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjM2CiAgICAvLyBhc3NlcnQoVHhuLmdyb3VwSW5kZXggPiAwLCBgQXNzZXQgdHhuIG1pc3NpbmdgKTsKICAgIHR4biBHcm91cEluZGV4CiAgICBhc3NlcnQgLy8gQXNzZXQgdHhuIG1pc3NpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czozOQogICAgLy8gY29uc3QgcHJldklkeDogdWludDY0ID0gVHhuLmdyb3VwSW5kZXggLSAxOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDEKICAgIC8vIGNvbnN0IHBheSA9IGd0eG4uQXNzZXRUcmFuc2ZlclR4bihwcmV2SWR4KTsKICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDQKICAgIC8vIGFzc2VydChwYXkuYXNzZXRSZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsIGBBc3NldCBtdXN0IGdvIHRvIGFwcGApOwogICAgZHVwCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBBc3NldCBtdXN0IGdvIHRvIGFwcAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjQ1CiAgICAvLyBhc3NlcnQocGF5LnhmZXJBc3NldC5pZCA9PT0gYXNzZXRJZCwgYFdyb25nIGFzc2V0YCk7CiAgICBkdXAKICAgIGd0eG5zIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIFdyb25nIGFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDgKICAgIC8vIGFzc2VydChwYXkucmVrZXlUbyA9PT0gR2xvYmFsLnplcm9BZGRyZXNzLCBgUmVrZXkgbm90IGFsbG93ZWRgKTsKICAgIGR1cAogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFJla2V5IG5vdCBhbGxvd2VkCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDkKICAgIC8vIGFzc2VydChwYXkuYXNzZXRDbG9zZVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsIGBDbG9zZVRvIG5vdCBhbGxvd2VkYCk7CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0Q2xvc2VUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIENsb3NlVG8gbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo1MAogICAgLy8gcmV0dXJuIHBheS5hc3NldEFtb3VudDsKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6OmdldFByZXZQYXkocmVsVHhJbmRleDogdWludDY0KSAtPiB1aW50NjQ6CmdldFByZXZQYXk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTMKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRQcmV2UGF5KHJlbFR4SW5kZXg6IHVpbnQ2NCk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTQKICAgIC8vIGlmIChUeG4uZ3JvdXBJbmRleCA8IHJlbFR4SW5kZXgpIHJldHVybiAwOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NTYKICAgIC8vIGNvbnN0IHR4SWR4OiB1aW50NjQgPSBUeG4uZ3JvdXBJbmRleCAtIHJlbFR4SW5kZXg7CiAgICB0eG4gR3JvdXBJbmRleAogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU4CiAgICAvLyBpZiAoZ3R4bi5UcmFuc2FjdGlvbih0eElkeCkudHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlLlBheW1lbnQpIHJldHVybiAwOwogICAgZ3R4bnMgVHlwZUVudW0KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzEgLy8gMQogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjU5CiAgICAvLyBjb25zdCBwYXkgPSBndHhuLlBheW1lbnRUeG4odHhJZHgpOwogICAgZnJhbWVfZGlnIDAKICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo2MQogICAgLy8gaWYgKHBheS5yZWNlaXZlciAhPT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpIHJldHVybiAwOwogICAgZnJhbWVfZGlnIDEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgIT0KICAgIGJ6IGdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmdldFByZXZQYXlfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjYzCiAgICAvLyBpZiAocGF5LnJla2V5VG8gIT09IEdsb2JhbC56ZXJvQWRkcmVzcykgcmV0dXJuIDA7CiAgICBmcmFtZV9kaWcgMQogICAgZ3R4bnMgUmVrZXlUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYnogZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDgKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NjQKICAgIC8vIGlmIChwYXkuY2xvc2VSZW1haW5kZXJUbyAhPT0gR2xvYmFsLnplcm9BZGRyZXNzKSByZXR1cm4gMDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBDbG9zZVJlbWFpbmRlclRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBieiBnZXRQcmV2UGF5X2FmdGVyX2lmX2Vsc2VAMTAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZ2V0UHJldlBheV9hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjY2CiAgICAvLyByZXR1cm4gcGF5LmFtb3VudDsKICAgIGZyYW1lX2RpZyAxCiAgICBndHhucyBBbW91bnQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBieXRlcywgY2hhaW5JZDogYnl0ZXMsIG1lc3NlbmdlcjogdWludDY0LCBnYXNPcmFjbGU6IHVpbnQ2NCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBjcmVhdGVBcHBsaWNhdGlvbihvd25lcjogQWRkcmVzcywgY2hhaW5JZDogQnl0ZSwgbWVzc2VuZ2VyOiBBcHBsaWNhdGlvbiwgZ2FzT3JhY2xlOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgcHJvdG8gNCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo5CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxNAogICAgLy8gdGhpcy5nYXNPcmFjbGUudmFsdWUgPSBnYXNPcmFjbGU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM5CiAgICAvLyBwcml2YXRlIHN0b3BBdXRob3JpdHkgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1NAogICAgLy8gdGhpcy5zdG9wQXV0aG9yaXR5LnZhbHVlID0gb3duZXI7CiAgICBmcmFtZV9kaWcgLTQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcwCiAgICAvLyB0aGlzLmNoYWluSWQudmFsdWUgPSBjaGFpbklkOwogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyB0aGlzLm1lc3Nlbmdlci52YWx1ZSA9IG1lc3NlbmdlcjsKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6OkJyaWRnZS5vcHRJbkFzc2V0KGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdm9pZDoKb3B0SW5Bc3NldDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzQKICAgIC8vIG9wdEluQXNzZXQoYXNzZXRJZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NzUKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo4MgogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjgxCiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjc4LTgzCiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IEFzc2V0KGFzc2V0SWQpLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo3OC04NAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgeGZlckFzc2V0OiBBc3NldChhc3NldElkKSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6ODYKICAgIC8vIGxvZygnQnJpZGdlOiBvcHQtaW4gY29tcGxldGVkJyk7CiAgICBwdXNoYnl0ZXMgIkJyaWRnZTogb3B0LWluIGNvbXBsZXRlZCIKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnN3YXBBbmRCcmlkZ2UodG9rZW5JZDogdWludDY0LCByZWNpcGllbnQ6IGJ5dGVzLCBkZXN0aW5hdGlvbkNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMsIGZlZVRva2VuQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CnN3YXBBbmRCcmlkZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjkzLTEwNQogICAgLy8gQGFiaW1ldGhvZCh7CiAgICAvLyAgIGRlZmF1bHRBcmd1bWVudHM6IHsKICAgIC8vICAgICBmZWVUb2tlbkFtb3VudDogeyBjb25zdGFudDogMCB9LAogICAgLy8gICB9LAogICAgLy8gfSkKICAgIC8vIHN3YXBBbmRCcmlkZ2UoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGRlc3RpbmF0aW9uQ2hhaW5JZDogQnl0ZSwKICAgIC8vICAgcmVjZWl2ZVRva2VuOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIG5vbmNlOiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIGZlZVRva2VuQW1vdW50OiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDYgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBjb25zdCBhbW91bnQgPSBnZXRQcmV2QXNzZXRQYXkodG9rZW5JZCk7CiAgICBmcmFtZV9kaWcgLTYKICAgIGNhbGxzdWIgZ2V0UHJldkFzc2V0UGF5CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTA4CiAgICAvLyBhc3NlcnQoYW1vdW50ID4gZmVlVG9rZW5BbW91bnQsICdCcmlkZ2U6IGFtb3VudCB0b28gbG93IGZvciBmZWUnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgPgogICAgYXNzZXJ0IC8vIEJyaWRnZTogYW1vdW50IHRvbyBsb3cgZm9yIGZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMDkKICAgIC8vIGFzc2VydCghcmVjaXBpZW50LmJ5dGVzLmVxdWFscyhiemVybygzMikpLCAnQnJpZGdlOiBicmlkZ2UgdG8gdGhlIHplcm8gYWRkcmVzcycpOwogICAgcHVzaGludCAzMiAvLyAzMgogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNQogICAgPT0KICAgICEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IGJyaWRnZSB0byB0aGUgemVybyBhZGRyZXNzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gY29uc3QgZmVlRnJvbU5hdGl2ZTogdWludDY0ID0gZ2V0UHJldlBheSgyKTsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBjYWxsc3ViIGdldFByZXZQYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQxCiAgICAvLyBpZiAoZmVlVG9rZW5BbW91bnQgPT09IDApIHJldHVybiAwOwogICAgZnJhbWVfZGlnIC0xCiAgICBibnogc3dhcEFuZEJyaWRnZV9hZnRlcl9pZl9lbHNlQDMKICAgIGludGNfMCAvLyAwCgpzd2FwQW5kQnJpZGdlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLl9jb252ZXJ0QnJpZGdpbmdGZWVJblRva2Vuc1RvTmF0aXZlVG9rZW5ANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBjb25zdCBicmlkZ2luZ0ZlZTogdWludDY0ID0gZmVlRnJvbU5hdGl2ZSArIGZlZUZyb21TdGFibGU7CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBkaWcgMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIGVtaXQ8QnJpZGdpbmdGZWVGcm9tVG9rZW5zPih7IGZlZUZyb21OYXRpdmUsIGZlZUZyb21TdGFibGUsIGZlZVN0YWJsZVRva2VuQW1vdW50OiBmZWVUb2tlbkFtb3VudCB9KTsKICAgIHN3YXAKICAgIGl0b2IKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MzZiYWZhZGQgLy8gbWV0aG9kICJCcmlkZ2luZ0ZlZUZyb21Ub2tlbnModWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyBjb25zdCBhbW91bnRBZnRlckZlZTogdWludDY0ID0gYW1vdW50IC0gZmVlVG9rZW5BbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gY29uc3QgdlVzZEFtb3VudCA9IHRoaXMuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZCwgc2VuZGVyLCBhbW91bnRBZnRlckZlZSk7CiAgICBmcmFtZV9kaWcgLTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyBjb25zdCBzZW5kZXIgPSBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTE4CiAgICAvLyBjb25zdCB2VXNkQW1vdW50ID0gdGhpcy5zZW5kQW5kU3dhcFRvVlVzZCh0b2tlbklkLCBzZW5kZXIsIGFtb3VudEFmdGVyRmVlKTsKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzZW5kQW5kU3dhcFRvVlVzZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NgogICAgLy8gY2hhaW5JZCA9IEdsb2JhbFN0YXRlPEJ5dGU+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2hhaW5JZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gYXNzZXJ0KGRlc3RpbmF0aW9uQ2hhaW5JZCAhPT0gdGhpcy5jaGFpbklkLnZhbHVlLCAnQnJpZGdlOiB3cm9uZyBkZXN0aW5hdGlvbiBjaGFpbicpOwogICAgZnJhbWVfZGlnIC00CiAgICAhPQogICAgYXNzZXJ0IC8vIEJyaWRnZTogd3JvbmcgZGVzdGluYXRpb24gY2hhaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzEKICAgIC8vIGFzc2VydCh0aGlzLm90aGVyQnJpZGdlVG9rZW5zKHRoaXMuX2dldE90aGVyQnJpZGdlVG9rZW5zS2V5KGRlc3RpbmF0aW9uQ2hhaW5JZCwgcmVjZWl2ZVRva2VuKSkuZXhpc3RzLCAnQnJpZGdlOiB1bmtub3duIGNoYWluIG9yIHRva2VuJyk7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBCcmlkZ2U6IHVua25vd24gY2hhaW4gb3IgdG9rZW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NTYKICAgIC8vIGNoYWluSWQgPSBHbG9iYWxTdGF0ZTxCeXRlPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gImNoYWluSWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzMKICAgIC8vIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmhhc2hNZXNzYWdlKGFtb3VudCwgcmVjaXBpZW50LCB0aGlzLmNoYWluSWQudmFsdWUsIGRlc3RpbmF0aW9uQ2hhaW5JZCwgcmVjZWl2ZVRva2VuLCBub25jZSk7CiAgICBkaWcgMQogICAgZnJhbWVfZGlnIC01CiAgICB1bmNvdmVyIDIKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaGFzaE1lc3NhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyBjb25zdCBicmlkZ2VUcmFuc2FjdGlvbkNvc3QgPSB0aGlzLmdldFRyYW5zYWN0aW9uQ29zdChkZXN0aW5hdGlvbkNoYWluSWQpOwogICAgZnJhbWVfZGlnIC00CiAgICBjYWxsc3ViIGdldFRyYW5zYWN0aW9uQ29zdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2MQogICAgLy8gc2VudE1lc3NhZ2VzID0gQm94TWFwPFN0YXRpY0J5dGVzPDMyPiwgU3RhdGljQnl0ZXM+KHsga2V5UHJlZml4OiAncycgfSk7CiAgICBwdXNoYnl0ZXMgInMiCiAgICBkaWcgMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE1MgogICAgLy8gYXNzZXJ0KCF0aGlzLnNlbnRNZXNzYWdlcyhtZXNzYWdlKS5leGlzdHMsICdCcmlkZ2U6IHRva2VucyBhbHJlYWR5IHNlbnQnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gQnJpZGdlOiB0b2tlbnMgYWxyZWFkeSBzZW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gdGhpcy5zZW50TWVzc2FnZXMobWVzc2FnZSkudmFsdWUgPSBuZXcgU3RhdGljQnl0ZXMoKTsKICAgIHB1c2hieXRlcyAweAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTYKICAgIC8vIGNvbnN0IGRlc3RpbmF0aW9uQ2hhaW5JZCA9IG1lc3NhZ2UuYXQoMSk7CiAgICBkaWcgMQogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE1Ny0xNjAKICAgIC8vIGNvbnN0IG1lc3NhZ2VDb3N0ID0gYWJpQ2FsbChNZXNzZW5nZXIucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uQ29zdCwgewogICAgLy8gICBhcHBJZDogdGhpcy5tZXNzZW5nZXIudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNTctMTYwCiAgICAvLyBjb25zdCBtZXNzYWdlQ29zdCA9IGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkNvc3QsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRUcmFuc2FjdGlvbkNvc3QoYnl0ZSl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNjQKICAgIC8vIHJlY2VpdmVyOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5hZGRyZXNzLAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBpdHhuLnN1Ym1pdEdyb3VwKHBheW1lbnRQYXJhbXMsIGFwcENhbGxQYXJhbXMpOwogICAgaXR4bl9iZWdpbgogICAgc3dhcAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE2Mi0xNjUKICAgIC8vIGNvbnN0IHBheW1lbnRQYXJhbXMgPSBpdHhuLnBheW1lbnQoewogICAgLy8gICBhbW91bnQ6IG1lc3NhZ2VDb3N0LAogICAgLy8gICByZWNlaXZlcjogdGhpcy5tZXNzZW5nZXIudmFsdWUuYWRkcmVzcywKICAgIC8vIH0pOwogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxNzQKICAgIC8vIGl0eG4uc3VibWl0R3JvdXAocGF5bWVudFBhcmFtcywgYXBwQ2FsbFBhcmFtcyk7CiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTcwCiAgICAvLyBhcmM0Lm1ldGhvZFNlbGVjdG9yKCdzZW5kTWVzc2FnZShieXRlWzMyXSl2b2lkJyksCiAgICBwdXNoYnl0ZXMgMHhhMzI0OTk4OSAvLyBtZXRob2QgInNlbmRNZXNzYWdlKGJ5dGVbMzJdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE2Ny0xNzMKICAgIC8vIGNvbnN0IGFwcENhbGxQYXJhbXMgPSBpdHhuLmFwcGxpY2F0aW9uQ2FsbCh7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIC8vICAgYXBwQXJnczogWwogICAgLy8gICAgIGFyYzQubWV0aG9kU2VsZWN0b3IoJ3NlbmRNZXNzYWdlKGJ5dGVbMzJdKXZvaWQnKSwKICAgIC8vICAgICBtZXNzYWdlLAogICAgLy8gICBdLAogICAgLy8gfSk7CiAgICBpbnRjXzIgLy8gNgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjE3NAogICAgLy8gaXR4bi5zdWJtaXRHcm91cChwYXltZW50UGFyYW1zLCBhcHBDYWxsUGFyYW1zKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzNgogICAgLy8gZW1pdDxSZWNlaXZlRmVlPih7IGJyaWRnZVRyYW5zYWN0aW9uQ29zdCwgbWVzc2FnZVRyYW5zYWN0aW9uQ29zdCB9KTsKICAgIGRpZyAxCiAgICBpdG9iCiAgICBkaWcgMQogICAgaXRvYgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHg0YjU1NDE5YiAvLyBtZXRob2QgIlJlY2VpdmVGZWUodWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzcKICAgIC8vIGFzc2VydChicmlkZ2luZ0ZlZSA+PSBicmlkZ2VUcmFuc2FjdGlvbkNvc3QgKyBtZXNzYWdlVHJhbnNhY3Rpb25Db3N0LCAnQnJpZGdlOiBub3QgZW5vdWdoIGZlZScpOwogICAgKwogICAgdW5jb3ZlciAyCiAgICA8PQogICAgYXNzZXJ0IC8vIEJyaWRnZTogbm90IGVub3VnaCBmZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTM5CiAgICAvLyBhbW91bnQsCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzOC0xNDUKICAgIC8vIGVtaXQ8VG9rZW5zU2VudD4oewogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgZGVzdGluYXRpb25DaGFpbklkLAogICAgLy8gICAgIHJlY2VpdmVUb2tlbiwKICAgIC8vICAgICBub25jZSwKICAgIC8vICAgICBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsCiAgICAvLyAgIH0sCiAgICBmcmFtZV9kaWcgLTUKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY29uc3QgQUxMQlJJREdFX01FU1NFTkdFUiA9IG5ldyBCeXRlKDEpOwogICAgYnl0ZWMgMTEgLy8gMHgwMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMzgtMTQ1CiAgICAvLyBlbWl0PFRva2Vuc1NlbnQ+KHsKICAgIC8vICAgICBhbW91bnQsCiAgICAvLyAgICAgcmVjaXBpZW50LAogICAgLy8gICAgIGRlc3RpbmF0aW9uQ2hhaW5JZCwKICAgIC8vICAgICByZWNlaXZlVG9rZW4sCiAgICAvLyAgICAgbm9uY2UsCiAgICAvLyAgICAgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLAogICAgLy8gICB9LAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjEzOC0xNDYKICAgIC8vIGVtaXQ8VG9rZW5zU2VudD4oewogICAgLy8gICAgIGFtb3VudCwKICAgIC8vICAgICByZWNpcGllbnQsCiAgICAvLyAgICAgZGVzdGluYXRpb25DaGFpbklkLAogICAgLy8gICAgIHJlY2VpdmVUb2tlbiwKICAgIC8vICAgICBub25jZSwKICAgIC8vICAgICBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsCiAgICAvLyAgIH0sCiAgICAvLyApOwogICAgcHVzaGJ5dGVzIDB4MjI5ZmJhZWMgLy8gbWV0aG9kICJUb2tlbnNTZW50KHVpbnQ2NCxieXRlWzMyXSxieXRlLGJ5dGVbMzJdLGJ5dGVbMzJdLGJ5dGUpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKc3dhcEFuZEJyaWRnZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjM0MwogICAgLy8gY29uc3QgZmVlOiB1aW50NjQgPSB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRQcmljZSwgewogICAgZnJhbWVfZGlnIC02CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM2CiAgICAvLyBwcm90ZWN0ZWQgYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3RvciA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdmJyB9KTsKICAgIHB1c2hieXRlcyAiZiIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozNDMKICAgIC8vIGNvbnN0IGZlZTogdWludDY0ID0gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlICogZmVlVG9rZW5BbW91bnQgLyBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0UHJpY2UsIHsKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHN3YXAKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQzLTM0NgogICAgLy8gY29uc3QgZmVlOiB1aW50NjQgPSB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRQcmljZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmNoYWluSWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdhc09yYWNsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjaGFpbklkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzQzLTM0NgogICAgLy8gY29uc3QgZmVlOiB1aW50NjQgPSB0aGlzLmJyaWRnaW5nRmVlQ29udmVyc2lvblNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWUgKiBmZWVUb2tlbkFtb3VudCAvIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRQcmljZSwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFt0aGlzLmNoYWluSWQudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBwdXNoYnl0ZXMgMHgxZGI3MGNkZCAvLyBtZXRob2QgImdldFByaWNlKGJ5dGUpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGZlZUZyb21TdGFibGU6IHVpbnQ2NCA9IHRoaXMuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbih0b2tlbklkLCBmZWVUb2tlbkFtb3VudCk7CiAgICBiIHN3YXBBbmRCcmlkZ2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuX2NvbnZlcnRCcmlkZ2luZ0ZlZUluVG9rZW5zVG9OYXRpdmVUb2tlbkA1CgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnJlY2VpdmVUb2tlbnMoYW1vdW50OiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHNvdXJjZUNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMsIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCkgLT4gdm9pZDoKcmVjZWl2ZVRva2VuczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTc4LTE4NgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZWNlaXZlVG9rZW5zKAogICAgLy8gICBhbW91bnQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBTdGF0aWNCeXRlczwzMj4sCiAgICAvLyAgIHNvdXJjZUNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIHJlY2VpdmVUb2tlbjogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICBub25jZTogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDYgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIG90aGVyQnJpZGdlcyA9IEJveE1hcDxCeXRlLCBTdGF0aWNCeXRlczwzMj4+KHsga2V5UHJlZml4OiAnYicgfSk7CiAgICBwdXNoYnl0ZXMgImIiCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxODgKICAgIC8vIGFzc2VydCh0aGlzLm90aGVyQnJpZGdlcyhzb3VyY2VDaGFpbklkKS5leGlzdHMsICdCcmlkZ2U6IHNvdXJjZSBub3QgcmVnaXN0ZXJlZCcpOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gQnJpZGdlOiBzb3VyY2Ugbm90IHJlZ2lzdGVyZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTg5CiAgICAvLyBjb25zdCB2YWx1ZTogdWludDY0ID0gZ2V0UHJldlBheSgxKTsKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGdldFByZXZQYXkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTkxCiAgICAvLyBhc3NlcnQodmFsdWUgPj0gc3RvcmFnZUZlZSwgJ0JyaWRnZTogbm90IGVub3VnaCBmZWUnKTsKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMjQKICAgIC8vIHJldHVybiAxNTcwMDsKICAgIGludGMgNCAvLyAxNTcwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTEKICAgIC8vIGFzc2VydCh2YWx1ZSA+PSBzdG9yYWdlRmVlLCAnQnJpZGdlOiBub3QgZW5vdWdoIGZlZScpOwogICAgPj0KICAgIGFzc2VydCAvLyBCcmlkZ2U6IG5vdCBlbm91Z2ggZmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU2CiAgICAvLyBjaGFpbklkID0gR2xvYmFsU3RhdGU8Qnl0ZT4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjaGFpbklkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTkzCiAgICAvLyBjb25zdCBtZXNzYWdlID0gdGhpcy5oYXNoTWVzc2FnZShhbW91bnQsIHJlY2lwaWVudCwgc291cmNlQ2hhaW5JZCwgdGhpcy5jaGFpbklkLnZhbHVlLCByZWNlaXZlVG9rZW4sIG5vbmNlKTsKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIHVuY292ZXIgMwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgaGFzaE1lc3NhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo4MAogICAgLy8gY29uc3QgaDogYnl0ZXMgPSBvcC5rZWNjYWsyNTYob3AuY29uY2F0KG1lc3NhZ2UuYnl0ZXMsIHNlbmRlckFkZHJlc3MpKTsKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIGNvbnN0IG1lc3NhZ2VXaXRoU2VuZGVyID0gaGFzaFdpdGhTZW5kZXJBZGRyZXNzKG1lc3NhZ2UsIFR4bi5zZW5kZXIuYnl0ZXMpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjgwCiAgICAvLyBjb25zdCBoOiBieXRlcyA9IG9wLmtlY2NhazI1NihvcC5jb25jYXQobWVzc2FnZS5ieXRlcywgc2VuZGVyQWRkcmVzcykpOwogICAgY29uY2F0CiAgICBrZWNjYWsyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo4MwogICAgLy8gY29uc3QgZmlyc3QyID0gb3Auc3Vic3RyaW5nKG1lc3NhZ2UuYnl0ZXMsIDAsIDIpOwogICAgc3dhcAogICAgc3Vic3RyaW5nIDAgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjg1CiAgICAvLyBjb25zdCBsYXN0MzAgPSBvcC5zdWJzdHJpbmcoaCwgMiwgMzIpOwogICAgc3dhcAogICAgc3Vic3RyaW5nIDIgMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo4OAogICAgLy8gcmV0dXJuIG5ldyBTdGF0aWNCeXRlczwzMj4ob3AuY29uY2F0KGZpcnN0MiwgbGFzdDMwKSk7CiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1OQogICAgLy8gcHJvY2Vzc2VkTWVzc2FnZXMgPSBCb3hNYXA8U3RhdGljQnl0ZXM8MzI+LCBTdGF0aWNCeXRlcz4oeyBrZXlQcmVmaXg6ICdtJyB9KTsKICAgIHB1c2hieXRlcyAibSIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MTk2CiAgICAvLyBhc3NlcnQoIXRoaXMucHJvY2Vzc2VkTWVzc2FnZXMobWVzc2FnZVdpdGhTZW5kZXIpLmV4aXN0cywgJ0JyaWRnZTogbWVzc2FnZSBwcm9jZXNzZWQnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gQnJpZGdlOiBtZXNzYWdlIHByb2Nlc3NlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoxOTgKICAgIC8vIHRoaXMucHJvY2Vzc2VkTWVzc2FnZXMobWVzc2FnZVdpdGhTZW5kZXIpLnZhbHVlID0gbmV3IFN0YXRpY0J5dGVzKCk7CiAgICBwdXNoYnl0ZXMgMHgKICAgIGJveF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjAxLTIwNAogICAgLy8gYXNzZXJ0KGFiaUNhbGwoTWVzc2VuZ2VyLnByb3RvdHlwZS5yZWNlaXZlZE1lc3NhZ2VzLCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLm1lc3Nlbmdlci52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW21lc3NhZ2VXaXRoU2VuZGVyXSwKICAgIC8vIH0pLnJldHVyblZhbHVlLCAnQnJpZGdlOiBubyBtZXNzYWdlJyk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjU3CiAgICAvLyBtZXNzZW5nZXIgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJtZXNzZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMDEtMjA0CiAgICAvLyBhc3NlcnQoYWJpQ2FsbChNZXNzZW5nZXIucHJvdG90eXBlLnJlY2VpdmVkTWVzc2FnZXMsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbbWVzc2FnZVdpdGhTZW5kZXJdLAogICAgLy8gfSkucmV0dXJuVmFsdWUsICdCcmlkZ2U6IG5vIG1lc3NhZ2UnKTsKICAgIHB1c2hieXRlcyAweDMzZTE0N2FhIC8vIG1ldGhvZCAicmVjZWl2ZWRNZXNzYWdlcyhieXRlWzMyXSlib29sIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgYXNzZXJ0IC8vIEJyaWRnZTogbm8gbWVzc2FnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMDYKICAgIC8vIGNvbnN0IHRva2VuSWQ6IHVpbnQ2NCA9IG9wLmV4dHJhY3RVaW50NjQocmVjZWl2ZVRva2VuLmJ5dGVzLCAyNCk7CiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hpbnQgMjQgLy8gMjQKICAgIGV4dHJhY3RfdWludDY0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIwOC0yMTMKICAgIC8vIGNvbnN0IHJlY2VpdmVBbW91bnQgPSB0aGlzLnJlY2VpdmVBbmRTd2FwRnJvbVZVc2QoCiAgICAvLyAgIHRva2VuSWQsCiAgICAvLyAgIHJlY2lwaWVudEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudCwKICAgIC8vICAgcmVjZWl2ZUFtb3VudE1pbiwKICAgIC8vICk7CiAgICBmcmFtZV9kaWcgLTUKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHJlY2VpdmVBbmRTd2FwRnJvbVZVc2QKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjE2CiAgICAvLyBjb25zdCBleHRyYUdhczogdWludDY0ID0gdmFsdWUgLSBzdG9yYWdlRmVlOwogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMyNAogICAgLy8gcmV0dXJuIDE1NzAwOwogICAgaW50YyA0IC8vIDE1NzAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIxNgogICAgLy8gY29uc3QgZXh0cmFHYXM6IHVpbnQ2NCA9IHZhbHVlIC0gc3RvcmFnZUZlZTsKICAgIC0KICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzI0CiAgICAvLyByZXR1cm4gMTU3MDA7CiAgICBpbnRjIDQgLy8gMTU3MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjE3CiAgICAvLyBpZiAodmFsdWUgPiBzdG9yYWdlRmVlKSB7CiAgICA+CiAgICBieiByZWNlaXZlVG9rZW5zX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMTgtMjIxCiAgICAvLyBwYXltZW50KHsKICAgIC8vICAgYW1vdW50OiBleHRyYUdhcywKICAgIC8vICAgcmVjZWl2ZXI6IHJlY2lwaWVudEFkZHJlc3MuYnl0ZXMsCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtNQogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgZnJhbWVfZGlnIDIKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAoKcmVjZWl2ZVRva2Vuc19hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyMwogICAgLy8gZW1pdDxUb2tlbnNSZWNlaXZlZD4oeyByZWNlaXZlQW1vdW50LCByZWNpcGllbnQ6IHJlY2lwaWVudEFkZHJlc3MsIG5vbmNlLCBtZXNzZW5nZXI6IEFMTEJSSURHRV9NRVNTRU5HRVIsIG1lc3NhZ2U6IG1lc3NhZ2VXaXRoU2VuZGVyIH0pOwogICAgZnJhbWVfZGlnIDEKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY29uc3QgQUxMQlJJREdFX01FU1NFTkdFUiA9IG5ldyBCeXRlKDEpOwogICAgYnl0ZWMgMTEgLy8gMHgwMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIGVtaXQ8VG9rZW5zUmVjZWl2ZWQ+KHsgcmVjZWl2ZUFtb3VudCwgcmVjaXBpZW50OiByZWNpcGllbnRBZGRyZXNzLCBub25jZSwgbWVzc2VuZ2VyOiBBTExCUklER0VfTUVTU0VOR0VSLCBtZXNzYWdlOiBtZXNzYWdlV2l0aFNlbmRlciB9KTsKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NDU4MzZhZDYgLy8gbWV0aG9kICJUb2tlbnNSZWNlaXZlZCh1aW50NjQsYWRkcmVzcyxieXRlWzMyXSxieXRlLGJ5dGVbMzJdKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UucmVnaXN0ZXJCcmlkZ2UoY2hhaW5JZDogYnl0ZXMsIGJyaWRnZUFkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpyZWdpc3RlckJyaWRnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjI2LTIyNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZWdpc3RlckJyaWRnZShjaGFpbklkOiBCeXRlLCBicmlkZ2VBZGRyZXNzOiBTdGF0aWNCeXRlczwzMj4pOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMjgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2MwogICAgLy8gb3RoZXJCcmlkZ2VzID0gQm94TWFwPEJ5dGUsIFN0YXRpY0J5dGVzPDMyPj4oeyBrZXlQcmVmaXg6ICdiJyB9KTsKICAgIHB1c2hieXRlcyAiYiIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjIyOQogICAgLy8gdGhpcy5vdGhlckJyaWRnZXMoY2hhaW5JZCkudmFsdWUgPSBicmlkZ2VBZGRyZXNzOwogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuYWRkQnJpZGdlVG9rZW4oY2hhaW5JZDogYnl0ZXMsIHRva2VuQWRkcmVzczogYnl0ZXMpIC0+IHZvaWQ6CmFkZEJyaWRnZVRva2VuOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzItMjMzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGFkZEJyaWRnZVRva2VuKGNoYWluSWQ6IEJ5dGUsIHRva2VuQWRkcmVzczogU3RhdGljQnl0ZXM8MzI+KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyMzUKICAgIC8vIHRoaXMub3RoZXJCcmlkZ2VUb2tlbnModGhpcy5fZ2V0T3RoZXJCcmlkZ2VUb2tlbnNLZXkoY2hhaW5JZCwgdG9rZW5BZGRyZXNzKSkudmFsdWUgPSBuZXcgU3RhdGljQnl0ZXMoKTsKICAgIHB1c2hieXRlcyAweAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLnJlbW92ZUJyaWRnZVRva2VuKGNoYWluSWQ6IGJ5dGVzLCB0b2tlbkFkZHJlc3M6IGJ5dGVzKSAtPiB2b2lkOgpyZW1vdmVCcmlkZ2VUb2tlbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjM4LTIzOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyByZW1vdmVCcmlkZ2VUb2tlbihjaGFpbklkOiBCeXRlLCB0b2tlbkFkZHJlc3M6IFN0YXRpY0J5dGVzPDMyPik6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0MAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gcmV0dXJuIGNoYWluSWQuYnl0ZXMuY29uY2F0KHRva2VuLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6NjYKICAgIC8vIG90aGVyQnJpZGdlVG9rZW5zID0gQm94TWFwPGJ5dGVzLCBTdGF0aWNCeXRlcz4oeyBrZXlQcmVmaXg6ICd0JyB9KTsKICAgIGJ5dGVjIDcgLy8gInQiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQxCiAgICAvLyB0aGlzLm90aGVyQnJpZGdlVG9rZW5zKHRoaXMuX2dldE90aGVyQnJpZGdlVG9rZW5zS2V5KGNoYWluSWQsIHRva2VuQWRkcmVzcykpLmRlbGV0ZSgpOwogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2Uud2l0aGRyYXdHYXNUb2tlbnMoYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CndpdGhkcmF3R2FzVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNDQtMjQ1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHdpdGhkcmF3R2FzVG9rZW5zKGFtb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjQ3CiAgICAvLyBwYXltZW50KHsgYW1vdW50OiBhbW91bnQsIHJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI0NwogICAgLy8gcGF5bWVudCh7IGFtb3VudDogYW1vdW50LCByZWNlaXZlcjogdGhpcy5vd25lci52YWx1ZS5ieXRlcyB9KS5zdWJtaXQoKTsKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2Uud2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zKGFzc2V0SWQ6IHVpbnQ2NCkgLT4gdm9pZDoKd2l0aGRyYXdCcmlkZ2luZ0ZlZUluVG9rZW5zOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTAtMjUxCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHdpdGhkcmF3QnJpZGdpbmdGZWVJblRva2Vucyhhc3NldElkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTQKICAgIC8vIGNvbnN0IGFwcEFjY3Q6IEFjY291bnQgPSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzczsKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjU1CiAgICAvLyBjb25zdCBiYWxhbmNlID0gYXNzZXQuYmFsYW5jZShhcHBBY2N0KTsKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNTYKICAgIC8vIGlmIChiYWxhbmNlID4gVWludDY0KDApKSB7CiAgICBieiB3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnNfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1Ny0yNjIKICAgIC8vIGFzc2V0VHJhbnNmZXIoewogICAgLy8gICBzZW5kZXI6IGFwcEFjY3QsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBiYWxhbmNlLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjYKICAgIC8vIHByb3RlY3RlZCBvd25lciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAib3duZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMQogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgZnJhbWVfZGlnIDAKICAgIGl0eG5fZmllbGQgU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI1Ny0yNjIKICAgIC8vIGFzc2V0VHJhbnNmZXIoewogICAgLy8gICBzZW5kZXI6IGFwcEFjY3QsCiAgICAvLyAgIHhmZXJBc3NldDogYXNzZXQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBiYWxhbmNlLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzCiAgICAvLyB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0Cgp3aXRoZHJhd0JyaWRnaW5nRmVlSW5Ub2tlbnNfYWZ0ZXJfaWZfZWxzZUAzOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo6QnJpZGdlLmdldEJyaWRnaW5nQ29zdEluVG9rZW5zKGRlc3RpbmF0aW9uQ2hhaW5JZDogYnl0ZXMsIHRva2VuSWQ6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRCcmlkZ2luZ0Nvc3RJblRva2VuczoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjY2LTI3MAogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRCcmlkZ2luZ0Nvc3RJblRva2VucygKICAgIC8vICAgZGVzdGluYXRpb25DaGFpbklkOiBCeXRlLAogICAgLy8gICB0b2tlbklkOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gMiAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gY29uc3QgYnJpZGdlR2FzQW1vdW50OiB1aW50NjQgPSB0aGlzLmdldEdhc1VzYWdlKGRlc3RpbmF0aW9uQ2hhaW5JZCk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgZ2V0R2FzVXNhZ2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjcyLTI3NQogICAgLy8gY29uc3QgbWVzc2VuZ2VyR2FzQW1vdW50OiB1aW50NjQgPSBhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUuZ2V0R2FzVXNhZ2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gbWVzc2VuZ2VyID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibWVzc2VuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjcyLTI3NQogICAgLy8gY29uc3QgbWVzc2VuZ2VyR2FzQW1vdW50OiB1aW50NjQgPSBhYmlDYWxsKE1lc3Nlbmdlci5wcm90b3R5cGUuZ2V0R2FzVXNhZ2UsIHsKICAgIC8vICAgYXBwSWQ6IHRoaXMubWVzc2VuZ2VyLnZhbHVlLmlkLAogICAgLy8gICBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJnZXRHYXNVc2FnZShieXRlKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzctMjgwCiAgICAvLyByZXR1cm4gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uR2FzQ29zdEluVVNELCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6OQogICAgLy8gZ2FzT3JhY2xlID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiZ2FzT3JhY2xlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjc5CiAgICAvLyBhcmdzOiBbZGVzdGluYXRpb25DaGFpbklkLCBicmlkZ2VHYXNBbW91bnQgKyBtZXNzZW5nZXJHYXNBbW91bnRdLAogICAgY292ZXIgMgogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyNzctMjgwCiAgICAvLyByZXR1cm4gYWJpQ2FsbChHYXNPcmFjbGUucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uR2FzQ29zdEluVVNELCB7CiAgICAvLyAgIGFwcElkOiB0aGlzLmdhc09yYWNsZS52YWx1ZS5pZCwKICAgIC8vICAgYXJnczogW2Rlc3RpbmF0aW9uQ2hhaW5JZCwgYnJpZGdlR2FzQW1vdW50ICsgbWVzc2VuZ2VyR2FzQW1vdW50XSwKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIHB1c2hieXRlcyAweDdiZjdkNTBjIC8vIG1ldGhvZCAiZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5VU0QoYnl0ZSx1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyODAKICAgIC8vIH0pLnJldHVyblZhbHVlIC8gdGhpcy5mcm9tR2FzT3JhY2xlU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZTsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMwogICAgLy8gcHJvdGVjdGVkIGZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ2UnIH0pOwogICAgcHVzaGJ5dGVzICJlIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gfSkucmV0dXJuVmFsdWUgLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjc3LTI4MAogICAgLy8gcmV0dXJuIGFiaUNhbGwoR2FzT3JhY2xlLnByb3RvdHlwZS5nZXRUcmFuc2FjdGlvbkdhc0Nvc3RJblVTRCwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtkZXN0aW5hdGlvbkNoYWluSWQsIGJyaWRnZUdhc0Ftb3VudCArIG1lc3Nlbmdlckdhc0Ftb3VudF0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZSAvIHRoaXMuZnJvbUdhc09yYWNsZVNjYWxpbmdGYWN0b3IodG9rZW5JZCkudmFsdWU7CiAgICAvCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuaGFzaE1lc3NhZ2UoYW1vdW50OiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHNvdXJjZUNoYWluSWQ6IGJ5dGVzLCBkZXN0aW5hdGlvbkNoYWluSWQ6IGJ5dGVzLCByZWNlaXZlVG9rZW46IGJ5dGVzLCBub25jZTogYnl0ZXMpIC0+IGJ5dGVzOgpoYXNoTWVzc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MjgzLTI5MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBoYXNoTWVzc2FnZSgKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2lwaWVudDogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICBzb3VyY2VDaGFpbklkOiBCeXRlLAogICAgLy8gICBkZXN0aW5hdGlvbkNoYWluSWQ6IEJ5dGUsCiAgICAvLyAgIHJlY2VpdmVUb2tlbjogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gICBub25jZTogU3RhdGljQnl0ZXM8MzI+LAogICAgLy8gKTogU3RhdGljQnl0ZXM8MzI+IHsKICAgIHByb3RvIDYgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTIKICAgIC8vIGNvbnN0IGFtb3VudDMyID0gYnplcm8oMjQpLmNvbmNhdChvcC5pdG9iKGFtb3VudCkpOwogICAgcHVzaGludCAyNCAvLyAyNAogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtNgogICAgaXRvYgogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5MwogICAgLy8gY29uc3Qgc291cmNlQ2hhaW5JZDMyID0gYnplcm8oMzEpLmNvbmNhdChzb3VyY2VDaGFpbklkLmJ5dGVzKTsKICAgIHB1c2hpbnQgMzEgLy8gMzEKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTQKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTQtMjk1CiAgICAvLyBjb25zdCBwYWNrZWQgPSBhbW91bnQzMgogICAgLy8gICAuY29uY2F0KHJlY2lwaWVudC5ieXRlcykKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAtNQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5NC0yOTYKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgLy8gICAuY29uY2F0KHNvdXJjZUNoYWluSWQzMikKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czoyOTQtMjk3CiAgICAvLyBjb25zdCBwYWNrZWQgPSBhbW91bnQzMgogICAgLy8gICAuY29uY2F0KHJlY2lwaWVudC5ieXRlcykKICAgIC8vICAgLmNvbmNhdChzb3VyY2VDaGFpbklkMzIpCiAgICAvLyAgIC5jb25jYXQocmVjZWl2ZVRva2VuLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6Mjk0LTI5OAogICAgLy8gY29uc3QgcGFja2VkID0gYW1vdW50MzIKICAgIC8vICAgLmNvbmNhdChyZWNpcGllbnQuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoc291cmNlQ2hhaW5JZDMyKQogICAgLy8gICAuY29uY2F0KHJlY2VpdmVUb2tlbi5ieXRlcykKICAgIC8vICAgLmNvbmNhdChub25jZS5ieXRlcykKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjb25zdCBBTExCUklER0VfTUVTU0VOR0VSID0gbmV3IEJ5dGUoMSk7CiAgICBieXRlYyAxMSAvLyAweDAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjI5NC0yOTkKICAgIC8vIGNvbnN0IHBhY2tlZCA9IGFtb3VudDMyCiAgICAvLyAgIC5jb25jYXQocmVjaXBpZW50LmJ5dGVzKQogICAgLy8gICAuY29uY2F0KHNvdXJjZUNoYWluSWQzMikKICAgIC8vICAgLmNvbmNhdChyZWNlaXZlVG9rZW4uYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQobm9uY2UuYnl0ZXMpCiAgICAvLyAgIC5jb25jYXQoQUxMQlJJREdFX01FU1NFTkdFUi5ieXRlcyk7CiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzAxCiAgICAvLyBjb25zdCBoYXNoID0gb3Aua2VjY2FrMjU2KHBhY2tlZCk7IC8vIDMyIGJ5dGVzCiAgICBrZWNjYWsyNTYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzA0CiAgICAvLyBjb25zdCB3aXRoU3JjID0gb3Auc2V0Qnl0ZShoYXNoLCAwLCBvcC5idG9pKHNvdXJjZUNoYWluSWQuYnl0ZXMpKTsKICAgIGZyYW1lX2RpZyAtNAogICAgYnRvaQogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIHNldGJ5dGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzA1CiAgICAvLyBjb25zdCB3aXRoRHN0ID0gb3Auc2V0Qnl0ZSh3aXRoU3JjLCAxLCBvcC5idG9pKGRlc3RpbmF0aW9uQ2hhaW5JZC5ieXRlcykpOwogICAgZnJhbWVfZGlnIC0zCiAgICBidG9pCiAgICBpbnRjXzEgLy8gMQogICAgc3dhcAogICAgc2V0Ynl0ZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIHJldHVybiBuZXcgU3RhdGljQnl0ZXM8MzI+KHdpdGhEc3QpOwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkKGNoYWluSWQ6IGJ5dGVzLCB0b2tlbjogYnl0ZXMpIC0+IHVpbnQ2NDoKaXNPdGhlckJyaWRnZVRva2VuU3VwcG9ydGVkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTAtMzExCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIC8vIGlzT3RoZXJCcmlkZ2VUb2tlblN1cHBvcnRlZChjaGFpbklkOiBCeXRlLCB0b2tlbjogU3RhdGljQnl0ZXM8MzI+KTogYm9vbGVhbiB7CiAgICBwcm90byAyIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzM3CiAgICAvLyByZXR1cm4gY2hhaW5JZC5ieXRlcy5jb25jYXQodG9rZW4uYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czo2NgogICAgLy8gb3RoZXJCcmlkZ2VUb2tlbnMgPSBCb3hNYXA8Ynl0ZXMsIFN0YXRpY0J5dGVzPih7IGtleVByZWZpeDogJ3QnIH0pOwogICAgYnl0ZWMgNyAvLyAidCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9icmlkZ2UuY29udHJhY3QuYWxnby50czozMTIKICAgIC8vIHJldHVybiB0aGlzLm90aGVyQnJpZGdlVG9rZW5zKHRoaXMuX2dldE90aGVyQnJpZGdlVG9rZW5zS2V5KGNoYWluSWQsIHRva2VuKSkuZXhpc3RzOwogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2JyaWRnZS5jb250cmFjdC5hbGdvLnRzOjpCcmlkZ2UuZ2V0VHJhbnNhY3Rpb25Db3N0KGNoYWluSWQ6IGJ5dGVzKSAtPiB1aW50NjQ6CmdldFRyYW5zYWN0aW9uQ29zdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE1LTMxNgogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRUcmFuc2FjdGlvbkNvc3QoY2hhaW5JZDogQnl0ZSk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE3CiAgICAvLyByZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQpICsgdGhpcy5nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdCgpOwogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGdldFRyYW5zYWN0aW9uUmVsYXllckNvc3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzMxCiAgICAvLyByZXR1cm4gMTU3MDA7CiAgICBpbnRjIDQgLy8gMTU3MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvYnJpZGdlLmNvbnRyYWN0LmFsZ28udHM6MzE3CiAgICAvLyByZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQpICsgdGhpcy5nZXRTZW5kVHJhbnNhY3Rpb25TdG9yYWdlQ29zdCgpOwogICAgKwogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnN3YXAodG9rZW5JZDogdWludDY0LCByZWNlaXZlVG9rZW5JZDogdWludDY0LCByZWNpcGllbnQ6IGJ5dGVzLCByZWNlaXZlQW1vdW50TWluOiB1aW50NjQpIC0+IHZvaWQ6CnN3YXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjc4LTg0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHN3YXAoCiAgICAvLyAgIHRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjZWl2ZVRva2VuSWQ6IHVpbnQ2NCwKICAgIC8vICAgcmVjaXBpZW50OiBBZGRyZXNzLAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyApOiB2b2lkIHsKICAgIHByb3RvIDQgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo1MAogICAgLy8gY2FuU3dhcCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2MQogICAgLy8gYXNzZXJ0KHRoaXMuY2FuU3dhcC52YWx1ZSwgJ1JvdXRlcjogc3dhcCBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gUm91dGVyOiBzd2FwIHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6ODYKICAgIC8vIGNvbnN0IHNlbmRlciA9IG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4NwogICAgLy8gY29uc3QgYW1vdW50ID0gZ2V0UHJldkFzc2V0UGF5KHRva2VuSWQpOwogICAgZnJhbWVfZGlnIC00CiAgICBjYWxsc3ViIGdldFByZXZBc3NldFBheQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo4OAogICAgLy8gY29uc3QgdlVzZEFtb3VudCA9IHRoaXMuc2VuZEFuZFN3YXBUb1ZVc2QodG9rZW5JZCwgc2VuZGVyLCBhbW91bnQpOwogICAgZnJhbWVfZGlnIC00CiAgICBkaWcgMgogICAgZGlnIDIKICAgIGNhbGxzdWIgc2VuZEFuZFN3YXBUb1ZVc2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6ODkKICAgIC8vIGNvbnN0IHJlY2VpdmVkQW1vdW50ID0gdGhpcy5yZWNlaXZlQW5kU3dhcEZyb21WVXNkKHJlY2VpdmVUb2tlbklkLCByZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4pOwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTIKICAgIHVuY292ZXIgMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHJlY2VpdmVBbmRTd2FwRnJvbVZVc2QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OTAKICAgIC8vIGVtaXQ8U3dhcHBlZD4oeyBzZW5kZXIsIHJlY2lwaWVudCwgdG9rZW5JZCwgcmVjZWl2ZVRva2VuSWQsIGFtb3VudCwgcmVjZWl2ZWRBbW91bnQgfSk7CiAgICBmcmFtZV9kaWcgLTQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMwogICAgaXRvYgogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIHVuY292ZXIgNAogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTU0MDQ0YjMgLy8gbWV0aG9kICJTd2FwcGVkKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5hZGRQb29sKHBvb2xJZDogdWludDY0LCB0b2tlbklkOiB1aW50NjQpIC0+IHZvaWQ6CmFkZFBvb2w6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMC0xMDEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gYWRkUG9vbChwb29sSWQ6IHVpbnQ2NCwgdG9rZW5JZDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAyCiAgICAvLyB0aGlzLm9ubHlPd25lcigpOwogICAgY2FsbHN1YiBvbmx5T3duZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTAzCiAgICAvLyB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlID0gcG9vbElkOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMxCiAgICAvLyBwb29scyA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdwJyB9KTsKICAgIGJ5dGVjIDggLy8gInAiCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwMwogICAgLy8gdGhpcy5wb29scyh0b2tlbklkKS52YWx1ZSA9IHBvb2xJZDsKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDUKICAgIC8vIGNvbnN0IHRva2VuRGVjaW1hbHMgPSBhc3NldC5kZWNpbWFsczsKICAgIGZyYW1lX2RpZyAtMQogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldERlY2ltYWxzCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy1vcmFjbGUuY29udHJhY3QuYWxnby50czo4CiAgICAvLyBleHBvcnQgY29uc3QgT1JBQ0xFX1BSSUNFX1BSRUNJU0lPTjogdWludDY0ID0gOTsKICAgIHB1c2hpbnQgOSAvLyA5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNgogICAgLy8gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzICsgQ0hBSU5fUFJFQ0lTSU9OKTsKICAgIHN3YXAKICAgIC0KICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtb3JhY2xlLmNvbnRyYWN0LmFsZ28udHM6NwogICAgLy8gZXhwb3J0IGNvbnN0IENIQUlOX1BSRUNJU0lPTjogdWludDY0ID0gNjsKICAgIGludGNfMiAvLyA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEwNgogICAgLy8gdGhpcy5icmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzICsgQ0hBSU5fUFJFQ0lTSU9OKTsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzYKICAgIC8vIHByb3RlY3RlZCBicmlkZ2luZ0ZlZUNvbnZlcnNpb25TY2FsaW5nRmFjdG9yID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ2YnIH0pOwogICAgcHVzaGJ5dGVzICJmIgogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMDYKICAgIC8vIHRoaXMuYnJpZGdpbmdGZWVDb252ZXJzaW9uU2NhbGluZ0ZhY3Rvcih0b2tlbklkKS52YWx1ZSA9IDEwICoqIChPUkFDTEVfUFJJQ0VfUFJFQ0lTSU9OIC0gdG9rZW5EZWNpbWFscyArIENIQUlOX1BSRUNJU0lPTik7CiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICB1bmNvdmVyIDIKICAgIGV4cAogICAgaXRvYgogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMwogICAgLy8gcHJvdGVjdGVkIGZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ2UnIH0pOwogICAgcHVzaGJ5dGVzICJlIgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTA3CiAgICAvLyB0aGlzLmZyb21HYXNPcmFjbGVTY2FsaW5nRmFjdG9yKHRva2VuSWQpLnZhbHVlID0gMTAgKiogKE9SQUNMRV9QUklDRV9QUkVDSVNJT04gLSB0b2tlbkRlY2ltYWxzKTsKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHVuY292ZXIgMgogICAgZXhwCiAgICBpdG9iCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIucmVtb3ZlUG9vbCh0b2tlbklkOiB1aW50NjQpIC0+IHZvaWQ6CnJlbW92ZVBvb2w6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjExMC0xMTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gcmVtb3ZlUG9vbCh0b2tlbklkOiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTIKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTMKICAgIC8vIHRoaXMucG9vbHModG9rZW5JZCkuZGVsZXRlKCk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzEKICAgIC8vIHBvb2xzID0gQm94TWFwPHVpbnQ2NCwgdWludDY0Pih7IGtleVByZWZpeDogJ3AnIH0pOwogICAgYnl0ZWMgOCAvLyAicCIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMTMKICAgIC8vIHRoaXMucG9vbHModG9rZW5JZCkuZGVsZXRlKCk7CiAgICBib3hfZGVsCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zdG9wU3dhcCgpIC0+IHZvaWQ6CnN0b3BTd2FwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo2OAogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZS5ieXRlcywgJ1JvdXRlcjogaXMgbm90IHN0b3BBdXRob3JpdHknKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MzkKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NjgKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUuYnl0ZXMsICdSb3V0ZXI6IGlzIG5vdCBzdG9wQXV0aG9yaXR5Jyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIFJvdXRlcjogaXMgbm90IHN0b3BBdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NTAKICAgIC8vIGNhblN3YXAgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsKICAgIGJ5dGVjXzEgLy8gImNhblN3YXAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEyMgogICAgLy8gdGhpcy5jYW5Td2FwLnZhbHVlID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zdGFydFN3YXAoKSAtPiB2b2lkOgpzdGFydFN3YXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzMAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjUwCiAgICAvLyBjYW5Td2FwID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7CiAgICBieXRlY18xIC8vICJjYW5Td2FwIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMzEKICAgIC8vIHRoaXMuY2FuU3dhcC52YWx1ZSA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6OlJvdXRlci5zZXRTdG9wQXV0aG9yaXR5KHN0b3BBdXRob3JpdHk6IGJ5dGVzKSAtPiB2b2lkOgpzZXRTdG9wQXV0aG9yaXR5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxMzctMTM4CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjEzOQogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjM5CiAgICAvLyBwcml2YXRlIHN0b3BBdXRob3JpdHkgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGJ5dGVjIDEwIC8vICJzdG9wQXV0aG9yaXR5IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDAKICAgIC8vIHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZSA9IHN0b3BBdXRob3JpdHk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIuc2V0UmViYWxhbmNlcihyZWJhbGFuY2VyOiBieXRlcykgLT4gdm9pZDoKc2V0UmViYWxhbmNlcjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTQ2LTE0NwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBzZXRSZWJhbGFuY2VyKHJlYmFsYW5jZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo0OQogICAgLy8gcHJpdmF0ZSByZWJhbGFuY2VyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oeyBpbml0aWFsVmFsdWU6IG5ldyBBZGRyZXNzKGJ6ZXJvKDApKSB9KTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNDkKICAgIC8vIHRoaXMucmViYWxhbmNlci52YWx1ZSA9IHJlYmFsYW5jZXI7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjpSb3V0ZXIucmVjZWl2ZUFuZFN3YXBGcm9tVlVzZCh0b2tlbklkOiB1aW50NjQsIHJlY2lwaWVudDogYnl0ZXMsIHZVc2RBbW91bnQ6IHVpbnQ2NCwgcmVjZWl2ZUFtb3VudE1pbjogdWludDY0KSAtPiB1aW50NjQ6CnJlY2VpdmVBbmRTd2FwRnJvbVZVc2Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1Mi0xNTcKICAgIC8vIHByb3RlY3RlZCByZWNlaXZlQW5kU3dhcEZyb21WVXNkKAogICAgLy8gICB0b2tlbklkOiB1aW50NjQsCiAgICAvLyAgIHJlY2lwaWVudDogQWRkcmVzcywKICAgIC8vICAgdlVzZEFtb3VudDogdWludDY0LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gNCAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1OAogICAgLy8gYXNzZXJ0KHRoaXMucG9vbHModG9rZW5JZCkuZXhpc3RzLCAnUm91dGVyOiBubyByZWNlaXZlIHBvb2wnKTsKICAgIGZyYW1lX2RpZyAtNAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czozMQogICAgLy8gcG9vbHMgPSBCb3hNYXA8dWludDY0LCB1aW50NjQ+KHsga2V5UHJlZml4OiAncCcgfSk7CiAgICBieXRlYyA4IC8vICJwIgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE1OAogICAgLy8gYXNzZXJ0KHRoaXMucG9vbHModG9rZW5JZCkuZXhpc3RzLCAnUm91dGVyOiBubyByZWNlaXZlIHBvb2wnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gUm91dGVyOiBubyByZWNlaXZlIHBvb2wKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTU5CiAgICAvLyBjb25zdCBwb29sSWQgPSB0aGlzLnBvb2xzKHRva2VuSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTYwLTE2MwogICAgLy8gcmV0dXJuIGFiaUNhbGwoUG9vbC5wcm90b3R5cGUuc3dhcEZyb21WVXNkLCB7CiAgICAvLyAgIGFwcElkOiBwb29sSWQsCiAgICAvLyAgIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjIKICAgIC8vIGFyZ3M6IFtyZWNpcGllbnQsIHZVc2RBbW91bnQsIHJlY2VpdmVBbW91bnRNaW4sIHJlY2lwaWVudCA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHJlYmFsYW5jZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPih7IGluaXRpYWxWYWx1ZTogbmV3IEFkZHJlc3MoYnplcm8oMCkpIH0pOy8vIGNhbiByZXN0cmljdCBkZXBvc2l0IG9yIHdpdGhkcmF3IG9wZXJhdGlvbnMKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJyZWJhbGFuY2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTYyCiAgICAvLyBhcmdzOiBbcmVjaXBpZW50LCB2VXNkQW1vdW50LCByZWNlaXZlQW1vdW50TWluLCByZWNpcGllbnQgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICBieXRlYyA5IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjAtMTYzCiAgICAvLyByZXR1cm4gYWJpQ2FsbChQb29sLnByb3RvdHlwZS5zd2FwRnJvbVZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3JlY2lwaWVudCwgdlVzZEFtb3VudCwgcmVjZWl2ZUFtb3VudE1pbiwgcmVjaXBpZW50ID09PSB0aGlzLnJlYmFsYW5jZXIudmFsdWVdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBwdXNoYnl0ZXMgMHgwZDFiNGMwNiAvLyBtZXRob2QgInN3YXBGcm9tVlVzZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsYm9vbCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZnJhbWVfZGlnIC0zCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czo6Um91dGVyLnNlbmRBbmRTd2FwVG9WVXNkKHRva2VuSWQ6IHVpbnQ2NCwgdXNlcjogYnl0ZXMsIGFtb3VudDogdWludDY0KSAtPiB1aW50NjQ6CnNlbmRBbmRTd2FwVG9WVXNkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjcKICAgIC8vIHByb3RlY3RlZCBzZW5kQW5kU3dhcFRvVlVzZCh0b2tlbklkOiB1aW50NjQsIHVzZXI6IEFkZHJlc3MsIGFtb3VudDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDMgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNjgKICAgIC8vIGFzc2VydCh0aGlzLnBvb2xzKHRva2VuSWQpLmV4aXN0cywgJ1JvdXRlcjogbm8gcG9vbCcpOwogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjMxCiAgICAvLyBwb29scyA9IEJveE1hcDx1aW50NjQsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdwJyB9KTsKICAgIGJ5dGVjIDggLy8gInAiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTY4CiAgICAvLyBhc3NlcnQodGhpcy5wb29scyh0b2tlbklkKS5leGlzdHMsICdSb3V0ZXI6IG5vIHBvb2wnKTsKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gUm91dGVyOiBubyBwb29sCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE2OQogICAgLy8gY29uc3QgcG9vbElkID0gdGhpcy5wb29scyh0b2tlbklkKS52YWx1ZTsKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHN3YXAKICAgIGFzc2VydCAvLyBCb3ggbXVzdCBoYXZlIHZhbHVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3MS0xNzYKICAgIC8vIGl0eG4uYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdG9rZW5JZCwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgYXNzZXRSZWNlaXZlcjogQXBwbGljYXRpb24ocG9vbElkKS5hZGRyZXNzLAogICAgLy8gfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzQKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHBvb2xJZCkuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6MTcxLTE3NQogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0b2tlbklkLAogICAgLy8gICBhc3NldEFtb3VudDogYW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBBcHBsaWNhdGlvbihwb29sSWQpLmFkZHJlc3MsCiAgICAvLyB9KQogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzEtMTc2CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRva2VuSWQsCiAgICAvLyAgIGFzc2V0QW1vdW50OiBhbW91bnQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IEFwcGxpY2F0aW9uKHBvb2xJZCkuYWRkcmVzcywKICAgIC8vIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3JvdXRlci5hbGdvLnRzOjE3OC0xODEKICAgIC8vIHJldHVybiBhYmlDYWxsKFBvb2wucHJvdG90eXBlLnN3YXBUb1ZVc2QsIHsKICAgIC8vICAgYXBwSWQ6IHBvb2xJZCwKICAgIC8vICAgYXJnczogW3VzZXIsIGFtb3VudCwgdXNlciA9PT0gdGhpcy5yZWJhbGFuY2VyLnZhbHVlXSwKICAgIC8vIH0pLnJldHVyblZhbHVlOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxODAKICAgIC8vIGFyZ3M6IFt1c2VyLCBhbW91bnQsIHVzZXIgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcm91dGVyLmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgcmViYWxhbmNlciA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KHsgaW5pdGlhbFZhbHVlOiBuZXcgQWRkcmVzcyhiemVybygwKSkgfSk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gInJlYmFsYW5jZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxODAKICAgIC8vIGFyZ3M6IFt1c2VyLCBhbW91bnQsIHVzZXIgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICBmcmFtZV9kaWcgLTIKICAgID09CiAgICBieXRlYyA5IC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yb3V0ZXIuYWxnby50czoxNzgtMTgxCiAgICAvLyByZXR1cm4gYWJpQ2FsbChQb29sLnByb3RvdHlwZS5zd2FwVG9WVXNkLCB7CiAgICAvLyAgIGFwcElkOiBwb29sSWQsCiAgICAvLyAgIGFyZ3M6IFt1c2VyLCBhbW91bnQsIHVzZXIgPT09IHRoaXMucmViYWxhbmNlci52YWx1ZV0sCiAgICAvLyB9KS5yZXR1cm5WYWx1ZTsKICAgIHB1c2hieXRlcyAweGQ5NzhhZDE0IC8vIG1ldGhvZCAic3dhcFRvVlVzZChhZGRyZXNzLHVpbnQ2NCxib29sKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBCeXRlcyBoYXMgdmFsaWQgcHJlZml4CiAgICBidG9pCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjpHYXNVc2FnZS5nZXRHYXNVc2FnZShjaGFpbklkOiBieXRlcykgLT4gdWludDY0OgpnZXRHYXNVc2FnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTctMTgKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gZ2V0R2FzVXNhZ2UoY2hhaW5JZDogQnl0ZSk6IHVpbnQ2NCB7CiAgICBwcm90byAxIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTAKICAgIC8vIGdhc1VzYWdlID0gQm94TWFwPEJ5dGUsIHVpbnQ2ND4oeyBrZXlQcmVmaXg6ICdnJyB9KTsKICAgIGJ5dGVjIDEyIC8vICJnIgogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MTkKICAgIC8vIHJldHVybiB0aGlzLmdhc1VzYWdlKGNoYWluSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6Okdhc1VzYWdlLnNldEdhc1VzYWdlKGNoYWluSWQ6IGJ5dGVzLCBnYXNBbW91bnQ6IHVpbnQ2NCkgLT4gdm9pZDoKc2V0R2FzVXNhZ2U6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjIyLTIzCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldEdhc1VzYWdlKGNoYWluSWQ6IEJ5dGUsIGdhc0Ftb3VudDogdWludDY0KTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MjQKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoxMAogICAgLy8gZ2FzVXNhZ2UgPSBCb3hNYXA8Qnl0ZSwgdWludDY0Pih7IGtleVByZWZpeDogJ2cnIH0pOwogICAgYnl0ZWMgMTIgLy8gImciCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czoyNQogICAgLy8gdGhpcy5nYXNVc2FnZShjaGFpbklkKS52YWx1ZSA9IGdhc0Ftb3VudDsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2Uuc2V0R2FzT3JhY2xlKGdhc09yYWNsZTogdWludDY0KSAtPiB2b2lkOgpzZXRHYXNPcmFjbGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjI4LTI5CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIHNldEdhc09yYWNsZShnYXNPcmFjbGU6IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzAKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo5CiAgICAvLyBnYXNPcmFjbGUgPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oKTsKICAgIGJ5dGVjIDQgLy8gImdhc09yYWNsZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzEKICAgIC8vIHRoaXMuZ2FzT3JhY2xlLnZhbHVlID0gZ2FzT3JhY2xlOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czo6R2FzVXNhZ2UuZ2V0VHJhbnNhY3Rpb25SZWxheWVyQ29zdChjaGFpbklkOiBieXRlcykgLT4gdWludDY0OgpnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9nYXMtdXNhZ2UuYWxnby50czozNC0zNQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICAvLyBnZXRUcmFuc2FjdGlvblJlbGF5ZXJDb3N0KGNoYWluSWQ6IEJ5dGUpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjEwCiAgICAvLyBnYXNVc2FnZSA9IEJveE1hcDxCeXRlLCB1aW50NjQ+KHsga2V5UHJlZml4OiAnZycgfSk7CiAgICBieXRlYyAxMiAvLyAiZyIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM2CiAgICAvLyBjb25zdCBnYXNBbW91bnQgPSB0aGlzLmdhc1VzYWdlKGNoYWluSWQpLnZhbHVlOwogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgc3dhcAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzctNDAKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5OYXRpdmVUb2tlbiwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtjaGFpbklkLCBnYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjkKICAgIC8vIGdhc09yYWNsZSA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImdhc09yYWNsZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL2dhcy11c2FnZS5hbGdvLnRzOjM5CiAgICAvLyBhcmdzOiBbY2hhaW5JZCwgZ2FzQW1vdW50XSwKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvZ2FzLXVzYWdlLmFsZ28udHM6MzctNDAKICAgIC8vIHJldHVybiBhYmlDYWxsKEdhc09yYWNsZS5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb25HYXNDb3N0SW5OYXRpdmVUb2tlbiwgewogICAgLy8gICBhcHBJZDogdGhpcy5nYXNPcmFjbGUudmFsdWUuaWQsCiAgICAvLyAgIGFyZ3M6IFtjaGFpbklkLCBnYXNBbW91bnRdLAogICAgLy8gfSkucmV0dXJuVmFsdWU7CiAgICBwdXNoYnl0ZXMgMHhjMmFmY2NkMSAvLyBtZXRob2QgImdldFRyYW5zYWN0aW9uR2FzQ29zdEluTmF0aXZlVG9rZW4oYnl0ZSx1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6Ok93bmFibGUub25seU93bmVyKCkgLT4gdm9pZDoKb25seU93bmVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTMKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLCAnT25seSBvd25lcicpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgb3duZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjpPd25hYmxlLnRyYW5zZmVyT3duZXJzaGlwKG5ld093bmVyOiBieXRlcykgLT4gdm9pZDoKdHJhbnNmZXJPd25lcnNoaXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNi0xNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGJ5dGVjXzMgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTkKICAgIC8vIHRoaXMub3duZXIudmFsdWUgPSBuZXdPd25lcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1Ygo=",clear:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},byteCode:{approval:"CiAFAAEGBNR6JhAEFR98dQdjYW5Td2FwCW1lc3NlbmdlcgVvd25lcglnYXNPcmFjbGUHY2hhaW5JZApyZWJhbGFuY2VyAXQBcAEADXN0b3BBdXRob3JpdHkBAQFnBENBeqME90dbggwVH3x1AAAAAAAAPVQxGEAACSKvJwZMZykjZzEbQQDJgg0E//goQQRl9wVzBOg6h6sELJ9oRwQxkZsoBE66ByEExhftcwRXUxVgBGOAgngEBlB8agT1+W6zBEsGLKAEw83ZKicNggkEB9+EKQSAxccPBPqxEaIE7xX4VQRrHuIjBBhwpJIENVcyTQQEsWHxBNKzV+snDoIEBAylrnoEOXuRiwTL/G0CBOF7r7Q2GgCOHAIFAfUB7AHMAawBmgGIAXYBZgFWAT4BGwD/AOsA3wDTALgApACUAIgAfABtAF4ASgA3ACUAEQACIkMxGRREMRhENhoBiAgcI0MxGRREMRhENhoBiAfJFihMULAjQzEZFEQxGEQ2GgEXwDKIB6YjQzEZFEQxGEQ2GgE2GgIXiAeDI0MxGRREMRhENhoBiAdmFihMULAjQzEZFEQxGEQ2GgGIBosjQzEZFEQxGEQ2GgGIBnAjQzEZFEQxGESIBl0jQzEZFEQxGESIBkQjQzEZFEQxGEQ2GgEXiAYkI0MxGRREMRhENhoBFzYaAheIBdcjQzEZFEQxGEQ2GgEXNhoCFzYaAzYaBBeIBXMjQzEZFEQxGEQnD7AjQzEZFEQxGEQnD7AjQzEZFEQxGEQ2GgGIBUAWKExQsCNDMRkURDEYRDYaATYaAogFGScJIk8CVChMULAjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGiAS9KExQsCNDMRkURDEYRDYaATYaAheIBDwWKExQsCNDMRkURDEYRDYaAReIA/cjQzEZFEQxGEQ2GgEXiAPOI0MxGRREMRhENhoBNhoCiAOqI0MxGRREMRhENhoBNhoCiAOFI0MxGRREMRhENhoBNhoCiANjI0MxGRREMRhENhoBFzYaAjYaAzYaBDYaBTYaBheIAokjQzEZFEQxGEQ2GgEXNhoCNhoDNhoENhoFNhoGF4gBFyNDMRkURDEYRCNDMRkURDEYRDYaAReIAMkjQzEZFEQxGBRENhoBNhoCNhoDF8AyNhoEF8AyiACPI0OKAQExFkQxFiMJSTgQJRJESTgUMgoSREk4EYv/EkRJOCAyAxJESTgVMgMSRDgSiYoBAYAASTEWi/8MQQAEIowAiTEWi/8JSYwBOBBJjAAjE0EABCKMAImLACMSRIsBOAcyChNBAAQijACJiwE4IDIDE0EABCKMAImLATgJMgMTQQAEIowAiYsBOAiMAImKBAAri/xnJwSL/2cnCov8ZycFi/1nKov+Z4mKAQCIBVCxMgqyFCKyEov/shElshAisgGzgBhCcmlkZ2U6IG9wdC1pbiBjb21wbGV0ZWSwiYoGACIpZUREi/qI/xZJi/8NRIEgr4v7EhREgQKI/zOL/0AA7iKLAUlLAghMFk8CFov/Fk4CUExQgAQ2uvrdTFCwiwCL/wmL+jEATwKIBAgiJwVlRIv8E0SL/Iv9UCcHTFC9RQFEIicFZURLAYv7TwKL/Iv9i/6IAnuL/IgCuYABc0sCUEm9RQEURIAAv0sBVwEBsSIqZUQnDbIashiyGiSyECKyAbO0PklXBABMVwAEKBJEFyIqZURyCEQiKmVEsUyyB0sBsggjshAisgG2gASjJJmJshpPA7IashgkshAisgGzSwEWSwEWUIAES1VBm0xQsAhPAg5EFov7UIv8UIv9UIv+UCcLUIAEIp+67ExQsImL+haAAWZMUL5MF0xEi/8LsSInBGVEIicFZUSABB23DN2yGrIashgkshAisgGztD5JVwQATFcABCgSRBcKQv7TigYAIillRESAAWKL/FC9RQFEI4j96kkhBA9EIicFZUSL+ov7i/xPA4v9i/6IAXNJMQBQAkxRAAJMUQIgUElOAoABbUsBUEm9RQEURIAAv7EiKmVEgAQz4UeqshqyGLIaJLIQIrIBs7Q+SVcEAExXAAQoEkQiU0SL/YEYW4v7i/qL/4gCKkxJIQQJTCEEDUEAELGL+7IHiwKyCCOyECKyAbOLARaL+1CL/lAnC1CLAFCABEWDatZMULCJigIAiAMPgAFii/5Qi/+/iYoCAIgC/4v+i/9QJwdMUIAAv4mKAgCIAuyL/ov/UCcHTFC8SImKAQCIAtqxIitlRLIHi/+yCCOyECKyAbOJigEAiALBMgpJi/9wAExJTwJEQQAasSIrZUSyFIsBshKL/7IRiwCyACWyECKyAbOJigIBi/6IAiqxIiplRCcOshqL/rIashgkshAisgGztD5JVwQATFcABCgSRBexIicEZUROAggWgAR799UMshqL/rIashqyGCSyECKyAbO0PklXBABMVwAEKBJEF4v/FoABZUxQvkwXTEQKiYoGAYEYr4v6FlCBH6+L/FBMi/tQTFCL/lCL/1AnC1ACi/wXIkxWi/0XI0xWSRWBIBJEiYoCAYv+i/9QJwdMUL1FAYmKAQGL/4gBpyEECImKBAAiKWVERDEAi/yI+9GL/EsCSwKIAPyL/Yv+TwKL/4gAm4v8Fov9Fk8DFk8DFk8Ei/5QTwRQTwNQTwJQTFCABBVARLNMULCJigIAiAGPi/8WJwhLAVCL/ha/i/9xAUSBCUwJSSQIgAFmSwNQgQpPApQWv4ABZU8CUIEKTwKUFr+JigEAiAFWi/8WJwhMULxIiTEAIicKZUQSRCkiZ4mIATwpI2eJigEAiAEyJwqL/2eJigEAiAEmJwaL/2eJigQBi/wWJwhMUEm9RQFEvkwXTESxi/4Wi/8WIicGZUSL/RInCSJPAlSABA0bTAayGov9shpPArIaTLIashqyGCSyECKyAbO0PklXBABMVwAEKBJEF4mKAwGL/RYnCExQSb1FAUS+TBdMRLFJcghEshSL/7ISi/2yESWyECKyAbOxi/8WIicGZUSL/hInCSJPAlSABNl4rRSyGov+shpMshqyGrIYJLIQIrIBs7Q+SVcEAExXAAQoEkQXiYoBAScMi/9QvkwXTESJigIAiABRJwyL/lCL/xa/iYoBAIgAQScEi/9niYoBAScMi/9QvkwXTESxIicEZURMFoAEwq/M0bIai/+yGrIashgkshAisgGztD5JVwQATFcABCgSRBeJMQAiK2VEEkSJigEAiP/xK4v/Z4k=",clear:"CoEBQw=="},events:[{name:"BridgingFeeFromTokens",args:[{type:"uint64",name:"feeFromNative"},{type:"uint64",name:"feeFromStable"},{type:"uint64",name:"feeStableTokenAmount"}]},{name:"ReceiveFee",args:[{type:"uint64",name:"bridgeTransactionCost"},{type:"uint64",name:"messageTransactionCost"}]},{name:"TokensSent",args:[{type:"uint64",name:"amount"},{type:"byte[32]",name:"recipient"},{type:"byte",name:"destinationChainId"},{type:"byte[32]",name:"receiveToken"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"}]},{name:"TokensReceived",args:[{type:"uint64",name:"receiveAmount"},{type:"address",name:"recipient"},{type:"byte[32]",name:"nonce"},{type:"byte",name:"messenger"},{type:"byte[32]",name:"message"}]},{name:"Swapped",args:[{type:"address",name:"sender"},{type:"address",name:"recipient"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"receiveTokenId"},{type:"uint64",name:"amount"},{type:"uint64",name:"receivedAmount"}]}],templateVariables:{}};var b=class r{static get create(){return{_resolveByMethod(i){switch(i.method){case"createApplication":case"createApplication(address,byte,application,application)void":return r.create.createApplication(i)}throw new Error("Unknown ' + verb + ' method")},createApplication(i){return{...i,method:"createApplication(address,byte,application,application)void",args:Array.isArray(i.args)?i.args:[i.args.owner,i.args.chainId,i.args.messenger,i.args.gasOracle]}}}}static optInAsset(i){return{...i,method:"optInAsset(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.assetId]}}static noop(i){return{...i,method:"noop()void",args:Array.isArray(i.args)?i.args:[]}}static swapAndBridge(i){return{...i,method:"swapAndBridge(uint64,byte[32],byte,byte[32],byte[32],uint64)void",args:Array.isArray(i.args)?i.args:[i.args.tokenId,i.args.recipient,i.args.destinationChainId,i.args.receiveToken,i.args.nonce,i.args.feeTokenAmount]}}static receiveTokens(i){return{...i,method:"receiveTokens(uint64,byte[32],byte,byte[32],byte[32],uint64)void",args:Array.isArray(i.args)?i.args:[i.args.amount,i.args.recipient,i.args.sourceChainId,i.args.receiveToken,i.args.nonce,i.args.receiveAmountMin]}}static registerBridge(i){return{...i,method:"registerBridge(byte,byte[32])void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.bridgeAddress]}}static addBridgeToken(i){return{...i,method:"addBridgeToken(byte,byte[32])void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.tokenAddress]}}static removeBridgeToken(i){return{...i,method:"removeBridgeToken(byte,byte[32])void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.tokenAddress]}}static withdrawGasTokens(i){return{...i,method:"withdrawGasTokens(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.amount]}}static withdrawBridgingFeeInTokens(i){return{...i,method:"withdrawBridgingFeeInTokens(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.assetId]}}static getBridgingCostInTokens(i){return{...i,method:"getBridgingCostInTokens(byte,uint64)uint64",args:Array.isArray(i.args)?i.args:[i.args.destinationChainId,i.args.tokenId]}}static hashMessage(i){return{...i,method:"hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]",args:Array.isArray(i.args)?i.args:[i.args.amount,i.args.recipient,i.args.sourceChainId,i.args.destinationChainId,i.args.receiveToken,i.args.nonce]}}static isOtherBridgeTokenSupported(i){return{...i,method:"isOtherBridgeTokenSupported(byte,byte[32])bool",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.token]}}static getTransactionCost(i){return{...i,method:"getTransactionCost(byte)uint64",args:Array.isArray(i.args)?i.args:[i.args.chainId]}}static getReceiveTokensCost(i){return{...i,method:"getReceiveTokensCost()uint64",args:Array.isArray(i.args)?i.args:[]}}static getSendTransactionStorageCost(i){return{...i,method:"getSendTransactionStorageCost()uint64",args:Array.isArray(i.args)?i.args:[]}}static swap(i){return{...i,method:"swap(uint64,uint64,address,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.tokenId,i.args.receiveTokenId,i.args.recipient,i.args.receiveAmountMin]}}static addPool(i){return{...i,method:"addPool(uint64,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.poolId,i.args.tokenId]}}static removePool(i){return{...i,method:"removePool(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.tokenId]}}static stopSwap(i){return{...i,method:"stopSwap()void",args:Array.isArray(i.args)?i.args:[]}}static startSwap(i){return{...i,method:"startSwap()void",args:Array.isArray(i.args)?i.args:[]}}static setStopAuthority(i){return{...i,method:"setStopAuthority(address)void",args:Array.isArray(i.args)?i.args:[i.args.stopAuthority]}}static setRebalancer(i){return{...i,method:"setRebalancer(address)void",args:Array.isArray(i.args)?i.args:[i.args.rebalancer]}}static getGasUsage(i){return{...i,method:"getGasUsage(byte)uint64",args:Array.isArray(i.args)?i.args:[i.args.chainId]}}static setGasUsage(i){return{...i,method:"setGasUsage(byte,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.chainId,i.args.gasAmount]}}static setGasOracle(i){return{...i,method:"setGasOracle(application)void",args:Array.isArray(i.args)?i.args:[i.args.gasOracle]}}static getTransactionRelayerCost(i){return{...i,method:"getTransactionRelayerCost(byte)uint64",args:Array.isArray(i.args)?i.args:[i.args.chainId]}}static transferOwnership(i){return{...i,method:"transferOwnership(address)void",args:Array.isArray(i.args)?i.args:[i.args.newOwner]}}};var Gn=class r{appClient;constructor(i){this.appClient=i instanceof Fn?i:new Fn({...i,appSpec:Zn})}decodeReturnValue(i,a){return a!==void 0?Br(a,this.appClient.getABIMethod(i),Zn.structs):void 0}static async fromCreatorAndName(i){return new r(await Fn.fromCreatorAndName({...i,appSpec:Zn}))}static async fromNetwork(i){return new r(await Fn.fromNetwork({...i,appSpec:Zn}))}get appId(){return this.appClient.appId}get appAddress(){return this.appClient.appAddress}get appName(){return this.appClient.appName}get appSpec(){return this.appClient.appSpec}get algorand(){return this.appClient.algorand}params={clearState:i=>this.appClient.params.bare.clearState(i),optInAsset:i=>this.appClient.params.call(b.optInAsset(i)),noop:(i={args:[]})=>this.appClient.params.call(b.noop(i)),swapAndBridge:i=>this.appClient.params.call(b.swapAndBridge(i)),receiveTokens:i=>this.appClient.params.call(b.receiveTokens(i)),registerBridge:i=>this.appClient.params.call(b.registerBridge(i)),addBridgeToken:i=>this.appClient.params.call(b.addBridgeToken(i)),removeBridgeToken:i=>this.appClient.params.call(b.removeBridgeToken(i)),withdrawGasTokens:i=>this.appClient.params.call(b.withdrawGasTokens(i)),withdrawBridgingFeeInTokens:i=>this.appClient.params.call(b.withdrawBridgingFeeInTokens(i)),getBridgingCostInTokens:i=>this.appClient.params.call(b.getBridgingCostInTokens(i)),hashMessage:i=>this.appClient.params.call(b.hashMessage(i)),isOtherBridgeTokenSupported:i=>this.appClient.params.call(b.isOtherBridgeTokenSupported(i)),getTransactionCost:i=>this.appClient.params.call(b.getTransactionCost(i)),getReceiveTokensCost:(i={args:[]})=>this.appClient.params.call(b.getReceiveTokensCost(i)),getSendTransactionStorageCost:(i={args:[]})=>this.appClient.params.call(b.getSendTransactionStorageCost(i)),swap:i=>this.appClient.params.call(b.swap(i)),addPool:i=>this.appClient.params.call(b.addPool(i)),removePool:i=>this.appClient.params.call(b.removePool(i)),stopSwap:(i={args:[]})=>this.appClient.params.call(b.stopSwap(i)),startSwap:(i={args:[]})=>this.appClient.params.call(b.startSwap(i)),setStopAuthority:i=>this.appClient.params.call(b.setStopAuthority(i)),setRebalancer:i=>this.appClient.params.call(b.setRebalancer(i)),getGasUsage:i=>this.appClient.params.call(b.getGasUsage(i)),setGasUsage:i=>this.appClient.params.call(b.setGasUsage(i)),setGasOracle:i=>this.appClient.params.call(b.setGasOracle(i)),getTransactionRelayerCost:i=>this.appClient.params.call(b.getTransactionRelayerCost(i)),transferOwnership:i=>this.appClient.params.call(b.transferOwnership(i))};createTransaction={clearState:i=>this.appClient.createTransaction.bare.clearState(i),optInAsset:i=>this.appClient.createTransaction.call(b.optInAsset(i)),noop:(i={args:[]})=>this.appClient.createTransaction.call(b.noop(i)),swapAndBridge:i=>this.appClient.createTransaction.call(b.swapAndBridge(i)),receiveTokens:i=>this.appClient.createTransaction.call(b.receiveTokens(i)),registerBridge:i=>this.appClient.createTransaction.call(b.registerBridge(i)),addBridgeToken:i=>this.appClient.createTransaction.call(b.addBridgeToken(i)),removeBridgeToken:i=>this.appClient.createTransaction.call(b.removeBridgeToken(i)),withdrawGasTokens:i=>this.appClient.createTransaction.call(b.withdrawGasTokens(i)),withdrawBridgingFeeInTokens:i=>this.appClient.createTransaction.call(b.withdrawBridgingFeeInTokens(i)),getBridgingCostInTokens:i=>this.appClient.createTransaction.call(b.getBridgingCostInTokens(i)),hashMessage:i=>this.appClient.createTransaction.call(b.hashMessage(i)),isOtherBridgeTokenSupported:i=>this.appClient.createTransaction.call(b.isOtherBridgeTokenSupported(i)),getTransactionCost:i=>this.appClient.createTransaction.call(b.getTransactionCost(i)),getReceiveTokensCost:(i={args:[]})=>this.appClient.createTransaction.call(b.getReceiveTokensCost(i)),getSendTransactionStorageCost:(i={args:[]})=>this.appClient.createTransaction.call(b.getSendTransactionStorageCost(i)),swap:i=>this.appClient.createTransaction.call(b.swap(i)),addPool:i=>this.appClient.createTransaction.call(b.addPool(i)),removePool:i=>this.appClient.createTransaction.call(b.removePool(i)),stopSwap:(i={args:[]})=>this.appClient.createTransaction.call(b.stopSwap(i)),startSwap:(i={args:[]})=>this.appClient.createTransaction.call(b.startSwap(i)),setStopAuthority:i=>this.appClient.createTransaction.call(b.setStopAuthority(i)),setRebalancer:i=>this.appClient.createTransaction.call(b.setRebalancer(i)),getGasUsage:i=>this.appClient.createTransaction.call(b.getGasUsage(i)),setGasUsage:i=>this.appClient.createTransaction.call(b.setGasUsage(i)),setGasOracle:i=>this.appClient.createTransaction.call(b.setGasOracle(i)),getTransactionRelayerCost:i=>this.appClient.createTransaction.call(b.getTransactionRelayerCost(i)),transferOwnership:i=>this.appClient.createTransaction.call(b.transferOwnership(i))};send={clearState:i=>this.appClient.send.bare.clearState(i),optInAsset:async i=>{let a=await this.appClient.send.call(b.optInAsset(i));return{...a,return:a.return}},noop:async(i={args:[]})=>{let a=await this.appClient.send.call(b.noop(i));return{...a,return:a.return}},swapAndBridge:async i=>{let a=await this.appClient.send.call(b.swapAndBridge(i));return{...a,return:a.return}},receiveTokens:async i=>{let a=await this.appClient.send.call(b.receiveTokens(i));return{...a,return:a.return}},registerBridge:async i=>{let a=await this.appClient.send.call(b.registerBridge(i));return{...a,return:a.return}},addBridgeToken:async i=>{let a=await this.appClient.send.call(b.addBridgeToken(i));return{...a,return:a.return}},removeBridgeToken:async i=>{let a=await this.appClient.send.call(b.removeBridgeToken(i));return{...a,return:a.return}},withdrawGasTokens:async i=>{let a=await this.appClient.send.call(b.withdrawGasTokens(i));return{...a,return:a.return}},withdrawBridgingFeeInTokens:async i=>{let a=await this.appClient.send.call(b.withdrawBridgingFeeInTokens(i));return{...a,return:a.return}},getBridgingCostInTokens:async i=>{let a=await this.appClient.send.call(b.getBridgingCostInTokens(i));return{...a,return:a.return}},hashMessage:async i=>{let a=await this.appClient.send.call(b.hashMessage(i));return{...a,return:a.return}},isOtherBridgeTokenSupported:async i=>{let a=await this.appClient.send.call(b.isOtherBridgeTokenSupported(i));return{...a,return:a.return}},getTransactionCost:async i=>{let a=await this.appClient.send.call(b.getTransactionCost(i));return{...a,return:a.return}},getReceiveTokensCost:async(i={args:[]})=>{let a=await this.appClient.send.call(b.getReceiveTokensCost(i));return{...a,return:a.return}},getSendTransactionStorageCost:async(i={args:[]})=>{let a=await this.appClient.send.call(b.getSendTransactionStorageCost(i));return{...a,return:a.return}},swap:async i=>{let a=await this.appClient.send.call(b.swap(i));return{...a,return:a.return}},addPool:async i=>{let a=await this.appClient.send.call(b.addPool(i));return{...a,return:a.return}},removePool:async i=>{let a=await this.appClient.send.call(b.removePool(i));return{...a,return:a.return}},stopSwap:async(i={args:[]})=>{let a=await this.appClient.send.call(b.stopSwap(i));return{...a,return:a.return}},startSwap:async(i={args:[]})=>{let a=await this.appClient.send.call(b.startSwap(i));return{...a,return:a.return}},setStopAuthority:async i=>{let a=await this.appClient.send.call(b.setStopAuthority(i));return{...a,return:a.return}},setRebalancer:async i=>{let a=await this.appClient.send.call(b.setRebalancer(i));return{...a,return:a.return}},getGasUsage:async i=>{let a=await this.appClient.send.call(b.getGasUsage(i));return{...a,return:a.return}},setGasUsage:async i=>{let a=await this.appClient.send.call(b.setGasUsage(i));return{...a,return:a.return}},setGasOracle:async i=>{let a=await this.appClient.send.call(b.setGasOracle(i));return{...a,return:a.return}},getTransactionRelayerCost:async i=>{let a=await this.appClient.send.call(b.getTransactionRelayerCost(i));return{...a,return:a.return}},transferOwnership:async i=>{let a=await this.appClient.send.call(b.transferOwnership(i));return{...a,return:a.return}}};clone(i){return new r(this.appClient.clone(i))}async getBridgingCostInTokens(i){return(await this.appClient.send.call(b.getBridgingCostInTokens(i))).return}async hashMessage(i){return(await this.appClient.send.call(b.hashMessage(i))).return}async isOtherBridgeTokenSupported(i){return(await this.appClient.send.call(b.isOtherBridgeTokenSupported(i))).return}async getTransactionCost(i){return(await this.appClient.send.call(b.getTransactionCost(i))).return}async getReceiveTokensCost(i={args:[]}){return(await this.appClient.send.call(b.getReceiveTokensCost(i))).return}async getSendTransactionStorageCost(i={args:[]}){return(await this.appClient.send.call(b.getSendTransactionStorageCost(i))).return}async getGasUsage(i){return(await this.appClient.send.call(b.getGasUsage(i))).return}async getTransactionRelayerCost(i){return(await this.appClient.send.call(b.getTransactionRelayerCost(i))).return}state={global:{getAll:async()=>{let i=await this.appClient.state.global.getAll();return{chainId:i.chainId,messenger:i.messenger,stopAuthority:i.stopAuthority,rebalancer:i.rebalancer,canSwap:i.canSwap,gasOracle:i.gasOracle,owner:i.owner}},chainId:async()=>await this.appClient.state.global.getValue("chainId"),messenger:async()=>await this.appClient.state.global.getValue("messenger"),stopAuthority:async()=>await this.appClient.state.global.getValue("stopAuthority"),rebalancer:async()=>await this.appClient.state.global.getValue("rebalancer"),canSwap:async()=>await this.appClient.state.global.getValue("canSwap"),gasOracle:async()=>await this.appClient.state.global.getValue("gasOracle"),owner:async()=>await this.appClient.state.global.getValue("owner")},box:{getAll:async()=>{let i=await this.appClient.state.box.getAll();return{}},processedMessages:{getMap:async()=>await this.appClient.state.box.getMap("processedMessages"),value:async i=>await this.appClient.state.box.getMapValue("processedMessages",i)},sentMessages:{getMap:async()=>await this.appClient.state.box.getMap("sentMessages"),value:async i=>await this.appClient.state.box.getMapValue("sentMessages",i)},otherBridges:{getMap:async()=>await this.appClient.state.box.getMap("otherBridges"),value:async i=>await this.appClient.state.box.getMapValue("otherBridges",i)},otherBridgeTokens:{getMap:async()=>await this.appClient.state.box.getMap("otherBridgeTokens"),value:async i=>await this.appClient.state.box.getMapValue("otherBridgeTokens",i)},pools:{getMap:async()=>await this.appClient.state.box.getMap("pools"),value:async i=>await this.appClient.state.box.getMapValue("pools",i)},fromGasOracleScalingFactor:{getMap:async()=>await this.appClient.state.box.getMap("fromGasOracleScalingFactor"),value:async i=>await this.appClient.state.box.getMapValue("fromGasOracleScalingFactor",i)},bridgingFeeConversionScalingFactor:{getMap:async()=>await this.appClient.state.box.getMap("bridgingFeeConversionScalingFactor"),value:async i=>await this.appClient.state.box.getMapValue("bridgingFeeConversionScalingFactor",i)},gasUsage:{getMap:async()=>await this.appClient.state.box.getMap("gasUsage"),value:async i=>await this.appClient.state.box.getMapValue("gasUsage",i)}}};newGroup(){let i=this,a=this.algorand.newGroup(),o=Promise.resolve(),s=[];return{optInAsset(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.optInAsset(d))),s.push(void 0),this},noop(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.noop(d))),s.push(void 0),this},swapAndBridge(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swapAndBridge(d))),s.push(void 0),this},receiveTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.receiveTokens(d))),s.push(void 0),this},registerBridge(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.registerBridge(d))),s.push(void 0),this},addBridgeToken(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.addBridgeToken(d))),s.push(void 0),this},removeBridgeToken(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.removeBridgeToken(d))),s.push(void 0),this},withdrawGasTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.withdrawGasTokens(d))),s.push(void 0),this},withdrawBridgingFeeInTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.withdrawBridgingFeeInTokens(d))),s.push(void 0),this},getBridgingCostInTokens(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getBridgingCostInTokens(d))),s.push(A=>i.decodeReturnValue("getBridgingCostInTokens(byte,uint64)uint64",A)),this},hashMessage(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.hashMessage(d))),s.push(A=>i.decodeReturnValue("hashMessage(uint64,byte[32],byte,byte,byte[32],byte[32])byte[32]",A)),this},isOtherBridgeTokenSupported(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.isOtherBridgeTokenSupported(d))),s.push(A=>i.decodeReturnValue("isOtherBridgeTokenSupported(byte,byte[32])bool",A)),this},getTransactionCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getTransactionCost(d))),s.push(A=>i.decodeReturnValue("getTransactionCost(byte)uint64",A)),this},getReceiveTokensCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getReceiveTokensCost(d))),s.push(A=>i.decodeReturnValue("getReceiveTokensCost()uint64",A)),this},getSendTransactionStorageCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getSendTransactionStorageCost(d))),s.push(A=>i.decodeReturnValue("getSendTransactionStorageCost()uint64",A)),this},swap(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swap(d))),s.push(void 0),this},addPool(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.addPool(d))),s.push(void 0),this},removePool(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.removePool(d))),s.push(void 0),this},stopSwap(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.stopSwap(d))),s.push(void 0),this},startSwap(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.startSwap(d))),s.push(void 0),this},setStopAuthority(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setStopAuthority(d))),s.push(void 0),this},setRebalancer(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setRebalancer(d))),s.push(void 0),this},getGasUsage(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getGasUsage(d))),s.push(A=>i.decodeReturnValue("getGasUsage(byte)uint64",A)),this},setGasUsage(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setGasUsage(d))),s.push(void 0),this},setGasOracle(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setGasOracle(d))),s.push(void 0),this},getTransactionRelayerCost(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.getTransactionRelayerCost(d))),s.push(A=>i.decodeReturnValue("getTransactionRelayerCost(byte)uint64",A)),this},transferOwnership(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.transferOwnership(d))),s.push(void 0),this},clearState(d){return o=o.then(()=>a.addAppCall(i.params.clearState(d))),this},addTransaction(d,A){return o=o.then(()=>a.addTransaction(d,A)),this},async composer(){return await o,a},async simulate(d){await o;let A=await(d?a.simulate(d):a.simulate());return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}},async send(d){await o;let A=await a.send(d);return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}}}}};import{populateAppCallResources as Wr}from"@algorandfoundation/algokit-utils";import fr,{ABIMethod as Tr,AtomicTransactionComposer as Fr,makeBasicAccountTransactionSigner as Zr}from"algosdk";var Gr=new Tr({name:"noop",args:[],returns:{type:"void"}});function Rt(r){let{composer:i,appId:a,sender:o,signer:s,count:d}=r;for(let A=0;A<d;A++)i.addAppCallMethodCall({appId:a,method:Gr,args:[],sender:o,signer:s,note:`noop_${A}`})}function ct(r){return(r*1e3).microAlgos()}async function ji(r,i,a){let o=new Fr,s=Zr({addr:i,sk:new Uint8Array(64)});r.forEach(g=>{o.addTransaction({txn:g,signer:s})});let A=(await Wr(o,a)).buildGroup().map(g=>g.txn);return et(...A)}function et(...r){return r.map(a=>fr.encodeUnsignedTransaction(a)).map(a=>Buffer.from(a).toString("hex"))}async function Nn(r,i,a){typeof r=="string"&&(r=BigInt(r));let s=(await a.account.getInformation(i)).assets;return s?s.find(({assetId:A})=>A===r)!==void 0:!1}async function wn(r,i,a){typeof r=="string"&&(r=BigInt(r));let s=(await a.account.getInformation(i)).appsLocalState;return s?s.find(({id:A})=>A===r)!==void 0:!1}var ne=class{};import{PublicKey as Nr}from"@solana/web3.js";import{createAddress as Pa,parseContractId as wr}from"@stacks/transactions";import{Address as Xr}from"@stellar/stellar-sdk";import Sr,{Address as Vr}from"algosdk";import{Big as ve}from"big.js";import ja from"randombytes";import{utils as La}from"tronweb";import{Web3 as Mr}from"web3";import{Big as R}from"big.js";import Ji from"bn.js";function ki(r,i){return R(100).minus(R(100).times(i).div(r)).toNumber()}function lt(r,i){return We(r,i,3).round(0,R.roundDown)}function ue(r,i){return We(r,3,i)}function We(r,i,a){let o=R(a).minus(i).toNumber();return R(r).times(Kt(o))}function Kt(r){return R(10).pow(r)}function Z(r,i){return R(r).times(Kt(i))}function F(r,i){let a=R(r);return a.eq(0)?R(0):R(a).div(Kt(i))}function q(r){return F(R(r.tokenBalance).minus(r.vUsdBalance).toFixed(),3).div(2).toFixed()}function Je(r,{feeShare:i,decimals:a},o){let s=R(r);if(s.lte(0))return"0";let d=s.times(i),A=s.minus(d),g=lt(A,a),c=R(o.tokenBalance).plus(g),l=ke(c,o.aValue,o.dValue);return R(o.vUsdBalance).minus(l).round(0,R.roundDown).toFixed()}function Ut(r,{feeShare:i,decimals:a},o){let s=R(r);if(s.lte(0))return R(0).toFixed();let d=s.plus(o.vUsdBalance),A=ke(d,o.aValue,o.dValue),g=ue(R(o.tokenBalance).minus(A),a),c=R(g).times(i);return R(g).minus(c).round(0,R.roundDown).toFixed()}function Na(r,i){let a=R(r);if(a.lte(0))return i;let o=a.plus(i.vUsdBalance),s=ke(o,i.aValue,i.dValue);return{aValue:i.aValue,dValue:i.dValue,tokenBalance:s.toFixed(0),vUsdBalance:o.toFixed(0)}}function wa(r,{feeShare:i,decimals:a},o){if(R(r).lte(0))return R(0);let s=R(o.vUsdBalance).minus(r);if(s.lte(0))throw new Ue;let d=ke(s,o.aValue,o.dValue),A=R(d).minus(o.tokenBalance),g=ue(A,a),c=R(i).div(R(1).minus(i)),l=R(g).times(c).round(0,R.roundUp);return R(g).plus(l).round(0,R.roundDown)}function Xa(r,{feeShare:i,decimals:a},o){if(R(r).lte(0))return R(0);let s=R(i).div(R(1).minus(i)),d=R(r).times(s).round(0,R.roundUp),A=R(r).plus(d),g=lt(A,a),c=R(o.tokenBalance).minus(g);if(c.lte(0))throw new Ue;let l=ke(c,o.aValue,o.dValue);return R(l).minus(o.vUsdBalance).round(0,R.roundDown)}function ke(r,i,a){let o=R(4).times(i).times(R(a).minus(r)).minus(a),s=R(a).pow(3),d=o.pow(2),A=R(r).times(R(r).times(d).plus(R(4).times(i).times(s))).sqrt().round(0,R.roundDown),g=R(8).times(i).times(r),c=o.times(r).plus(A).div(g).round(0,R.roundDown);return c.eq(0)?R(0):c.plus(1)}function Sa(r,i,a,o){let s=new Ji(r),d=new Ji(a),A=new Ji(i);return s.mul(d).shrn(o).sub(A).toString()}function Va(r){return R(r).gt(0)?`${Number(R(r).times(100).toFixed(2)).toLocaleString()}%`:"N/A"}function Ma(r,i,a){let o=R(i).times(a),s=R(i).plus(a),d=R(8).times(r).times(o).times(s),A=o.times(R(16).times(r).minus(4)).div(3),g=d.times(d),c=A.times(A).times(A),l=g.plus(c),u=R(l).sqrt(),p=R(Math.cbrt(+d.plus(u).toFixed())),m=R(Math.cbrt(+d.minus(u).toFixed()));return p.plus(m).toFixed()}function De(r,i,a){let o;switch(i){case"EVM":{o=Ha(r);break}case"SOLANA":{o=new Nr(r).toBuffer();break}case"TRX":{o=Hr(r);break}case"SRB":{o=new Xr(r).toBuffer();break}case"SUI":{o=Ha(r);break}case"ALG":{o=Pr(r);break}case"STX":{o=Lr(r);break}}switch(a){case"EVM":return"0x"+o.toString("hex");case"SOLANA":return Array.from(o);case"TRX":return o;case"SRB":return o.toJSON().data;case"SUI":return"0x"+o.toString("hex");case"ALG":return o;case"STX":return o}}function Xe(r){return r.replace(/^0x/i,"")}function zi(r){return Buffer.from(r.replace(/^0x/i,""),"hex")}function Ha(r){let a=zi(r);return Buffer.concat([Buffer.alloc(32-a.length,0),a],32)}function Pr(r){if(Sr.isValidAddress(r))return Buffer.from(Vr.fromString(r).publicKey);if(/^\d+$/.test(r)){let i=BigInt(r).toString(16);return i=i.padStart(64,"0"),Buffer.from(i,"hex")}throw new I(`Unexpected Alg address: ${r}`)}function Lr(r){if(r.includes(".")){let[a,o]=wr(r);if(!a||!o)throw new I(`Unexpected Alg address: ${r}`);let s=Buffer.from(Pa(a).hash160,"hex"),d=Mr.utils.keccak256(Buffer.concat([s,Buffer.from(o)]));return zi(d)}let i=Buffer.from(Pa(r).hash160,"hex");return Ja(i,32)}function Hr(r){let i=Dt(r),a=zi(i);return Ja(a,32)}function Dt(r){let i=La.crypto.decodeBase58Address(r);return i?La.bytes.byteArray2hexStr(i).replace(/^41/,"0x"):""}function Ja(r,i){if(r.length>=i)return r;let a=Buffer.alloc(i,0);return r.copy(a,i-r.length),a}function tt(){return ja(32)}function ze(){let r=ja(32).readBigInt64BE();return r<0?r*-1n:r}function Ce(r,i){let a={},o=i.sourceToken;switch(a.amount=Z(i.amount,o.decimals).toFixed(),a.contractAddress=o.bridgeAddress,a.fromAccountAddress=i.fromAccountAddress,r){case"SUI":{if(!o.originTokenAddress)throw new I("SUI sourceToken must contain 'originTokenAddress'");a.fromTokenAddress=o.originTokenAddress;break}case"ALG":{a.fromTokenAddress=o.tokenAddress;break}default:a.fromTokenAddress=De(o.tokenAddress,r,r)}switch(a.toAccountAddress=i.toAccountAddress,r){case"SUI":{if(!i.destinationToken.originTokenAddress)throw new I("SUI destinationToken must contain 'originTokenAddress'");a.toTokenAddress=i.destinationToken.originTokenAddress;break}case"ALG":{a.toTokenAddress=i.destinationToken.tokenAddress;break}default:a.toTokenAddress=De(i.destinationToken.tokenAddress,r,r)}return a.minimumReceiveAmount=i.minimumReceiveAmount?Z(i.minimumReceiveAmount,i.destinationToken.decimals).toFixed():"0",a}async function pe(r,i,a){let o={};o.fromChainId=i.sourceToken.allbridgeChainId,o.fromChainSymbol=i.sourceToken.chainSymbol;let s=S.getChainProperty(i.destinationToken.chainSymbol).chainType;if(r==="SUI"){if(!i.sourceToken.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");o.fromTokenAddress=i.sourceToken.originTokenAddress}else o.fromTokenAddress=i.sourceToken.tokenAddress;o.toChainId=i.destinationToken.allbridgeChainId,o.toTokenAddress=i.destinationToken.tokenAddress,i.gasFeePaymentMethod==="stablecoin"?o.gasFeePaymentMethod="stablecoin":o.gasFeePaymentMethod="native";let d=i.sourceToken;switch(i.messenger){case 3:if(!d.cctpAddress||!i.destinationToken.cctpAddress)throw new ce("Such route does not support CCTP protocol");o.contractAddress=d.cctpAddress;break;case 4:if(!d.cctpV2Address||!i.destinationToken.cctpV2Address)throw new ce("Such route does not support CCTP V2 protocol");o.contractAddress=d.cctpV2Address;break;case 5:if(!d.oftBridgeAddress||!i.destinationToken.oftBridgeAddress||d.oftId!==i.destinationToken.oftId)throw new le("Such route does not support OFT protocol");o.contractAddress=d.oftBridgeAddress;break;case 1:case 2:o.contractAddress=d.bridgeAddress;break}o.messenger=i.messenger,o.fromAccountAddress=i.fromAccountAddress,o.amount=Z(i.amount,d.decimals).toFixed();let{fee:A,feeFormat:g}=i;if(!A){let p=(await xi(i.sourceToken,o.toChainId,o.messenger,a))[o.gasFeePaymentMethod];if(!p)throw new xt;A=p.int,g="int"}if(g=="float")switch(o.gasFeePaymentMethod){case"native":o.fee=Z(A,S.getChainDecimalsByType(d.chainType)).toFixed(0);break;case"stablecoin":o.fee=Z(A,d.decimals).toFixed(0);break}else o.fee=A;let{extraGas:c,extraGasFormat:l}=i;if(c&&+c>0){let u=await Oi(d,i.destinationToken,o.messenger,a),p,m;switch(o.gasFeePaymentMethod){case"native":p=S.getChainDecimalsByType(d.chainType),m=ve(u.exchangeRate);break;case"stablecoin":p=d.decimals,m=ve(u.exchangeRate).div(u.sourceNativeTokenPrice);break}switch(l??"int"){case"float":{o.extraGas=Z(c,p).toFixed(0);let y=m.mul(c);o.extraGasDest=Z(y,S.getChainDecimalsByType(i.destinationToken.chainType)).toFixed(0,ve.roundDown);break}case"int":{o.extraGas=c;let y=F(o.extraGas,S.getChainDecimalsByType(d.chainType)),Y=m.mul(y);o.extraGasDest=Z(Y,S.getChainDecimalsByType(i.destinationToken.chainType)).toFixed(0,ve.roundDown);break}}Jr(o.extraGas,o.gasFeePaymentMethod,u)}return["SUI","ALG"].includes(r)||(o.fromTokenAddress=De(o.fromTokenAddress,r,r)),o.toAccountAddress=De(i.toAccountAddress,s,r),o.toTokenAddress=De(o.toTokenAddress,s,r),o.gasFeePaymentMethod=="stablecoin"&&jr(o.amount,d.decimals,o.fee,o.extraGas),o}function jr(r,i,a,o){let s=ve(r).minus(a).minus(o??0);if(s.lte(0))throw new ht(`Amount not enough to pay fee, ${F(ve(s).minus(1).neg(),i).toFixed()} stables is missing`)}async function xi(r,i,a,o){let s=await o.getReceiveTransactionCost({sourceChainId:r.allbridgeChainId,destinationChainId:i,messenger:a,sourceToken:r.tokenAddress}),d={native:{int:s.fee,float:F(s.fee,S.getChainDecimalsByType(r.chainType)).toFixed()},adminFeeShareWithExtras:s.adminFeeShareWithExtras};if(s.sourceNativeTokenPrice){let A=We(new ve(s.fee).mul(s.sourceNativeTokenPrice),S.getChainDecimalsByType(r.chainType),r.decimals).toFixed(0,ve.roundUp);d.stablecoin={int:A,float:F(A,r.decimals).toFixed()}}return d}function Jr(r,i,a){let o=a.extraGasMax[i];if(!o)throw new xt(`Impossible to pay extra gas by '${i}' payment method`);let s=o.int;if(ve(r).gt(s))throw new Rn(`Extra gas ${r} in int format, exceeded limit ${s} for '${i}' payment method`)}async function Oi(r,i,a,o){let s={},d=await o.getReceiveTransactionCost({sourceChainId:r.allbridgeChainId,destinationChainId:i.allbridgeChainId,messenger:a,sourceToken:r.tokenAddress}),A=i.txCostAmount.maxAmount,g=F(A,S.getChainDecimalsByType(i.chainType)).toFixed(),c=ve(g).div(d.exchangeRate).toFixed(S.getChainDecimalsByType(r.chainType),ve.roundDown),l=Z(c,S.getChainDecimalsByType(r.chainType)).toFixed(0);if(s.native={int:l,float:c},d.sourceNativeTokenPrice){let u=ve(c).mul(d.sourceNativeTokenPrice).toFixed(r.decimals,ve.roundDown);s.stablecoin={int:Z(u,r.decimals).toFixed(0),float:u}}return{extraGasMax:s,destinationChain:{gasAmountMax:{int:A,float:g},swap:{int:i.txCostAmount.swap,float:F(i.txCostAmount.swap,S.getChainDecimalsByType(i.chainType)).toFixed()},transfer:{int:i.txCostAmount.transfer,float:F(i.txCostAmount.transfer,S.getChainDecimalsByType(i.chainType)).toFixed()}},exchangeRate:d.exchangeRate,sourceNativeTokenPrice:d.sourceNativeTokenPrice}}function ka(r){return r.sourceToken.chainSymbol!==r.destinationToken.chainSymbol}var Et=class extends ne{constructor(a,o){super();this.algorand=a;this.api=o;a.setDefaultSigner(za.makeBasicAccountTransactionSigner(za.mnemonicToSecretKey("tunnel gym elevator pulse motor evolve release orange culture make sister approve winter chair armor grocery distance festival tiger holiday dish wisdom region absorb secret")))}chainType="ALG";send(a){throw new X}async buildRawTransactionSend(a){let o=await pe(this.chainType,a,this.api);if(!a.sourceToken.bridgeId)throw new I("ALG sourceToken must contain 'bridgeId'");let s=BigInt(a.sourceToken.bridgeId),d=this.getBridge(s),A=xa.fromString(a.fromAccountAddress),g=BigInt(a.sourceToken.tokenAddress),c=o.toChainId,l=o.toAccountAddress,u=o.toTokenAddress,p=tt(),m=BigInt(o.amount),y=BigInt(o.fee);o.extraGas&&(y=y+BigInt(o.extraGas));let Y=o.gasFeePaymentMethod==="stablecoin",h=this.algorand.newGroup(),B;Y?B=y:(h.addPayment({sender:A,receiver:d.appAddress,amount:kr.MicroAlgo(y)}),B=0n),h.addAssetTransfer({assetId:g,amount:m,sender:A,receiver:d.appAddress}).addAppCallMethodCall(await d.params.swapAndBridge({args:{tokenId:g,recipient:l,destinationChainId:c,receiveToken:u,nonce:p,feeTokenAmount:B},sender:A,extraFee:ct(Y?9:8)})),Rt({composer:h,appId:s,sender:A,count:Y?3:2});let{transactions:W}=await h.buildTransactions();return ji(W,A,this.algorand.client.algod)}async buildRawTransactionSwap(a){let o=Ce(this.chainType,a),s=xa.fromString(a.fromAccountAddress),d=a.toAccountAddress,A=BigInt(a.sourceToken.tokenAddress),g=BigInt(a.destinationToken.tokenAddress),c=BigInt(o.minimumReceiveAmount),l=BigInt(o.amount);if(!a.sourceToken.bridgeId)throw new I("ALG sourceToken must contain 'bridgeId'");let u=BigInt(a.sourceToken.bridgeId),p=this.getBridge(u),m=this.algorand.newGroup();a.fromAccountAddress===d&&(await Nn(g,d,this.algorand)||m.addAssetOptIn({sender:s,assetId:g})),m.addAssetTransfer({assetId:A,amount:l,sender:s,receiver:p.appAddress}),m.addAppCallMethodCall(await p.params.swap({args:{tokenId:A,recipient:d,receiveTokenId:g,receiveAmountMin:c},sender:s,extraFee:ct(4)})),Rt({composer:m,appId:u,sender:s,count:1});let{transactions:y}=await m.buildTransactions();return ji(y,s,this.algorand.client.algod)}getBridge(a){return this.algorand.client.getTypedAppClientById(Gn,{appId:a})}};import{Big as Dr}from"big.js";var zr={abi:[{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"uint256",name:"_chainPrecision",type:"uint256"},{internalType:"contract Messenger",name:"_allbridgeMessenger",type:"address"},{internalType:"contract WormholeMessenger",name:"_wormholeMessenger",type:"address"},{internalType:"contract IGasOracle",name:"_gasOracle",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"gas",type:"uint256"}],name:"BridgingFeeFromTokens",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"bridgeTransactionCost",type:"uint256"},{indexed:!1,internalType:"uint256",name:"messageTransactionCost",type:"uint256"}],name:"ReceiveFee",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Received",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"bytes32",name:"sendToken",type:"bytes32"},{indexed:!1,internalType:"bytes32",name:"receiveToken",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"sendAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receiveAmount",type:"uint256"}],name:"Swapped",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{indexed:!1,internalType:"bytes32",name:"message",type:"bytes32"}],name:"TokensReceived",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"receiveToken",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"}],name:"TokensSent",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"addBridgeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract Pool",name:"pool",type:"address"},{internalType:"bytes32",name:"token",type:"bytes32"}],name:"addPool",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"canSwap",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"gasUsage",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"address",name:"tokenAddress",type:"address"}],name:"getBridgingCostInTokens",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"getMessageCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"getMessageGasUsage",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"getTransactionCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"message",type:"bytes32"},{internalType:"enum MessengerProtocol",name:"protocol",type:"uint8"}],name:"hasReceivedMessage",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"message",type:"bytes32"}],name:"hasSentMessage",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"}],name:"hashMessage",outputs:[{internalType:"bytes32",name:"",type:"bytes32"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"otherBridgeTokens",outputs:[{internalType:"bool",name:"isSupported",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"otherBridges",outputs:[{internalType:"bytes32",name:"bridgeAddress",type:"bytes32"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"tokenId",type:"bytes32"}],name:"pools",outputs:[{internalType:"contract Pool",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes32",name:"messageHash",type:"bytes32"}],name:"processedMessages",outputs:[{internalType:"uint256",name:"isProcessed",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"}],name:"receiveTokens",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"bridgeAddress",type:"bytes32"}],name:"registerBridge",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_chainId",type:"uint256"},{internalType:"bytes32",name:"tokenAddress",type:"bytes32"}],name:"removeBridgeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"messageHash",type:"bytes32"}],name:"sentMessages",outputs:[{internalType:"uint256",name:"isSent",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"contract Messenger",name:"_allbridgeMessenger",type:"address"}],name:"setAllbridgeMessenger",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IGasOracle",name:"_gasOracle",type:"address"}],name:"setGasOracle",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"uint256",name:"gasAmount",type:"uint256"}],name:"setGasUsage",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_rebalancer",type:"address"}],name:"setRebalancer",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_stopAuthority",type:"address"}],name:"setStopAuthority",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract WormholeMessenger",name:"_wormholeMessenger",type:"address"}],name:"setWormholeMessenger",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startSwap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopSwap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"token",type:"bytes32"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"address",name:"recipient",type:"address"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"}],name:"swap",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"bytes32",name:"token",type:"bytes32"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"bytes32",name:"receiveToken",type:"bytes32"},{internalType:"uint256",name:"nonce",type:"uint256"},{internalType:"enum MessengerProtocol",name:"messenger",type:"uint8"},{internalType:"uint256",name:"feeTokenAmount",type:"uint256"}],name:"swapAndBridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IERC20",name:"token",type:"address"}],name:"withdrawBridgingFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"withdrawGasTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},Oa=zr;var xr={abi:[{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"chainPrecision_",type:"uint256"},{internalType:"address",name:"tokenAddress",type:"address"},{internalType:"address",name:"cctpMessenger_",type:"address"},{internalType:"address",name:"cctpTransmitter_",type:"address"},{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedExtraGas",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedGas",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"bytes32",name:"newRecipient",type:"bytes32"}],name:"RecipientReplaced",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"bytes32",name:"recipientWalletAddress",type:"bytes32"}],name:"TokensSentExtras",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"uint256",name:"nonce",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromTokens",type:"uint256"},{indexed:!1,internalType:"uint256",name:"relayerFee",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"adminFeeTokenAmount",type:"uint256"}],name:"TokensSent",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"}],name:"bridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"bytes32",name:"recipientWalletAddress",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"}],name:"bridgeWithWalletAddress",outputs:[],stateMutability:"payable",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"bytes",name:"originalMessage",type:"bytes"},{internalType:"bytes",name:"originalAttestation",type:"bytes"},{internalType:"bytes32",name:"newRecipient",type:"bytes32"}],name:"changeRecipient",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"gasUsage",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"destinationChainId",type:"uint256"}],name:"getBridgingCostInTokens",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"getDomainByChainId",outputs:[{internalType:"uint32",name:"",type:"uint32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"}],name:"getTransactionCost",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"sourceChainId",type:"uint256"},{internalType:"uint64",name:"nonce",type:"uint64"}],name:"isMessageProcessed",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"recipient",type:"address"},{internalType:"bytes",name:"message",type:"bytes"},{internalType:"bytes",name:"signature",type:"bytes"}],name:"receiveTokens",outputs:[],stateMutability:"payable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint32",name:"domain",type:"uint32"}],name:"registerBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"adminFeeShareBP_",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],name:"setGasOracle",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId",type:"uint256"},{internalType:"uint256",name:"gasAmount",type:"uint256"}],name:"setGasUsage",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"unregisterBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"withdrawFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"withdrawGas",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},Qa=xr;var Or={abi:[{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"chainPrecision_",type:"uint256"},{internalType:"contract IGasOracle",name:"gasOracle_",type:"address"}],stateMutability:"nonpayable",type:"constructor"},{inputs:[{internalType:"uint16",name:"optionType",type:"uint16"}],name:"InvalidOptionType",type:"error"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"bytes32",name:"recipient",type:"bytes32"},{indexed:!1,internalType:"address",name:"tokenAddress",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"destinationChainId",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeFromTokens",type:"uint256"},{indexed:!1,internalType:"uint256",name:"relayerFeeWithExtraGas",type:"uint256"},{indexed:!1,internalType:"uint256",name:"receivedRelayerFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"adminFeeTokenAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"extraGasDestinationToken",type:"uint256"}],name:"OftTokensSent",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"ReceivedGas",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[{internalType:"address",name:"oft_",type:"address"}],name:"addToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"}],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"feeShare",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bytes32",name:"recipient",type:"bytes32"},{internalType:"uint256",name:"destinationChainId",type:"uint256"},{internalType:"uint256",name:"relayerFeeTokenAmount",type:"uint256"},{internalType:"uint256",name:"extraGasInDestinationToken",type:"uint256"},{internalType:"uint256",name:"slippageBP",type:"uint256"}],name:"bridge",outputs:[],stateMutability:"payable",type:"function"},{inputs:[],name:"chainId",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"destinationChainId_",type:"uint256"},{internalType:"uint128",name:"extraGasAmount_",type:"uint128"}],name:"extraGasPrice",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"getEidByChainId",outputs:[{internalType:"uint32",name:"",type:"uint32"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress",type:"address"}],name:"oftAddress",outputs:[{internalType:"address",name:"oftAddress",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint32",name:"eid_",type:"uint32"},{internalType:"uint128",name:"lzGasLimit_",type:"uint128"}],name:"registerBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"destinationChainId_",type:"uint256"}],name:"relayerFee",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"oft_",type:"address"}],name:"removeToken",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"tokenAddress_",type:"address"},{internalType:"uint256",name:"adminFeeShareBP_",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint128",name:"lzGasLimit_",type:"uint128"}],name:"setLzGasLimit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"},{internalType:"uint256",name:"maxExtraGas_",type:"uint256"}],name:"setMaxExtraGas",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"chainId_",type:"uint256"}],name:"unregisterBridgeDestination",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"contract IERC20",name:"token_",type:"address"}],name:"withdrawFeeInTokens",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount_",type:"uint256"}],name:"withdrawGas",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},Ka=Or;import*as Sn from"@project-serum/anchor";import{PublicKey as no}from"@solana/web3.js";import*as se from"@project-serum/anchor";import{PublicKey as me}from"@solana/web3.js";async function Se(r,i){return se.utils.token.associatedAddress({mint:i,owner:r})}async function nt(r){let[i]=await me.findProgramAddress([se.utils.bytes.utf8.encode("config")],r);return i}async function Ua(r,i){let[a]=await me.findProgramAddress([se.utils.bytes.utf8.encode("lock"),Uint8Array.from(r)],i);return a}async function _t(r,i){let[a]=await me.findProgramAddress([se.utils.bytes.utf8.encode("price_v2"),Uint8Array.from([r])],i);return a}async function Yt(r){let i=await nt(r),[a]=await me.findProgramAddress([i.toBuffer()],r);return a}async function Da(r,i){let[a]=await me.findProgramAddress([r.toBuffer()],i);return a}async function Bt(r,i){let[a]=await me.findProgramAddress([se.utils.bytes.utf8.encode("token"),r.toBytes()],i);return a}async function Ea(r,i,a){let[o]=await me.findProgramAddress([se.utils.bytes.utf8.encode("other_bridge_token"),Buffer.from([r]),i],a);return o}async function Qi(r,i){let[a]=await me.findProgramAddress([se.utils.bytes.utf8.encode("chain_bridge"),Uint8Array.from([r])],i);return a}async function Ki(r,i){let[a]=await me.findProgramAddress([se.utils.bytes.utf8.encode("gas_usage"),Uint8Array.from([r])],i);return a}async function _a(r,i){let[a]=await me.findProgramAddress([se.utils.bytes.utf8.encode("sent_message"),r],i);return a}async function Ui(r,i,a){let[o]=await me.findProgramAddress([se.utils.bytes.utf8.encode("user_deposit"),i.toBytes(),r.toBytes()],a);return o}async function $a(r,i){let[a]=await me.findProgramAddress([se.utils.bytes.utf8.encode("cctp_bridge"),r.toBytes()],i);return a}async function qa(r,i){let[a]=await me.findProgramAddress([se.utils.bytes.utf8.encode("token"),r.toBytes()],i);return a}function eo(r,i){let[a]=me.findProgramAddressSync([se.utils.bytes.utf8.encode("lock"),i.toBuffer()],r);return a}function to(r,i,a,o){let s=ut("message_transmitter",a),d=ut("token_messenger",o),A=ut("__event_authority",o),g=ut("token_minter",o),c=ut("local_token",o,[i]),l=ut("remote_token_messenger",o,[r.toString()]),u=ut("sender_authority",o);return{messageTransmitterAccount:s,tokenMessenger:d,tokenMessengerEventAuthority:A,tokenMinter:g,localToken:c,remoteTokenMessengerKey:l,authorityPda:u}}function ut(r,i,a=[]){let o=[Buffer.from(se.utils.bytes.utf8.encode(r))];for(let d of a)typeof d=="string"?o.push(Buffer.from(se.utils.bytes.utf8.encode(d))):Array.isArray(d)||Buffer.isBuffer(d)?o.push(Buffer.from(Uint8Array.from(d))):o.push(Buffer.from(Uint8Array.from(d.toBuffer())));return me.findProgramAddressSync(o,i)[0]}import{AnchorProvider as Qr}from"@project-serum/anchor";import{Connection as Kr,PublicKey as Ur}from"@solana/web3.js";function it(r,i){let a=new Kr(r,"confirmed"),o=new Ur(i);return new Qr(a,{publicKey:o},{preflightCommitment:"confirmed",commitment:"confirmed"})}async function Vn(r,i,a,o){let s,d=new no(i),A=new no(a),g=await Se(d,A),c=it(o,i);Sn.setProvider(c);let l=await Sn.Spl.token(c).account.token.fetchNullable(g);if(l?.authority.equals(d))s=De(g.toBase58(),"SOLANA",r);else{let u=await c.connection.getTokenAccountsByOwner(d,{mint:A});if(u.value.length===0&&!l)s=De(g.toBase58(),"SOLANA",r);else if(u.value.length>0){let p=u.value[0];if(!p?.pubkey)throw new I("First token account or its public key is undefined");s=De(p.pubkey.toBase58(),"SOLANA",r)}else throw new I("Associated account has wrong owner")}return s}var $t=class extends ne{constructor(a,o,s){super();this.web3=a;this.api=o;this.nodeRpcUrlsConfig=s}chainType="EVM";async send(a){let o=await this.buildRawTransactionSend(a);return this.sendRawTransaction(o)}async buildRawTransactionSwap(a){let o=Ce(this.chainType,a);return await this.buildRawTransactionSwapFromParams(o)}async buildRawTransactionSwapFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toAccountAddress:g,toTokenAddress:c,minimumReceiveAmount:l}=a,p=this.getBridgeContract(s).methods.swap(o,A,c,g,l);return Promise.resolve({from:d,to:s,data:p.encodeABI()})}async buildRawTransactionSend(a){let o=await pe(this.chainType,a,this.api),{amount:s,contractAddress:d,fromAccountAddress:A,fromTokenAddress:g,toChainId:c,toAccountAddress:l,toTokenAddress:u,messenger:p,fee:m,gasFeePaymentMethod:y,extraGas:Y,extraGasDest:h}=o,B="0x"+tt().toString("hex"),W,C,f=m;switch(Y&&(f=Dr(f).plus(Y).toFixed()),p){case 3:case 4:{let w=await this.buildRawTransactionCctpSend(a,o,f);W=w.sendMethod,C=w.value;break}case 5:{let w=this.buildRawTransactionOftSend(a,o,f,h);W=w.sendMethod,C=w.value;break}case 1:case 2:{let w=this.getBridgeContract(d);y==="stablecoin"?(W=w.methods.swapAndBridge(g,s,l,c,u,B,p,f),C="0"):(W=w.methods.swapAndBridge(g,s,l,c,u,B,p,0),C=f)}break}return Promise.resolve({from:A,to:d,value:C,data:W.encodeABI()})}async buildRawTransactionCctpSend(a,o,s){let{amount:d,contractAddress:A,toChainId:g,toAccountAddress:c,gasFeePaymentMethod:l}=o,u=this.getCctpBridgeContract(A),p,m;if(a.destinationToken.chainType==="SOLANA"){let y=await Vn(this.chainType,a.toAccountAddress,a.destinationToken.tokenAddress,this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"));l==="stablecoin"?(p=u.methods.bridgeWithWalletAddress(d,y,c,g,s),m="0"):(p=u.methods.bridgeWithWalletAddress(d,y,c,g,0),m=s)}else l==="stablecoin"?(p=u.methods.bridge(d,c,g,s),m="0"):(p=u.methods.bridge(d,c,g,0),m=s);return{sendMethod:p,value:m}}buildRawTransactionOftSend(a,o,s,d){let{amount:A,contractAddress:g,toChainId:c,toAccountAddress:l,gasFeePaymentMethod:u}=o,p=this.getOftBridgeContract(g),m,y;return u==="stablecoin"?(m=p.methods.bridge(a.sourceToken.tokenAddress,A,l,c,s,d??"0","10"),y="0"):(m=p.methods.bridge(a.sourceToken.tokenAddress,A,l,c,0,d??"0","10"),y=s),{sendMethod:m,value:y}}async sendRawTransaction(a){let o=await this.web3.eth.estimateGas(a),s={maxPriorityFeePerGas:null,maxFeePerGas:null},{transactionHash:d}=await this.web3.eth.sendTransaction({...a,gas:o,...s});return{txId:d.toString()}}getBridgeContract(a){return new this.web3.eth.Contract(Oa.abi,a)}getCctpBridgeContract(a){return new this.web3.eth.Contract(Qa.abi,a)}getOftBridgeContract(a){return new this.web3.eth.Contract(Ka.abi,a)}};var Mn=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s}async approve(i,a){let o,s;a?(o=i,s=a):s=i;let d=qt(s.token,s.messenger);return this.tokenService.buildRawTransactionApprove({...s,spender:d},o)}async send(i,a){return V(i.amount),H("amount",i.amount,i.sourceToken.decimals),ka(i)?Pn(i.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionSend(i):Pn(i.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionSwap(i)}};import{BN as Tt,Program as _i,Spl as os,web3 as at}from"@project-serum/anchor";import{Keypair as mo,PublicKey as Q,SystemProgram as rs}from"@solana/web3.js";import{Big as Ve}from"big.js";var en={version:"0.1.0",name:"bridge",instructions:[{name:"initialize",accounts:[{name:"admin",isMut:!0,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializeArgs"}}]},{name:"initializePool",accounts:[{name:"payer",isMut:!0,isSigner:!0},{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"token",isMut:!0,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializePoolArgs"}}]},{name:"initDepositAccount",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"deposit",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"withdraw",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"amountLp",type:"u64"}]},{name:"swapAndBridge",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"messenger",isMut:!1,isSigner:!1},{name:"messengerConfig",isMut:!0,isSigner:!1},{name:"sentMessageAccount",isMut:!0,isSigner:!1},{name:"messengerGasUsage",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"swapAndBridgeWormhole",accounts:[{name:"user",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"wormholeMessenger",isMut:!1,isSigner:!1},{name:"wormholeMessengerConfig",isMut:!0,isSigner:!1},{name:"wormholeProgram",isMut:!1,isSigner:!1},{name:"bridge",isMut:!0,isSigner:!1},{name:"message",isMut:!0,isSigner:!0},{name:"sequence",isMut:!0,isSigner:!1},{name:"feeCollector",isMut:!0,isSigner:!1},{name:"messengerGasUsage",isMut:!1,isSigner:!1},{name:"clock",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"swap",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"sendMint",isMut:!1,isSigner:!1},{name:"receiveMint",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1},{name:"sendPool",isMut:!0,isSigner:!1},{name:"receivePool",isMut:!0,isSigner:!1},{name:"sendBridgeToken",isMut:!0,isSigner:!1},{name:"receiveBridgeToken",isMut:!0,isSigner:!1},{name:"sendUserToken",isMut:!0,isSigner:!1},{name:"receiveUserToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1}],args:[{name:"amount",type:"u64"},{name:"receiveAmountMin",type:"u64"}]},{name:"registerChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"RegisterChainBridgeArgs"}}]},{name:"updateChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1}],args:[{name:"args",type:{defined:"UpdateChainBridgeArgs"}}]},{name:"receiveAndSwap",accounts:[{name:"user",isMut:!0,isSigner:!1},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"receivedMessageAccount",isMut:!1,isSigner:!1},{name:"unlock",isMut:!0,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"messengerProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"UnlockArgs"}}]},{name:"receiveAndSwapWormhole",accounts:[{name:"user",isMut:!0,isSigner:!1},{name:"payer",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"receivedMessageAccount",isMut:!1,isSigner:!1},{name:"unlock",isMut:!0,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"messengerProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"UnlockArgs"}}]},{name:"withdrawGasToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"recipient",isMut:!0,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"claimRewards",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"setAdmin",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"newAdmin",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[]},{name:"startBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"actionType",type:{defined:"ActionType"}}]},{name:"stopBridge",accounts:[{name:"stopAuthority",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"actionType",type:{defined:"ActionType"}}]},{name:"setRebalancer",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"rebalancer",isMut:!1,isSigner:!1}],args:[]},{name:"setStopAuthority",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"newAuthority",isMut:!1,isSigner:!1},{name:"config",isMut:!0,isSigner:!1}],args:[]},{name:"setAllbridgeMessengerProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setWormholeMessengerProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setGasOracleProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"setPoolFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"setBalanceRatioMin",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"balanceRatioMinBp",type:"u16"}]},{name:"setPoolAdminFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"addOtherBridgeToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!1,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"chainId",type:"u8"},{name:"tokenAddress",type:{array:["u8",32]}}]},{name:"removeOtherBridgeToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"config",isMut:!0,isSigner:!1},{name:"otherBridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"chainId",type:"u8"},{name:"tokenAddress",type:{array:["u8",32]}}]},{name:"withdrawAdminFee",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"adminToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"adjustTotalLpAmount",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"config",isMut:!1,isSigner:!1},{name:"pool",isMut:!0,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"userDeposit",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1}],args:[]}],accounts:[{name:"chainBridge",type:{kind:"struct",fields:[{name:"address",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"config",type:{kind:"struct",fields:[{name:"admin",type:"publicKey"},{name:"allbridgeMessengerProgramId",type:"publicKey"},{name:"wormholeMessengerProgramId",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"},{name:"rebalancer",type:"publicKey"},{name:"stopAuthority",type:"publicKey"},{name:"authorityBumpSeed",type:"u8"},{name:"canSwap",type:"bool"},{name:"canDeposit",type:"bool"},{name:"canWithdraw",type:"bool"}]}},{name:"lock",type:{kind:"struct",fields:[{name:"sender",type:"publicKey"},{name:"sentTokenAddress",type:"publicKey"},{name:"amount",type:"u64"},{name:"vusdAmount",type:"u64"},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"nonce",type:{array:["u8",32]}},{name:"messenger",type:{defined:"Messenger"}},{name:"slot",type:"u64"},{name:"fee",type:"u64"}]}},{name:"otherBridgeToken",type:{kind:"struct",fields:[]}},{name:"pool",type:{kind:"struct",fields:[{name:"mint",type:"publicKey"},{name:"a",type:"u64"},{name:"d",type:"u64"},{name:"tokenBalance",type:"u64"},{name:"vUsdBalance",type:"u64"},{name:"reserves",type:"u64"},{name:"decimals",type:"u8"},{name:"totalLpAmount",type:"u64"},{name:"feeShareBp",type:"u64"},{name:"adminFeeShareBp",type:"u64"},{name:"accRewardPerShareP",type:"u128"},{name:"adminFeeAmount",type:"u64"},{name:"balanceRatioMinBp",type:"u16"}]}},{name:"unlock",type:{kind:"struct",fields:[{name:"hash",type:{array:["u8",32]}},{name:"amount",type:"u64"},{name:"fee",type:"u64"},{name:"vUsdAmount",type:"u64"},{name:"slot",type:"u64"}]}},{name:"userDeposit",type:{kind:"struct",fields:[{name:"userAddress",type:"publicKey"},{name:"mint",type:"publicKey"},{name:"lpAmount",type:"u64"},{name:"rewardDebt",type:"u64"}]}}],types:[{name:"RegisterChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainBridgeAddress",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"UpdateChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainBridgeAddress",type:{array:["u8",32]}},{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"}]}},{name:"InitializeArgs",type:{kind:"struct",fields:[{name:"allbridgeMessengerProgramId",type:"publicKey"},{name:"wormholeMessengerProgramId",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"}]}},{name:"InitializePoolArgs",type:{kind:"struct",fields:[{name:"a",type:"u64"},{name:"feeShareBp",type:"u64"},{name:"adminFeeShareBp",type:"u64"},{name:"balanceRatioMinBp",type:"u16"}]}},{name:"BridgeArgs",type:{kind:"struct",fields:[{name:"nonce",type:{array:["u8",32]}},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"vusdAmount",type:"u64"}]}},{name:"UnlockArgs",type:{kind:"struct",fields:[{name:"nonce",type:{array:["u8",32]}},{name:"amount",type:"u64"},{name:"recipient",type:"publicKey"},{name:"sourceChainId",type:"u8"},{name:"receiveToken",type:"publicKey"},{name:"messenger",type:{defined:"Messenger"}},{name:"hash",type:{array:["u8",32]}},{name:"receiveAmountMin",type:"u64"}]}},{name:"RewardError",type:{kind:"enum",variants:[{name:"FeeTooHigh"}]}},{name:"Messenger",type:{kind:"enum",variants:[{name:"None"},{name:"Allbridge"},{name:"Wormhole"}]}},{name:"ActionType",type:{kind:"enum",variants:[{name:"Deposit"},{name:"Withdraw"},{name:"Swap"}]}}],errors:[{code:6e3,name:"AccountAlreadyInitialized",msg:"This account has already been initialized"},{code:6001,name:"AdminAuthorityInvalid",msg:"This instruction requires admin authority"},{code:6002,name:"InvalidSignature",msg:"Provided signature has wrong signer or message"},{code:6003,name:"InvalidHash",msg:"Wrong unlock message hash"},{code:6004,name:"PoolOverflow",msg:"PoolInfo overflow"},{code:6005,name:"ReservesExhausted",msg:"Reserves exhausted"},{code:6006,name:"ZeroAmount",msg:"Zero amount"},{code:6007,name:"ZeroChanges",msg:"Zero changes"},{code:6008,name:"HighVusdAmount",msg:"vUSD amount is too high"},{code:6009,name:"BalanceRatioExceeded",msg:"Balance ratio exceeded"},{code:6010,name:"InsufficientReceivedAmount",msg:"Received insufficient amount"},{code:6011,name:"ForbiddenAction",msg:"ForbiddenAction"},{code:6012,name:"ValueTooHigh",msg:"Value is too high"}]};var io={version:"0.1.0",name:"cctp_bridge",instructions:[{name:"initialize",accounts:[{name:"payer",isMut:!0,isSigner:!0},{name:"admin",isMut:!0,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"rent",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"InitializeArgs"}}]},{name:"bridge",accounts:[{name:"user",isMut:!0,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"messageSentEventData",isMut:!0,isSigner:!0},{name:"lock",isMut:!0,isSigner:!1},{name:"mint",isMut:!0,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1},{name:"cctpMessenger",isMut:!1,isSigner:!1},{name:"messageTransmitterProgram",isMut:!1,isSigner:!1},{name:"messageTransmitterAccount",isMut:!0,isSigner:!1},{name:"tokenMessenger",isMut:!1,isSigner:!1},{name:"tokenMinter",isMut:!1,isSigner:!1},{name:"localToken",isMut:!0,isSigner:!1},{name:"remoteTokenMessengerKey",isMut:!1,isSigner:!1},{name:"authorityPda",isMut:!1,isSigner:!1},{name:"eventAuthority",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"gasPrice",isMut:!1,isSigner:!1},{name:"thisGasPrice",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!1,isSigner:!1},{name:"userToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"BridgeArgs"}}]},{name:"registerChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"payer",isMut:!0,isSigner:!0},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[{name:"args",type:{defined:"RegisterChainBridgeArgs"}}]},{name:"updateChainBridge",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"chainBridge",isMut:!0,isSigner:!1}],args:[{name:"args",type:{defined:"UpdateChainBridgeArgs"}}]},{name:"setAdminFeeShare",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"feeShareBp",type:"u64"}]},{name:"setGasOracleProgramId",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]},{name:"withdrawGasToken",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"recipient",isMut:!0,isSigner:!1},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"amount",type:"u64"}]},{name:"withdrawAdminFee",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!1,isSigner:!1},{name:"bridgeToken",isMut:!0,isSigner:!1},{name:"adminToken",isMut:!0,isSigner:!1},{name:"bridgeAuthority",isMut:!1,isSigner:!1},{name:"tokenProgram",isMut:!1,isSigner:!1},{name:"systemProgram",isMut:!1,isSigner:!1}],args:[]},{name:"setCctpTokenMessengerMinter",accounts:[{name:"admin",isMut:!1,isSigner:!0},{name:"mint",isMut:!1,isSigner:!1},{name:"cctpBridge",isMut:!0,isSigner:!1}],args:[{name:"newProgramId",type:"publicKey"}]}],accounts:[{name:"cctpBridge",type:{kind:"struct",fields:[{name:"mint",type:"publicKey"},{name:"admin",type:"publicKey"},{name:"cctpTokenMessengerMinter",type:"publicKey"},{name:"gasOracleProgramId",type:"publicKey"},{name:"authorityBumpSeed",type:"u8"},{name:"adminFeeShareBp",type:"u64"},{name:"adminFeeAmount",type:"u64"}]}},{name:"chainBridge",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"}]}},{name:"lock",type:{kind:"struct",fields:[{name:"sender",type:"publicKey"},{name:"amount",type:"u64"},{name:"adminFee",type:"u64"},{name:"relayerFee",type:"u64"},{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"slot",type:"u64"}]}}],types:[{name:"RegisterChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"},{name:"mint",type:"publicKey"}]}},{name:"UpdateChainBridgeArgs",type:{kind:"struct",fields:[{name:"chainId",type:"u8"},{name:"gasUsage",type:"u64"},{name:"domain",type:"u32"},{name:"mint",type:"publicKey"}]}},{name:"BridgeArgs",type:{kind:"struct",fields:[{name:"recipient",type:{array:["u8",32]}},{name:"destinationChainId",type:"u8"},{name:"receiveToken",type:{array:["u8",32]}},{name:"amount",type:"u64"}]}},{name:"InitializeArgs",type:{kind:"struct",fields:[{name:"gasOracleProgramId",type:"publicKey"},{name:"cctpTokenMessengerMinter",type:"publicKey"}]}}],errors:[{code:6e3,name:"ValueTooHigh",msg:"Value is too high"}]};import{Spl as Er}from"@project-serum/anchor";import _r from"big.js";import{Web3 as Ln}from"web3";async function Wt(r,i){return await Er.token(i).account.token.fetch(r)}async function ao(r,i,a){let o=await i.account.pool.fetch(a),s=o.decimals,d=_r(o.feeShareBp.toString()).div(1e4).toFixed(),A={aValue:o.a.toString(),dValue:o.d.toString(),totalLpAmount:o.totalLpAmount.toString(),tokenBalance:o.tokenBalance.toString(),vUsdBalance:o.vUsdBalance.toString(),accRewardPerShareP:o.accRewardPerShareP.toString()};return Je(r,{decimals:s,feeShare:d},A)}function oo(r){let i=r.amount,a="0x"+r.recipient.toString("hex"),o=r.sourceChainId,s=r.destinationChainId,d="0x"+r.receiveToken.toString("hex"),A="0x"+r.nonce.toString("hex"),g=1,c="0x"+r.chainBridge.toString("hex"),l=Ln.utils.encodePacked({t:"uint256",v:i},{t:"bytes32",v:a},{t:"uint256",v:o},{t:"bytes32",v:d},{t:"uint256",v:A},{t:"uint8",v:g});if(!l)throw new I("message cannot be undefined");let u=Ln.utils.keccak256(Buffer.from(l.replace("0x",""),"hex")),p=Buffer.from(u.replace("0x",""),"hex");p[0]=o,p[1]=s;let m=Ln.utils.encodePacked({t:"bytes32",v:"0x"+p.toString("hex")},{t:"bytes32",v:c});if(!m)throw new vt("messageWithSigner cannot be undefined");let y=Ln.utils.keccak256(Buffer.from(m.replace("0x",""),"hex")),Y=Buffer.from(y.replace("0x",""),"hex");return Y[0]=p[0],Y[1]=p[1],Y}import{ComputeBudgetInstruction as so,ComputeBudgetProgram as Hn,Connection as Ao,TransactionMessage as $r}from"@solana/web3.js";import{Big as qr}from"big.js";import{AddressLookupTableAccount as ro}from"@solana/web3.js";async function pt(r,i){return await Promise.all(r.message.addressTableLookups.map(async a=>new ro({key:a.accountKey,state:ro.deserialize(await i.getAccountInfo(a.accountKey).then(o=>{if(!o)throw new I("Cannot get AccountInfo");return o.data}))})))}var Di="AUTO";async function ft(r,i,a){let o=new Ao(a,"confirmed"),s=(await o.simulateTransaction(r)).value.unitsConsumed;await co(r.instructions,s,i,o)}async function go(r,i,a){let o=new Ao(a,"confirmed"),s=await pt(r,o),d=$r.decompile(r.message,{addressLookupTableAccounts:s});if(r.serialize().length>1232)throw new fn;await co(d.instructions,769230,i,o),r.message=d.compileToV0Message(s)}async function co(r,i,a,o){if(i>0){let s=es(i,r);if(a?.solana){let d=a.solana;if(d===Di)await Ei(r,o);else if("pricePerUnitInMicroLamports"in d)await Ei(r,o,d.pricePerUnitInMicroLamports);else{let A=qr(d.extraFeeInLamports).div(s).mul(Kt(6)).toFixed(0);await Ei(r,o,A)}}}}function es(r,i){let a=i.findIndex(d=>d.programId.equals(Hn.programId)&&so.decodeInstructionType(d)==="SetComputeUnitLimit"),o=Number((r*1.3).toFixed(0)),s=Hn.setComputeUnitLimit({units:o});return a>=0?i[a]=s:i.push(s),o.toString()}async function Ei(r,i,a){let o=r.findIndex(A=>A.programId.equals(Hn.programId)&&so.decodeInstructionType(A)==="SetComputeUnitPrice"),s=BigInt(a||await ts(i)),d=Hn.setComputeUnitPrice({microLamports:s});return o>=0?r[o]=d:r.push(d),s.toString()}async function ts(r){let i=await r.getRecentPrioritizationFees(),a=0;for(let o of i)a+=o.prioritizationFee;return(a/i.length).toFixed(0)}import{NATIVE_MINT as ns}from"@solana/spl-token";import{Connection as is,TransactionMessage as lo,VersionedTransaction as as}from"@solana/web3.js";import uo,{AxiosError as po}from"axios";var jn=class{connection;jupiterUrl;apiKeyHeader;maxAccounts;constructor(i,a){this.connection=new is(i),this.jupiterUrl=a.jupiterUrl.replace(/\/$/,""),this.apiKeyHeader=a.jupiterApiKeyHeader,this.maxAccounts=a.jupiterMaxAccounts}async getJupiterSwapTx(i,a,o,s){let d;try{let p=s?"ExactOut":"ExactIn",m=`${this.jupiterUrl}/quote?inputMint=${a}&outputMint=${ns.toString()}&amount=${o}&swapMode=${p}&slippageBps=100&onlyDirectRoutes=true`;this.maxAccounts&&(m+=`&maxAccounts=${this.maxAccounts}`),d=await uo.get(m,{headers:this.apiKeyHeader?{"x-api-key":this.apiKeyHeader}:void 0})}catch(p){throw p instanceof po&&p.response&&p.response.data&&p.response.data.error?new re(p.response.data.error):new re("Cannot get route")}let A;if(s&&d?.data?.inAmount)A=d.data.inAmount;else if(s)throw new re("Cannot get inAmount");let g;try{g=await uo.post(`${this.jupiterUrl}/swap`,{quoteResponse:d.data,userPublicKey:i,wrapAndUnwrapSol:!0},{headers:this.apiKeyHeader?{"x-api-key":this.apiKeyHeader}:void 0})}catch(p){throw p instanceof po&&p.response&&p.response.data&&p.response.data.error?new re(p.response.data.error):new re("Cannot get swap transaction")}let c;if(g?.data?.swapTransaction)c=g.data.swapTransaction;else throw new re("Cannot get swap transaction");let l=Buffer.from(c,"base64"),u=as.deserialize(l);return s?{tx:u,amountIn:A}:{tx:u}}async amendJupiterWithSdkTx(i,a){try{let o=await pt(i,this.connection),s=await pt(a,this.connection),d=lo.decompile(i.message,{addressLookupTableAccounts:o}),A=lo.decompile(a.message,{addressLookupTableAccounts:s});if(A.instructions.shift(),d.instructions.push(...A.instructions),o.push(...s),i.message=d.compileToV0Message(o),a.message.header.numRequiredSignatures===2&&i.signatures.length===1){let g=a.signatures[0];if(!g)throw new I("Signature is undefined");i.signatures.push(g)}return i}catch(o){throw o instanceof Error&&o.message?new re(`Some error occurred during creation final swap and bridge transaction. ${o.message}`):new re("Some error occurred during creation final swap and bridge transaction")}}};var $i=1e6,bo=1.1,Jn=class extends ne{constructor(a,o,s){super();this.solanaRpcUrl=a;this.params=o;this.api=s;this.jupiterService=new jn(a,o.jupiterParams)}chainType="SOLANA";jupiterService;async buildRawTransactionSwap(a){let o=Ce(this.chainType,a);return await this.buildSwapTransaction(o,a.sourceToken.poolAddress,a.destinationToken.poolAddress,a.txFeeParams)}async buildSwapTransaction(a,o,s,d){let{fromAccountAddress:A,amount:g,contractAddress:c,fromTokenAddress:l,toTokenAddress:u,toAccountAddress:p,minimumReceiveAmount:m}=a,y=A,Y=c,h=l,B=u,W=s,C=p,f=new Q(y),w=it(this.solanaRpcUrl,f.toString()),z=new _i(en,Y,w),L=await Yt(z.programId),ge=await nt(z.programId),E=new Q(h),Fe=await Bt(E,z.programId),Re=new Q(o),Qe=await Se(f,E),Ze=new Q(C),be=new Q(B),Ye=await Bt(be,z.programId),Ge=new Q(W),Ie=await Se(Ze,be),He=[at.ComputeBudgetProgram.setComputeUnitLimit({units:$i})];try{await Wt(Ie,w)}catch{let ur=await os.associatedToken(w).methods.create().accounts({mint:be,owner:Ze,associatedAccount:Ie}).instruction();He.push(ur)}let je=await z.methods.swap(new Tt(g),new Tt(m||0)).accounts({payer:f,config:ge,bridgeAuthority:L,user:f,sendBridgeToken:Fe,sendMint:E,sendPool:Re,sendUserToken:Qe,receiveBridgeToken:Ye,receiveMint:be,receivePool:Ge,receiveUserToken:Ie}).preInstructions(He).transaction(),Ne=w.connection;return je.recentBlockhash=(await Ne.getLatestBlockhash()).blockhash,je.feePayer=f,await ft(je,d,this.solanaRpcUrl),await this.convertToVersionedTransaction(je,Ne)}async buildRawTransactionSend(a){let o=await pe(this.chainType,a,this.api),s=this.addPoolAddress(a,o),d=s.gasFeePaymentMethod=="stablecoin",A;if(d)try{let{tx:l,solTxSendUpdatedParams:u}=await this.processJup(s,a,!0);A=l,s={...s,...u}}catch{try{let{tx:u,solTxSendUpdatedParams:p}=await this.processJup(s,a,!1);A=u,s={...s,...p}}catch(u){throw u instanceof K?u:u instanceof Error&&u.message?new re(`Some error occurred during creation Jupiter swap transaction. ${u.message}`):new re("Some error occurred during creation Jupiter swap transaction")}}let g,c;switch(o.messenger){case 1:{let l=await this.prepareSwapAndBridgeData(s);g=await this.buildSwapAndBridgeAllbridgeTransaction(l);break}case 2:{let l=await this.prepareSwapAndBridgeData(s),{transaction:u,messageAccount:p}=await this.buildSwapAndBridgeWormholeTransaction(l);g=u,c=p;break}case 3:case 4:{let l=await this.prepareSwapAndBridgeCctpData(s),{transaction:u,messageSentEventDataKeypair:p}=await this.buildSwapAndBridgeCctpTransaction(a.destinationToken.chainSymbol,l);g=u,c=p;break}case 5:throw new le("Messenger OFT is not supported yet.")}if(d){if(!A)throw new re("Swap tx is absent");g=await this.jupiterService.amendJupiterWithSdkTx(A,g)}return await go(g,a.txFeeParams,this.solanaRpcUrl),c&&g.sign([c]),g}async processJup(a,o,s){let{fee:d,extraGas:A,gasFeePaymentMethod:g}=await this.convertStableCoinFeeAndExtraGasToNativeCurrency(o.sourceToken,a),c=s?Ve(d):Ve(a.fee);A&&(c=c.plus(A)),s||(c=c.mul(bo));let{tx:l,amountIn:u}=await this.jupiterService.getJupiterSwapTx(o.fromAccountAddress,o.sourceToken.tokenAddress,c.toFixed(0),s),p;if(s){if(!u)throw new re("Cannot get inAmount");p=Ve(a.amount).minus(Ve(u).mul(bo)).toFixed(0)}else p=Ve(a.amount).minus(c).toFixed(0);if(Ve(p).lte(0))throw new ht(`Amount not enough to pay fee, ${F(Ve(p).minus(1).neg(),o.sourceToken.decimals).toFixed()} stables is missing`);return{tx:l,solTxSendUpdatedParams:{amount:p,fee:d,extraGas:A,gasFeePaymentMethod:g}}}addPoolAddress(a,o){return{...o,poolAddress:a.sourceToken.poolAddress}}async convertStableCoinFeeAndExtraGasToNativeCurrency(a,o){if(o.gasFeePaymentMethod=="stablecoin"){let s=(await this.api.getReceiveTransactionCost({sourceChainId:o.fromChainId,destinationChainId:o.toChainId,messenger:o.messenger,sourceToken:a.tokenAddress})).sourceNativeTokenPrice,d=Ve(o.fee).div(s).mul(Ve(10).pow(S.getChainDecimalsByType("SOLANA")-a.decimals)).toFixed(0),A;return o.extraGas&&(A=Ve(o.extraGas).div(s).mul(Ve(10).pow(S.getChainDecimalsByType("SOLANA")-a.decimals)).toFixed(0)),{fee:d,extraGas:A,gasFeePaymentMethod:"native"}}return{fee:o.fee,extraGas:o.extraGas,gasFeePaymentMethod:"native"}}getExtraGasInstruction(a,o,s){return at.SystemProgram.transfer({fromPubkey:o,toPubkey:s,lamports:+a})}async prepareSwapAndBridgeData(a){let{amount:o,contractAddress:s,fromChainId:d,fromAccountAddress:A,fromTokenAddress:g,toChainId:c,toAccountAddress:l,toTokenAddress:u,poolAddress:p,extraGas:m}=a,y=g,Y=A,h=c,B=u,W=l,C=s,f=d,w=it(this.solanaRpcUrl,Y),z=new _i(en,C,w),L=Array.from(tt()),ge=new Q(p),E=await ao(o,z,ge),Fe=await Ua(L,z.programId),Re=await Yt(z.programId),Qe=await Se(new Q(Y),new Q(y)),Ze=await Bt(new Q(y),z.programId),be=await Qi(h,z.programId),Ye=await Ea(h,Buffer.from(B),z.programId),Ge=await nt(z.programId),Ie=await z.account.config.fetch(Ge),He=await _t(h,Ie.gasOracleProgramId),je=await _t(f,Ie.gasOracleProgramId),Ne=oo({amount:E,recipient:Buffer.from(W),nonce:Buffer.from(L),receiveToken:Buffer.from(B),destinationChainId:h,sourceChainId:f,chainBridge:(await Yt(z.programId)).toBuffer()}),x={};return x.bridge=z,x.amount=new Tt(o),x.vusdAmount=new Tt(E),x.nonce=L,x.recipient=Array.from(W),x.receiveToken=Array.from(B),x.poolAccount=ge,x.lockAccount=Fe,x.bridgeAuthority=Re,x.userToken=Qe,x.bridgeTokenAccount=Ze,x.chainBridgeAccount=be,x.otherBridgeTokenAccount=Ye,x.userAccount=new Q(Y),x.destinationChainId=h,x.mint=new Q(y),x.config=Ge,x.configAccountInfo=Ie,x.gasPrice=He,x.thisGasPrice=je,x.message=Ne,m&&(x.extraGasInstruction=this.getExtraGasInstruction(m,x.userAccount,Ge)),x}async buildSwapAndBridgeAllbridgeTransaction(a){let{bridge:o,vusdAmount:s,nonce:d,recipient:A,receiveToken:g,poolAccount:c,lockAccount:l,bridgeAuthority:u,userToken:p,bridgeTokenAccount:m,chainBridgeAccount:y,otherBridgeTokenAccount:Y,userAccount:h,destinationChainId:B,mint:W,config:C,configAccountInfo:f,gasPrice:w,thisGasPrice:z,message:L,extraGasInstruction:ge}=a,E=f.allbridgeMessengerProgramId,Fe=await Ki(B,E),Re=await nt(E),Qe=await _a(L,E),Ze=[];ge&&Ze.push(ge);let be=await o.methods.swapAndBridge({vusdAmount:s,nonce:d,destinationChainId:B,recipient:A,receiveToken:g}).accounts({mint:W,user:h,config:C,lock:l,pool:c,gasPrice:w,thisGasPrice:z,bridgeAuthority:u,userToken:p,bridgeToken:m,chainBridge:y,messenger:E,messengerGasUsage:Fe,messengerConfig:Re,sentMessageAccount:Qe,otherBridgeToken:Y}).preInstructions([at.ComputeBudgetProgram.setComputeUnitLimit({units:$i})]).postInstructions(Ze).transaction(),Ye=it(this.solanaRpcUrl,h.toString()).connection;return be.recentBlockhash=(await Ye.getLatestBlockhash()).blockhash,be.feePayer=h,await this.convertToVersionedTransaction(be,Ye)}async convertToVersionedTransaction(a,o){let s=await o.getAddressLookupTable(new Q(this.params.solanaLookUpTable)).then(A=>A.value);if(!s)throw new I("Cannot find allbridgeLookupTableAccount");let d=new at.TransactionMessage({payerKey:a.feePayer,recentBlockhash:a.recentBlockhash,instructions:a.instructions}).compileToV0Message([s]);return new at.VersionedTransaction(d)}async buildSwapAndBridgeWormholeTransaction(a){let{bridge:o,vusdAmount:s,nonce:d,recipient:A,receiveToken:g,poolAccount:c,lockAccount:l,bridgeAuthority:u,userToken:p,bridgeTokenAccount:m,chainBridgeAccount:y,otherBridgeTokenAccount:Y,userAccount:h,destinationChainId:B,mint:W,config:C,configAccountInfo:f,gasPrice:w,thisGasPrice:z,message:L,extraGasInstruction:ge}=a,E=this.params.wormholeMessengerProgramId,[Fe]=Q.findProgramAddressSync([Buffer.from("Bridge")],new Q(E)),[Re]=Q.findProgramAddressSync([Buffer.from("fee_collector")],new Q(E)),[Qe]=Q.findProgramAddressSync([Buffer.from("Sequence"),u.toBuffer()],new Q(E)),Ze=await Ki(B,f.wormholeMessengerProgramId),be=await nt(f.wormholeMessengerProgramId),Ye=mo.generate(),Ge=it(this.solanaRpcUrl,h.toString()),Ie=await Ge.connection.getAccountInfo(Fe);if(Ie==null)throw new I("Cannot fetch wormhole bridge account info");let He=new Tt(Ie.data.slice(16,24),"le").toString(),je=rs.transfer({fromPubkey:h,toPubkey:Re,lamports:+He}),Ne=[];ge&&Ne.push(ge);let x={mint:W,user:h,config:C,lock:l,pool:c,gasPrice:w,thisGasPrice:z,bridgeAuthority:u,userToken:p,bridgeToken:m,chainBridge:y,otherBridgeToken:Y,messengerGasUsage:Ze,wormholeProgram:E,bridge:Fe,message:Ye.publicKey,wormholeMessenger:f.wormholeMessengerProgramId,sequence:Qe,feeCollector:Re,wormholeMessengerConfig:be,clock:at.SYSVAR_CLOCK_PUBKEY},In=await o.methods.swapAndBridgeWormhole({vusdAmount:s,nonce:d,destinationChainId:B,recipient:A,receiveToken:g}).accounts(x).preInstructions([at.ComputeBudgetProgram.setComputeUnitLimit({units:$i}),je]).postInstructions(Ne).signers([Ye]).transaction();return In.recentBlockhash=(await Ge.connection.getLatestBlockhash()).blockhash,In.feePayer=h,{transaction:await this.convertToVersionedTransaction(In,Ge.connection),messageAccount:Ye}}async prepareSwapAndBridgeCctpData(a){let{contractAddress:o,amount:s,fromAccountAddress:d,fromTokenAddress:A,toChainId:g,toAccountAddress:c,toTokenAddress:l,extraGas:u}=a,p=o;if(!p)throw new ce("Such route does not support CCTP protocol");let m=4,y=d,Y=l,h=c,B=it(this.solanaRpcUrl,y),W=new _i(io,p,B),C=new Q(A),f=await $a(C,W.programId),w=new Q(y),z=await W.account.cctpBridge.fetch(f),L={};return L.cctpBridge=W,L.cctpBridgeAccount=f,L.cctpAddressAccount=new Q(p),L.amount=new Tt(s),L.recipient=Array.from(h),L.receiveToken=Array.from(Y),L.userToken=await Se(w,C),L.bridgeAuthority=await Da(f,W.programId),L.bridgeTokenAccount=await qa(C,W.programId),L.chainBridgeAccount=await Qi(g,W.programId),L.userAccount=w,L.destinationChainId=g,L.mint=C,L.gasPrice=await _t(g,z.gasOracleProgramId),L.thisGasPrice=await _t(m,z.gasOracleProgramId),L.provider=B,u&&(L.extraGasInstruction=this.getExtraGasInstruction(u,L.userAccount,f)),L}async buildSwapAndBridgeCctpTransaction(a,o){let{cctpBridge:s,cctpBridgeAccount:d,amount:A,recipient:g,receiveToken:c,bridgeAuthority:l,userToken:u,bridgeTokenAccount:p,chainBridgeAccount:m,userAccount:y,destinationChainId:Y,mint:h,gasPrice:B,thisGasPrice:W,extraGasInstruction:C,provider:f}=o,w=this.params.cctpParams.cctpDomains[a],z=this.params.cctpParams.cctpTransmitterProgramId,L=this.params.cctpParams.cctpTokenMessengerMinter;if(w==null||!z||!L)throw new I("CCTP is not configured");let ge=new Q(z),E=new Q(L),{messageTransmitterAccount:Fe,tokenMessenger:Re,tokenMessengerEventAuthority:Qe,tokenMinter:Ze,localToken:be,remoteTokenMessengerKey:Ye,authorityPda:Ge}=to(w,h,ge,E),Ie=[];C&&Ie.push(C);let He=mo.generate(),je=eo(s.programId,He.publicKey),Ne=await s.methods.bridge({amount:A,destinationChainId:Y,recipient:g,receiveToken:c}).accounts({mint:h,user:y,cctpBridge:d,messageSentEventData:He.publicKey,lock:je,cctpMessenger:E,messageTransmitterProgram:ge,messageTransmitterAccount:Fe,tokenMessenger:Re,tokenMinter:Ze,localToken:be,remoteTokenMessengerKey:Ye,authorityPda:Ge,eventAuthority:Qe,bridgeToken:p,gasPrice:B,thisGasPrice:W,chainBridge:m,userToken:u,bridgeAuthority:l}).preInstructions([at.ComputeBudgetProgram.setComputeUnitLimit({units:2e6})]).postInstructions(Ie).transaction(),x=f.connection;return Ne.recentBlockhash=(await x.getLatestBlockhash()).blockhash,Ne.feePayer=y,{transaction:await this.convertToVersionedTransaction(Ne,x),messageSentEventDataKeypair:He}}send(a){throw new X}};import{Address as qi,contract as ef}from"@stellar/stellar-sdk";import{Big as As}from"big.js";import{contract as n}from"@stellar/stellar-sdk";var ss=n.Spec,ds=n.Client;var tn=class extends ds{constructor(a){super(new ss(["AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABAAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAApnYXNfb3JhY2xlAAAAAAATAAAAAAAAAAxuYXRpdmVfdG9rZW4AAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAPc3dhcF9hbmRfYnJpZGdlAAAAAAkAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACXJlY2lwaWVudAAAAAAAA+4AAAAgAAAAAAAAABRkZXN0aW5hdGlvbl9jaGFpbl9pZAAAAAQAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAFbm9uY2UAAAAAAAAMAAAAAAAAAApnYXNfYW1vdW50AAAAAAAKAAAAAAAAABBmZWVfdG9rZW5fYW1vdW50AAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOcmVjZWl2ZV90b2tlbnMAAAAAAAgAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAA9zb3VyY2VfY2hhaW5faWQAAAAABAAAAAAAAAANcmVjZWl2ZV90b2tlbgAAAAAAA+4AAAAgAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAAAAAAJZXh0cmFfZ2FzAAAAAAAD6AAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAEc3dhcAAAAAYAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAA+4AAAAgAAAAAAAAAA1yZWNlaXZlX3Rva2VuAAAAAAAD7gAAACAAAAAAAAAACXJlY2lwaWVudAAAAAAAABMAAAAAAAAAEnJlY2VpdmVfYW1vdW50X21pbgAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAJc3RvcF9zd2FwAAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAKc3RhcnRfc3dhcAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOc2V0X2dhc19vcmFjbGUAAAAAAAEAAAAAAAAAC25ld19hZGRyZXNzAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAOc2V0X3JlYmFsYW5jZXIAAAAAAAEAAAAAAAAACnJlYmFsYW5jZXIAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc2V0X21lc3NlbmdlcgAAAAAAAAEAAAAAAAAACW1lc3NlbmdlcgAAAAAAABMAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc2V0X2dhc191c2FnZQAAAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAJZ2FzX3VzYWdlAAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAPcmVnaXN0ZXJfYnJpZGdlAAAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAAOYnJpZGdlX2FkZHJlc3MAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAQYWRkX2JyaWRnZV90b2tlbgAAAAIAAAAAAAAACGNoYWluX2lkAAAABAAAAAAAAAANdG9rZW5fYWRkcmVzcwAAAAAAA+4AAAAgAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAATcmVtb3ZlX2JyaWRnZV90b2tlbgAAAAACAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAIYWRkX3Bvb2wAAAACAAAAAAAAAARwb29sAAAAEwAAAAAAAAAFdG9rZW4AAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAATd2l0aGRyYXdfZ2FzX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAfd2l0aGRyYXdfYnJpZGdpbmdfZmVlX2luX3Rva2VucwAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAVaGFzX3Byb2Nlc3NlZF9tZXNzYWdlAAAAAAAAAQAAAAAAAAAHbWVzc2FnZQAAAAPuAAAAIAAAAAEAAAPpAAAAAQAAAAM=","AAAAAAAAAAAAAAAUaGFzX3JlY2VpdmVkX21lc3NhZ2UAAAABAAAAAAAAAAdtZXNzYWdlAAAAA+4AAAAgAAAAAQAAA+kAAAABAAAAAw==","AAAAAAAAAAAAAAAQZ2V0X3Bvb2xfYWRkcmVzcwAAAAEAAAAAAAAADXRva2VuX2FkZHJlc3MAAAAAAAPuAAAAIAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAKZ2V0X2NvbmZpZwAAAAAAAAAAAAEAAAPpAAAH0AAAAAZCcmlkZ2UAAAAAAAM=","AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==","AAAAAAAAAAAAAAAUZ2V0X3RyYW5zYWN0aW9uX2Nvc3QAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAAAoAAAAD","AAAAAAAAAAAAAAANZ2V0X2dhc191c2FnZQAAAAAAAAEAAAAAAAAACGNoYWluX2lkAAAABAAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAOZ2V0X2dhc19vcmFjbGUAAAAAAAAAAAABAAAD6QAAABMAAAAD","AAAAAAAAAAAAAAASZ2V0X2Fub3RoZXJfYnJpZGdlAAAAAAABAAAAAAAAAAhjaGFpbl9pZAAAAAQAAAABAAAD6QAAB9AAAAANQW5vdGhlckJyaWRnZQAAAAAAAAM=","AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAQAAAAAAAAAAAAAAB1N3YXBwZWQAAAAABgAAAAAAAAAOcmVjZWl2ZV9hbW91bnQAAAAAAAoAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAAEwAAAAAAAAALc2VuZF9hbW91bnQAAAAACgAAAAAAAAAKc2VuZF90b2tlbgAAAAAD7gAAACAAAAAAAAAABnNlbmRlcgAAAAAAEw==","AAAAAQAAAAAAAAAAAAAAClRva2Vuc1NlbnQAAAAAAAUAAAAAAAAABmFtb3VudAAAAAAACgAAAAAAAAAUZGVzdGluYXRpb25fY2hhaW5faWQAAAAEAAAAAAAAAAVub25jZQAAAAAAAAwAAAAAAAAADXJlY2VpdmVfdG9rZW4AAAAAAAPuAAAAIAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=","AAAAAQAAAAAAAAAAAAAADlRva2Vuc1JlY2VpdmVkAAAAAAAEAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAB21lc3NhZ2UAAAAD7gAAACAAAAAAAAAABW5vbmNlAAAAAAAADAAAAAAAAAAJcmVjaXBpZW50AAAAAAAD7gAAACA=","AAAAAQAAAAAAAAAAAAAAClJlY2VpdmVGZWUAAAAAAAMAAAAAAAAAF2JyaWRnZV90cmFuc2FjdGlvbl9jb3N0AAAAAAoAAAAAAAAACWV4dHJhX2dhcwAAAAAAAAoAAAAAAAAAGG1lc3NhZ2VfdHJhbnNhY3Rpb25fY29zdAAAAAo=","AAAAAQAAAAAAAAAAAAAAFUJyaWRnaW5nRmVlRnJvbVRva2VucwAAAAAAAAIAAAAAAAAAEGZlZV90b2tlbl9hbW91bnQAAAAKAAAAAAAAAANnYXMAAAAACg==","AAAAAQAAAAAAAAAAAAAADUFub3RoZXJCcmlkZ2UAAAAAAAACAAAAAAAAAAdhZGRyZXNzAAAAA+4AAAAgAAAAAAAAAAZ0b2tlbnMAAAAAA+wAAAPuAAAAIAAAAAE=","AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAABgAAAGBwcmVjb21wdXRlZCB2YWx1ZXMgb2YgdGhlIHNjYWxpbmcgZmFjdG9yIHJlcXVpcmVkIGZvciBwYXlpbmcgdGhlIGJyaWRnaW5nIGZlZSB3aXRoIHN0YWJsZSB0b2tlbnMAAAAeYnJpZGdpbmdfZmVlX2NvbnZlcnNpb25fZmFjdG9yAAAAAAPsAAAAEwAAAAoAAAAAAAAACGNhbl9zd2FwAAAAAQAAAGxwcmVjb21wdXRlZCB2YWx1ZXMgdG8gZGl2aWRlIGJ5IHRvIGNoYW5nZSB0aGUgcHJlY2lzaW9uIGZyb20gdGhlIEdhcyBPcmFjbGUgcHJlY2lzaW9uIHRvIHRoZSB0b2tlbiBwcmVjaXNpb24AAAAWZnJvbV9nYXNfb3JhY2xlX2ZhY3RvcgAAAAAD7AAAABMAAAAKAAAAAAAAAAltZXNzZW5nZXIAAAAAAAATAAAAAAAAAAVwb29scwAAAAAAA+wAAAPuAAAAIAAAABMAAAAAAAAACnJlYmFsYW5jZXIAAAAAABM=","AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAwAAAAEAAAAAAAAAC090aGVyQnJpZGdlAAAAAAEAAAAEAAAAAQAAAAAAAAALU2VudE1lc3NhZ2UAAAAAAQAAA+4AAAAgAAAAAQAAAAAAAAAPUmVjZWl2ZWRNZXNzYWdlAAAAAAEAAAPuAAAAIA==","AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==","AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT","AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ"]),a);this.options=a}fromJSON={initialize:this.txFromJSON,swap_and_bridge:this.txFromJSON,receive_tokens:this.txFromJSON,swap:this.txFromJSON,stop_swap:this.txFromJSON,start_swap:this.txFromJSON,set_gas_oracle:this.txFromJSON,set_stop_authority:this.txFromJSON,set_rebalancer:this.txFromJSON,set_messenger:this.txFromJSON,set_gas_usage:this.txFromJSON,register_bridge:this.txFromJSON,add_bridge_token:this.txFromJSON,remove_bridge_token:this.txFromJSON,add_pool:this.txFromJSON,withdraw_gas_tokens:this.txFromJSON,withdraw_bridging_fee_in_tokens:this.txFromJSON,has_processed_message:this.txFromJSON,has_received_message:this.txFromJSON,get_pool_address:this.txFromJSON,get_config:this.txFromJSON,get_stop_authority:this.txFromJSON,get_transaction_cost:this.txFromJSON,get_gas_usage:this.txFromJSON,get_admin:this.txFromJSON,get_gas_oracle:this.txFromJSON,get_another_bridge:this.txFromJSON,set_admin:this.txFromJSON,upgrade:this.txFromJSON}};var kn=class extends ne{constructor(a,o,s){super();this.nodeRpcUrlsConfig=a;this.params=o;this.api=s}chainType="SRB";async buildRawTransactionSend(a){let o=await pe(this.chainType,a,this.api);return await this.buildRawTransactionSendFromParams(o)}async buildRawTransactionSendFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toChainId:g,toAccountAddress:c,toTokenAddress:l,fee:u,gasFeePaymentMethod:p,extraGas:m}=a,y=u;m&&(y=As(y).plus(m).toFixed());let Y=this.getContract(tn,s,d),h;return p==="stablecoin"?h=await Y.swap_and_bridge({sender:d,token:qi.contract(Buffer.from(A)).toString(),amount:BigInt(o),recipient:Buffer.from(c),destination_chain_id:+g,receive_token:Buffer.from(l),nonce:ze(),gas_amount:BigInt(0),fee_token_amount:BigInt(y)}):h=await Y.swap_and_bridge({sender:d,token:qi.contract(Buffer.from(A)).toString(),amount:BigInt(o),recipient:Buffer.from(c),destination_chain_id:+g,receive_token:Buffer.from(l),nonce:ze(),gas_amount:BigInt(y),fee_token_amount:BigInt(0)}),h.toXDR()}async buildRawTransactionSwap(a){let o=Ce(this.chainType,a);return await this.buildRawTransactionSwapFromParams(o)}async buildRawTransactionSwapFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toAccountAddress:g,toTokenAddress:c,minimumReceiveAmount:l}=a;return(await this.getContract(tn,s,d).swap({sender:d,amount:BigInt(o),token:qi.contract(Buffer.from(A)).toBuffer(),receive_token:Buffer.from(c),recipient:g,receive_amount_min:BigInt(l)})).toXDR()}send(a){throw new X}getContract(a,o,s){let d={publicKey:s,contractId:o,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new a(d)}};import{ClarigenClient as us,contractFactory as Co}from"@clarigen/core";import{makeRandomPrivKey as yo,makeUnsignedContractCall as Io,parseContractId as ps,PostConditionMode as ho,privateKeyToPublic as vo}from"@stacks/transactions";var Me={bridge:{functions:{assertCanSwap:{name:"assert-can-swap",access:"private",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},assertGasOracle:{name:"assert-gas-oracle",access:"private",args:[{name:"gas-oracle-ref",type:"trait_reference"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},assertMessenger:{name:"assert-messenger",access:"private",args:[{name:"messenger-ref",type:"trait_reference"},{name:"messenger-id",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},convertBridgingFeeInTokensToNative:{name:"convert-bridging-fee-in-tokens-to-native",access:"private",args:[{name:"ft-ref",type:"trait_reference"},{name:"gas-oracle-ref",type:"trait_reference"},{name:"fee-token-amount",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},onlyOwner:{name:"only-owner",access:"private",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},onlyStopAuthority:{name:"only-stop-authority",access:"private",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},receiveAndSwapFromVusd:{name:"receive-and-swap-from-vusd",access:"private",args:[{name:"pool-ref",type:"trait_reference"},{name:"ft-ref",type:"trait_reference"},{name:"recipient",type:"principal"},{name:"vusd-amount",type:"uint128"},{name:"receive-amount-min",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},sendAndSwapToVusd:{name:"send-and-swap-to-vusd",access:"private",args:[{name:"pool-ref",type:"trait_reference"},{name:"ft-ref",type:"trait_reference"},{name:"user",type:"principal"},{name:"amount",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},sendTokens:{name:"send-tokens",access:"private",args:[{name:"messenger-ref",type:"trait_reference"},{name:"gas-oracle-ref",type:"trait_reference"},{name:"amount",type:"uint128"},{name:"recipient",type:{buffer:{length:32}}},{name:"destination-chain-id",type:"uint128"},{name:"receive-token",type:{buffer:{length:32}}},{name:"nonce",type:{buffer:{length:32}}},{name:"messenger-id",type:"uint128"},{name:"bridging-fee",type:"uint128"}],outputs:{type:{response:{ok:{tuple:[{name:"bridge-tx-cost",type:"uint128"},{name:"message-tx-cost",type:"uint128"}]},error:"uint128"}}}},addBridgeToken:{name:"add-bridge-token",access:"public",args:[{name:"chain-id_",type:"uint128"},{name:"token-address",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},addPool:{name:"add-pool",access:"public",args:[{name:"pool-ref",type:"trait_reference"},{name:"ft-ref",type:"trait_reference"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},getTransactionCost:{name:"get-transaction-cost",access:"public",args:[{name:"gas-oracle-ref",type:"trait_reference"},{name:"chain-id_",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},init:{name:"init",access:"public",args:[{name:"this-chain-id_",type:"uint128"},{name:"gas-oracle",type:"principal"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},receiveTokens:{name:"receive-tokens",access:"public",args:[{name:"messenger-ref",type:"trait_reference"},{name:"amount",type:"uint128"},{name:"recipient",type:"principal"},{name:"source-chain-id",type:"uint128"},{name:"pool-ref",type:"trait_reference"},{name:"ft-ref",type:"trait_reference"},{name:"nonce",type:{buffer:{length:32}}},{name:"messenger-id",type:"uint128"},{name:"receive-amount-min",type:"uint128"},{name:"extra-gas",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},registerBridge:{name:"register-bridge",access:"public",args:[{name:"chain-id_",type:"uint128"},{name:"bridge-address",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},removeBridge:{name:"remove-bridge",access:"public",args:[{name:"chain-id_",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},removeBridgeToken:{name:"remove-bridge-token",access:"public",args:[{name:"chain-id_",type:"uint128"},{name:"token-address",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},removeMessenger:{name:"remove-messenger",access:"public",args:[{name:"messenger-id",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setGasUsage:{name:"set-gas-usage",access:"public",args:[{name:"chain-id_",type:"uint128"},{name:"gas",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setMessenger:{name:"set-messenger",access:"public",args:[{name:"messenger-id",type:"uint128"},{name:"new-messenger",type:"principal"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setOwner:{name:"set-owner",access:"public",args:[{name:"new-owner",type:"principal"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setRebalancer:{name:"set-rebalancer",access:"public",args:[{name:"new-rebalancer",type:"principal"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setStopAuthority:{name:"set-stop-authority",access:"public",args:[{name:"new-authority",type:"principal"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},startSwap:{name:"start-swap",access:"public",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},stopSwap:{name:"stop-swap",access:"public",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},swap:{name:"swap",access:"public",args:[{name:"amount",type:"uint128"},{name:"send-pool-ref",type:"trait_reference"},{name:"send-ft-ref",type:"trait_reference"},{name:"receive-pool-ref",type:"trait_reference"},{name:"receive-ft-ref",type:"trait_reference"},{name:"recipient",type:"principal"},{name:"receive-amount-min",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},swapAndBridge:{name:"swap-and-bridge",access:"public",args:[{name:"pool-ref",type:"trait_reference"},{name:"ft-ref",type:"trait_reference"},{name:"messenger-ref",type:"trait_reference"},{name:"gas-oracle-ref",type:"trait_reference"},{name:"amount",type:"uint128"},{name:"recipient",type:{buffer:{length:32}}},{name:"destination-chain-id",type:"uint128"},{name:"receive-token",type:{buffer:{length:32}}},{name:"nonce",type:{buffer:{length:32}}},{name:"messenger-id",type:"uint128"},{name:"fee-native-amount",type:"uint128"},{name:"fee-token-amount",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},withdrawBridgingFeeInTokens:{name:"withdraw-bridging-fee-in-tokens",access:"public",args:[{name:"ft-ref",type:"trait_reference"},{name:"amount",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},withdrawGasTokens:{name:"withdraw-gas-tokens",access:"public",args:[{name:"amount",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},getGasOracleAddress:{name:"get-gas-oracle-address",access:"read_only",args:[],outputs:{type:"principal"}},getGasUsage:{name:"get-gas-usage",access:"read_only",args:[{name:"chain-id_",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},getMessenger:{name:"get-messenger",access:"read_only",args:[{name:"messenger-id",type:"uint128"}],outputs:{type:{response:{ok:"principal",error:"uint128"}}}},getOtherBridge:{name:"get-other-bridge",access:"read_only",args:[{name:"chain-id_",type:"uint128"}],outputs:{type:{response:{ok:{buffer:{length:32}},error:"uint128"}}}},getOwner:{name:"get-owner",access:"read_only",args:[],outputs:{type:"principal"}},getProcessedMessageStatus:{name:"get-processed-message-status",access:"read_only",args:[{name:"message-hash",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:"bool",error:"none"}}}},getRebalancer:{name:"get-rebalancer",access:"read_only",args:[],outputs:{type:"principal"}},getSentMessageStatus:{name:"get-sent-message-status",access:"read_only",args:[{name:"message-hash",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:"bool",error:"none"}}}},getStopAuthority:{name:"get-stop-authority",access:"read_only",args:[],outputs:{type:"principal"}},getThisChainId:{name:"get-this-chain-id",access:"read_only",args:[],outputs:{type:"uint128"}},getTokenInfo:{name:"get-token-info",access:"read_only",args:[{name:"token-principal-hash",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:{tuple:[{name:"bridging-fee-conversion-scaling-factor",type:"uint128"},{name:"from-gas-oracle-scaling-factor",type:"uint128"},{name:"pool",type:"principal"},{name:"token",type:"principal"}]},error:"uint128"}}}},isBridgeTokenSupported:{name:"is-bridge-token-supported",access:"read_only",args:[{name:"chain-id_",type:"uint128"},{name:"token-address",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:"bool",error:"none"}}}},isSwapEnabled:{name:"is-swap-enabled",access:"read_only",args:[],outputs:{type:"bool"}}},maps:{gasUsageMap:{name:"gas-usage-map",key:"uint128",value:"uint128"},messengers:{name:"messengers",key:"uint128",value:"principal"},otherBridgeTokens:{name:"other-bridge-tokens",key:{tuple:[{name:"chain-id",type:"uint128"},{name:"token-address",type:{buffer:{length:32}}}]},value:"bool"},otherBridges:{name:"other-bridges",key:"uint128",value:{buffer:{length:32}}},processedMessages:{name:"processed-messages",key:{buffer:{length:32}},value:"bool"},sentMessages:{name:"sent-messages",key:{buffer:{length:32}},value:"bool"},tokenInfos:{name:"token-infos",key:{buffer:{length:32}},value:{tuple:[{name:"bridging-fee-conversion-scaling-factor",type:"uint128"},{name:"from-gas-oracle-scaling-factor",type:"uint128"},{name:"pool",type:"principal"},{name:"token",type:"principal"}]}}},variables:{chainPrecision:{name:"chain-precision",type:"uint128",access:"constant"},errAlreadyInitialized:{name:"err-already-initialized",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errAlreadyProcessed:{name:"err-already-processed",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errAlreadySent:{name:"err-already-sent",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errBridgeSourceNotRegistered:{name:"err-bridge-source-not-registered",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errDepositAmountTooSmall:{name:"err-deposit-amount-too-small",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errGasUsageNotSet:{name:"err-gas-usage-not-set",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errMessengerNotRegistered:{name:"err-messenger-not-registered",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errNoMessage:{name:"err-no-message",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errNotEnoughFee:{name:"err-not-enough-fee",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errNotInitialized:{name:"err-not-initialized",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errSwapProhibited:{name:"err-swap-prohibited",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errTokenNotSupported:{name:"err-token-not-supported",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errUnauthorized:{name:"err-unauthorized",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errWrongGasOracle:{name:"err-wrong-gas-oracle",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errWrongMessenger:{name:"err-wrong-messenger",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errWrongTokenForPool:{name:"err-wrong-token-for-pool",type:{response:{ok:"none",error:"uint128"}},access:"constant"},oraclePrecision:{name:"oracle-precision",type:"uint128",access:"constant"},canSwap:{name:"can-swap",type:"bool",access:"variable"},gasOraclePrincipal:{name:"gas-oracle-principal",type:{optional:"principal"},access:"variable"},owner:{name:"owner",type:"principal",access:"variable"},rebalancer:{name:"rebalancer",type:"principal",access:"variable"},stopAuthority:{name:"stop-authority",type:"principal",access:"variable"},thisChainId:{name:"this-chain-id",type:{optional:"uint128"},access:"variable"}},constants:{canSwap:!1,chainPrecision:6n,errAlreadyInitialized:{isOk:!1,value:1004n},errAlreadyProcessed:{isOk:!1,value:1010n},errAlreadySent:{isOk:!1,value:1005n},errBridgeSourceNotRegistered:{isOk:!1,value:1009n},errDepositAmountTooSmall:{isOk:!1,value:1001n},errGasUsageNotSet:{isOk:!1,value:1008n},errMessengerNotRegistered:{isOk:!1,value:1014n},errNoMessage:{isOk:!1,value:1011n},errNotEnoughFee:{isOk:!1,value:1007n},errNotInitialized:{isOk:!1,value:1006n},errSwapProhibited:{isOk:!1,value:1012n},errTokenNotSupported:{isOk:!1,value:1002n},errUnauthorized:{isOk:!1,value:1000n},errWrongGasOracle:{isOk:!1,value:1013n},errWrongMessenger:{isOk:!1,value:1015n},errWrongTokenForPool:{isOk:!1,value:1003n},gasOraclePrincipal:null,oraclePrecision:18n,owner:"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",rebalancer:"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",stopAuthority:"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",thisChainId:null},non_fungible_tokens:[],fungible_tokens:[],epoch:"Epoch31",clarity_version:"Clarity3",contractName:"bridge"},ftToken:{functions:{getTokenUri:{name:"get-token-uri",access:"public",args:[],outputs:{type:{response:{ok:{optional:{"string-utf8":{length:19}}},error:"none"}}}},mint:{name:"mint",access:"public",args:[{name:"amount",type:"uint128"},{name:"recipient",type:"principal"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},transfer:{name:"transfer",access:"public",args:[{name:"amount",type:"uint128"},{name:"sender",type:"principal"},{name:"recipient",type:"principal"},{name:"memo",type:{optional:{buffer:{length:34}}}}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},getBalance:{name:"get-balance",access:"read_only",args:[{name:"owner",type:"principal"}],outputs:{type:{response:{ok:"uint128",error:"none"}}}},getDecimals:{name:"get-decimals",access:"read_only",args:[],outputs:{type:{response:{ok:"uint128",error:"none"}}}},getName:{name:"get-name",access:"read_only",args:[],outputs:{type:{response:{ok:{"string-ascii":{length:13}},error:"none"}}}},getSymbol:{name:"get-symbol",access:"read_only",args:[],outputs:{type:{response:{ok:{"string-ascii":{length:7}},error:"none"}}}},getTotalSupply:{name:"get-total-supply",access:"read_only",args:[],outputs:{type:{response:{ok:"uint128",error:"none"}}}}},maps:{},variables:{},constants:{},non_fungible_tokens:[],fungible_tokens:[{name:"example-token"}],epoch:"Epoch31",clarity_version:"Clarity3",contractName:"ft-token"},gasOracle:{functions:{setChainData:{name:"set-chain-data",access:"public",args:[{name:"chain-id_",type:"uint128"},{name:"new-price",type:"uint128"},{name:"new-gas-price",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setGasPrice:{name:"set-gas-price",access:"public",args:[{name:"chain-id_",type:"uint128"},{name:"new-gas-price",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setPrice:{name:"set-price",access:"public",args:[{name:"chain-id_",type:"uint128"},{name:"new-price",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},crossRate:{name:"cross-rate",access:"read_only",args:[{name:"other-chain-id",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},getChainData:{name:"get-chain-data",access:"read_only",args:[{name:"chain-id_",type:"uint128"}],outputs:{type:{response:{ok:{tuple:[{name:"gas-price",type:"uint128"},{name:"price",type:"uint128"}]},error:"uint128"}}}},getGasPrice:{name:"get-gas-price",access:"read_only",args:[{name:"chain-id_",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},getPrice:{name:"get-price",access:"read_only",args:[{name:"chain-id_",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},getTransactionGasCostInNativeToken:{name:"get-transaction-gas-cost-in-native-token",access:"read_only",args:[{name:"other-chain-id",type:"uint128"},{name:"gas-amount",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},getTransactionGasCostInUsd:{name:"get-transaction-gas-cost-in-usd",access:"read_only",args:[{name:"other-chain-id",type:"uint128"},{name:"gas-amount",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}}},maps:{chainData:{name:"chain-data",key:"uint128",value:{tuple:[{name:"gas-price",type:"uint128"},{name:"price",type:"uint128"}]}}},variables:{errNotFound:{name:"err-not-found",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errUnauthorized:{name:"err-unauthorized",type:{response:{ok:"none",error:"uint128"}},access:"constant"},oracleScalingFactor:{name:"oracle-scaling-factor",type:"uint128",access:"constant"},contractOwner:{name:"contract-owner",type:"principal",access:"variable"},fromOracleToChainScalingFactor:{name:"from-oracle-to-chain-scaling-factor",type:"uint128",access:"variable"},thisChainId:{name:"this-chain-id",type:"uint128",access:"variable"}},constants:{contractOwner:"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",errNotFound:{isOk:!1,value:4001n},errUnauthorized:{isOk:!1,value:4000n},fromOracleToChainScalingFactor:1000000000000n,oracleScalingFactor:1000000000000000000n,thisChainId:16n},non_fungible_tokens:[],fungible_tokens:[],epoch:"Epoch31",clarity_version:"Clarity3",contractName:"gas-oracle"},gasOracleTrait:{functions:{},maps:{},variables:{},constants:{},non_fungible_tokens:[],fungible_tokens:[],epoch:"Epoch31",clarity_version:"Clarity3",contractName:"gas-oracle-trait"},messenger:{functions:{assertGasOracle:{name:"assert-gas-oracle",access:"private",args:[{name:"gas-oracle-ref",type:"trait_reference"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},onlyOwner:{name:"only-owner",access:"private",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},addSecondaryValidator:{name:"add-secondary-validator",access:"public",args:[{name:"val",type:{buffer:{length:33}}}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},getTransactionCost:{name:"get-transaction-cost",access:"public",args:[{name:"gas-oracle-ref",type:"trait_reference"},{name:"chain-id_",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},init:{name:"init",access:"public",args:[{name:"this-chain-id_",type:"uint128"},{name:"gas-oracle",type:"principal"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},receiveMessage:{name:"receive-message",access:"public",args:[{name:"message",type:{buffer:{length:32}}},{name:"signature1",type:{buffer:{length:65}}},{name:"signature2",type:{buffer:{length:65}}}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},removeSecondaryValidator:{name:"remove-secondary-validator",access:"public",args:[{name:"val",type:{buffer:{length:33}}}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},sendMessage:{name:"send-message",access:"public",args:[{name:"gas-oracle-ref",type:"trait_reference"},{name:"message",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},setGasUsage:{name:"set-gas-usage",access:"public",args:[{name:"chain-id_",type:"uint128"},{name:"gas",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setOtherChainIds:{name:"set-other-chain-ids",access:"public",args:[{name:"value",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setPrimaryValidator:{name:"set-primary-validator",access:"public",args:[{name:"val",type:{buffer:{length:33}}}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},withdrawGasTokens:{name:"withdraw-gas-tokens",access:"public",args:[{name:"amount",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},getGasOracle:{name:"get-gas-oracle",access:"read_only",args:[],outputs:{type:{response:{ok:"principal",error:"uint128"}}}},getGasUsage:{name:"get-gas-usage",access:"read_only",args:[{name:"chain-id_",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},getOtherChainIds:{name:"get-other-chain-ids",access:"read_only",args:[],outputs:{type:{response:{ok:{buffer:{length:32}},error:"none"}}}},getSentMessageBlock:{name:"get-sent-message-block",access:"read_only",args:[{name:"message",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},getThisChainId:{name:"get-this-chain-id",access:"read_only",args:[],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},isMessageReceived:{name:"is-message-received",access:"read_only",args:[{name:"message",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:"bool",error:"none"}}}}},maps:{gasUsageMap:{name:"gas-usage-map",key:"uint128",value:"uint128"},receivedMessages:{name:"received-messages",key:{buffer:{length:32}},value:"bool"},secondaryValidators:{name:"secondary-validators",key:{buffer:{length:33}},value:"bool"},sentMessagesBlock:{name:"sent-messages-block",key:{buffer:{length:32}},value:"uint128"}},variables:{errAlreadyInitialized:{name:"err-already-initialized",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errAlreadySent:{name:"err-already-sent",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errGasUsageNotSet:{name:"err-gas-usage-not-set",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errInvalidChainId:{name:"err-invalid-chain-id",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errInvalidDestination:{name:"err-invalid-destination",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errInvalidPrimary:{name:"err-invalid-primary",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errInvalidSecondary:{name:"err-invalid-secondary",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errMessageNotFound:{name:"err-message-not-found",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errNotInitialized:{name:"err-not-initialized",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errUnauthorized:{name:"err-unauthorized",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errWrongBufferLength:{name:"err-wrong-buffer-length",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errWrongGasOracle:{name:"err-wrong-gas-oracle",type:{response:{ok:"none",error:"uint128"}},access:"constant"},gasOraclePrincipal:{name:"gas-oracle-principal",type:{optional:"principal"},access:"variable"},otherChainIds:{name:"other-chain-ids",type:{buffer:{length:32}},access:"variable"},owner:{name:"owner",type:"principal",access:"variable"},primaryValidator:{name:"primary-validator",type:{buffer:{length:33}},access:"variable"},thisChainId:{name:"this-chain-id",type:{optional:"uint128"},access:"variable"}},constants:{errAlreadyInitialized:{isOk:!1,value:3008n},errAlreadySent:{isOk:!1,value:3003n},errGasUsageNotSet:{isOk:!1,value:3010n},errInvalidChainId:{isOk:!1,value:3002n},errInvalidDestination:{isOk:!1,value:3004n},errInvalidPrimary:{isOk:!1,value:3005n},errInvalidSecondary:{isOk:!1,value:3006n},errMessageNotFound:{isOk:!1,value:3001n},errNotInitialized:{isOk:!1,value:3011n},errUnauthorized:{isOk:!1,value:3000n},errWrongBufferLength:{isOk:!1,value:3009n},errWrongGasOracle:{isOk:!1,value:3007n},gasOraclePrincipal:null,otherChainIds:Uint8Array.from([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),owner:"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",primaryValidator:Uint8Array.from([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),thisChainId:null},non_fungible_tokens:[],fungible_tokens:[],epoch:"Epoch31",clarity_version:"Clarity3",contractName:"messenger"},messengerTrait:{functions:{},maps:{},variables:{},constants:{},non_fungible_tokens:[],fungible_tokens:[],epoch:"Epoch31",clarity_version:"Clarity3",contractName:"messenger-trait"},pool:{functions:{addRewards:{name:"add-rewards",access:"private",args:[{name:"amount",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"none"}}}},assertBalanceReatio:{name:"assert-balance-reatio",access:"private",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},assertCanDeposit:{name:"assert-can-deposit",access:"private",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},assertCanSwap:{name:"assert-can-swap",access:"private",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},assertCanWithdraw:{name:"assert-can-withdraw",access:"private",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},assertToken:{name:"assert-token",access:"private",args:[{name:"ft-ref",type:"trait_reference"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},depositLp:{name:"deposit-lp",access:"private",args:[{name:"ft-ref",type:"trait_reference"},{name:"to",type:"principal"},{name:"lp-amount",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},leCube_q:{name:"le-cube?",access:"private",args:[{name:"x",type:"uint128"},{name:"n",type:"uint128"}],outputs:{type:"bool"}},newtonStep:{name:"newton-step",access:"private",args:[{name:"n",type:"uint128"},{name:"x",type:"uint128"}],outputs:{type:"uint128"}},onlyBridge:{name:"only-bridge",access:"private",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},onlyOwner:{name:"only-owner",access:"private",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},onlyStopAuthority:{name:"only-stop-authority",access:"private",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},refine:{name:"refine",access:"private",args:[{name:"n",type:"uint128"},{name:"x",type:"uint128"}],outputs:{type:"uint128"}},withdrawLp:{name:"withdraw-lp",access:"private",args:[{name:"ft-ref",type:"trait_reference"},{name:"from",type:"principal"},{name:"lp-amount",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},adjustTotalLpAmount:{name:"adjust-total-lp-amount",access:"public",args:[{name:"ft-ref",type:"trait_reference"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},claimAdminFee:{name:"claim-admin-fee",access:"public",args:[{name:"ft-ref",type:"trait_reference"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},claimRewards:{name:"claim-rewards",access:"public",args:[{name:"ft-ref",type:"trait_reference"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},deposit:{name:"deposit",access:"public",args:[{name:"amount",type:"uint128"},{name:"ft-ref",type:"trait_reference"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},init:{name:"init",access:"public",args:[{name:"token",type:"trait_reference"},{name:"bridge-address",type:"principal"},{name:"fee-share-bp-arg",type:"uint128"},{name:"balance-ratio-min-bp-arg",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},serBalanceRetioMinBp:{name:"ser-balance-retio-min-bp",access:"public",args:[{name:"new-balance-ratio-min-bp",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setAdminFeeSahreBp:{name:"set-admin-fee-sahre-bp",access:"public",args:[{name:"new-admin-fee-share-bp",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setBridge:{name:"set-bridge",access:"public",args:[{name:"new-bridge",type:"principal"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setFeeShare:{name:"set-fee-share",access:"public",args:[{name:"fee-share-bp_",type:"uint128"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setOwner:{name:"set-owner",access:"public",args:[{name:"new-owner",type:"principal"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},setStopAuthority:{name:"set-stop-authority",access:"public",args:[{name:"new-stop-authority",type:"principal"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},startDeposit:{name:"start-deposit",access:"public",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},startSwap:{name:"start-swap",access:"public",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},startWithdraw:{name:"start-withdraw",access:"public",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},stopDeposit:{name:"stop-deposit",access:"public",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},stopSwap:{name:"stop-swap",access:"public",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},stopWithdraw:{name:"stop-withdraw",access:"public",args:[],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},swapFromVusd:{name:"swap-from-vusd",access:"public",args:[{name:"ft-ref",type:"trait_reference"},{name:"user",type:"principal"},{name:"amount",type:"uint128"},{name:"receive-amount-min",type:"uint128"},{name:"zero-fee",type:"bool"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},swapToVusd:{name:"swap-to-vusd",access:"public",args:[{name:"ft-ref",type:"trait_reference"},{name:"user",type:"principal"},{name:"amount",type:"uint128"},{name:"zero-fee",type:"bool"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},withdraw:{name:"withdraw",access:"public",args:[{name:"amount-lp",type:"uint128"},{name:"ft-ref",type:"trait_reference"}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},calcD:{name:"calc-d",access:"read_only",args:[{name:"x",type:"uint128"},{name:"y",type:"uint128"}],outputs:{type:"uint128"}},calcY:{name:"calc-y",access:"read_only",args:[{name:"x",type:"uint128"},{name:"d_",type:"uint128"}],outputs:{type:"uint128"}},cbrt:{name:"cbrt",access:"read_only",args:[{name:"n",type:"uint128"}],outputs:{type:"uint128"}},fromSystemPrecision:{name:"from-system-precision",access:"read_only",args:[{name:"amount",type:"uint128"}],outputs:{type:"uint128"}},getAccRewardPerShareP:{name:"get-acc-reward-per-share-p",access:"read_only",args:[],outputs:{type:"uint128"}},getAdminFeeAmount:{name:"get-admin-fee-amount",access:"read_only",args:[],outputs:{type:"uint128"}},getAdminFeeShareBp:{name:"get-admin-fee-share-bp",access:"read_only",args:[],outputs:{type:"uint128"}},getBalanceRatioMinBp:{name:"get-balance-ratio-min-bp",access:"read_only",args:[],outputs:{type:"uint128"}},getBridge:{name:"get-bridge",access:"read_only",args:[],outputs:{type:{optional:"principal"}}},getCanDeposit:{name:"get-can-deposit",access:"read_only",args:[],outputs:{type:"bool"}},getCanSwap:{name:"get-can-swap",access:"read_only",args:[],outputs:{type:"bool"}},getCanWithdraw:{name:"get-can-withdraw",access:"read_only",args:[],outputs:{type:"bool"}},getD:{name:"get-d",access:"read_only",args:[],outputs:{type:"uint128"}},getFeeShareBp:{name:"get-fee-share-bp",access:"read_only",args:[],outputs:{type:"uint128"}},getLpBalance:{name:"get-lp-balance",access:"read_only",args:[{name:"user",type:"principal"}],outputs:{type:"uint128"}},getLpTotalSupply:{name:"get-lp-total-supply",access:"read_only",args:[],outputs:{type:"uint128"}},getOwner:{name:"get-owner",access:"read_only",args:[],outputs:{type:"principal"}},getReserves:{name:"get-reserves",access:"read_only",args:[],outputs:{type:"uint128"}},getStopAuthority:{name:"get-stop-authority",access:"read_only",args:[],outputs:{type:"principal"}},getTokenAddress:{name:"get-token-address",access:"read_only",args:[],outputs:{type:{response:{ok:"principal",error:"uint128"}}}},getTokenBalance:{name:"get-token-balance",access:"read_only",args:[],outputs:{type:"uint128"}},getUserRewardDebt:{name:"get-user-reward-debt",access:"read_only",args:[{name:"user",type:"principal"}],outputs:{type:"uint128"}},getVusdBalance:{name:"get-vusd-balance",access:"read_only",args:[],outputs:{type:"uint128"}},pendingRewards:{name:"pending-rewards",access:"read_only",args:[{name:"user",type:"principal"}],outputs:{type:{response:{ok:"uint128",error:"none"}}}},toSystemPrecision:{name:"to-system-precision",access:"read_only",args:[{name:"amount",type:"uint128"}],outputs:{type:"uint128"}}},maps:{lpBalances:{name:"lp-balances",key:"principal",value:"uint128"},userRewardDebt:{name:"user-reward-debt",key:"principal",value:"uint128"}},variables:{BP:{name:"BP",type:"uint128",access:"constant"},P:{name:"P",type:"uint128",access:"constant"},a:{name:"a",type:"uint128",access:"constant"},errAlreadyInitialized:{name:"err-already-initialized",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errDepositAmountTooSmall:{name:"err-deposit-amount-too-small",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errDepositProhibited:{name:"err-deposit-prohibited",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errLowTokenBalance:{name:"err-low-token-balance",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errLowVusdBalance:{name:"err-low-vusd-balance",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errNotEnoughLp:{name:"err-not-enough-lp",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errNotEnoughReserves:{name:"err-not-enough-reserves",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errNotInitialized:{name:"err-not-initialized",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errPoolBalanceTooBig:{name:"err-pool-balance-too-big",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errSlippage:{name:"err-slippage",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errSwapProhibited:{name:"err-swap-prohibited",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errTooLarge:{name:"err-too-large",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errUnauthorized:{name:"err-unauthorized",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errWithdrawProhibited:{name:"err-withdraw-prohibited",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errWrongToken:{name:"err-wrong-token",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errZeroChanges:{name:"err-zero-changes",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errZeroDChanges:{name:"err-zero-d-changes",type:{response:{ok:"none",error:"uint128"}},access:"constant"},maxTokenBalance:{name:"max-token-balance",type:"uint128",access:"constant"},systemPrecision:{name:"system-precision",type:"uint128",access:"constant"},accRewardPerShareP:{name:"acc-reward-per-share-p",type:"uint128",access:"variable"},adminFeeAmount:{name:"admin-fee-amount",type:"uint128",access:"variable"},adminFeeShareBp:{name:"admin-fee-share-bp",type:"uint128",access:"variable"},balanceRatioMinBp:{name:"balance-ratio-min-bp",type:"uint128",access:"variable"},bridge:{name:"bridge",type:{optional:"principal"},access:"variable"},canDeposit:{name:"can-deposit",type:"bool",access:"variable"},canSwap:{name:"can-swap",type:"bool",access:"variable"},canWithdraw:{name:"can-withdraw",type:"bool",access:"variable"},d:{name:"d",type:"uint128",access:"variable"},feeShareBp:{name:"fee-share-bp",type:"uint128",access:"variable"},lpTotalSupply:{name:"lp-total-supply",type:"uint128",access:"variable"},owner:{name:"owner",type:"principal",access:"variable"},reserves:{name:"reserves",type:"uint128",access:"variable"},stopAuthority:{name:"stop-authority",type:"principal",access:"variable"},tokenAmountIncrease:{name:"token-amount-increase",type:"uint128",access:"variable"},tokenAmountReduce:{name:"token-amount-reduce",type:"uint128",access:"variable"},tokenBalance:{name:"token-balance",type:"uint128",access:"variable"},tokenPrincipal:{name:"token-principal",type:{optional:"principal"},access:"variable"},vusdBalance:{name:"vusd-balance",type:"uint128",access:"variable"}},constants:{BP:10000n,P:48n,a:20n,accRewardPerShareP:0n,adminFeeAmount:0n,adminFeeShareBp:0n,balanceRatioMinBp:0n,bridge:null,canDeposit:!0,canSwap:!0,canWithdraw:!0,d:0n,errAlreadyInitialized:{isOk:!1,value:2007n},errDepositAmountTooSmall:{isOk:!1,value:2001n},errDepositProhibited:{isOk:!1,value:2013n},errLowTokenBalance:{isOk:!1,value:2012n},errLowVusdBalance:{isOk:!1,value:2011n},errNotEnoughLp:{isOk:!1,value:2010n},errNotEnoughReserves:{isOk:!1,value:2005n},errNotInitialized:{isOk:!1,value:2006n},errPoolBalanceTooBig:{isOk:!1,value:2002n},errSlippage:{isOk:!1,value:2009n},errSwapProhibited:{isOk:!1,value:2015n},errTooLarge:{isOk:!1,value:2016n},errUnauthorized:{isOk:!1,value:2000n},errWithdrawProhibited:{isOk:!1,value:2014n},errWrongToken:{isOk:!1,value:2008n},errZeroChanges:{isOk:!1,value:2003n},errZeroDChanges:{isOk:!1,value:2004n},feeShareBp:0n,lpTotalSupply:0n,maxTokenBalance:1000000000000n,owner:"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",reserves:0n,stopAuthority:"ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM",systemPrecision:3n,tokenAmountIncrease:0n,tokenAmountReduce:0n,tokenBalance:0n,tokenPrincipal:null,vusdBalance:0n},non_fungible_tokens:[],fungible_tokens:[],epoch:"Epoch31",clarity_version:"Clarity3",contractName:"pool"},poolTrait:{functions:{},maps:{},variables:{},constants:{},non_fungible_tokens:[],fungible_tokens:[],epoch:"Epoch31",clarity_version:"Clarity3",contractName:"pool-trait"},sip010TraitFtStandard:{functions:{},maps:{},variables:{},constants:{},non_fungible_tokens:[],fungible_tokens:[],epoch:"Epoch21",clarity_version:"Clarity1",contractName:"sip-010-trait-ft-standard"},utils:{functions:{assertNotEmptyBuff32:{name:"assert-not-empty-buff-32",access:"read_only",args:[{name:"b",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:"bool",error:"uint128"}}}},bufferByte:{name:"buffer-byte",access:"read_only",args:[{name:"b",type:{buffer:{length:32}}},{name:"i",type:"uint128"}],outputs:{type:{response:{ok:{buffer:{length:1}},error:"uint128"}}}},bufferByteUint:{name:"buffer-byte-uint",access:"read_only",args:[{name:"b",type:{buffer:{length:32}}},{name:"i",type:"uint128"}],outputs:{type:{response:{ok:"uint128",error:"uint128"}}}},hashMessage:{name:"hash-message",access:"read_only",args:[{name:"amount",type:"uint128"},{name:"recipient",type:{buffer:{length:32}}},{name:"source-chain-id",type:"uint128"},{name:"destination-chain-id",type:"uint128"},{name:"receive-token",type:{buffer:{length:32}}},{name:"nonce",type:{buffer:{length:32}}},{name:"messenger-id",type:"uint128"}],outputs:{type:{response:{ok:{buffer:{length:32}},error:"uint128"}}}},hashWithSenderAddress:{name:"hash-with-sender-address",access:"read_only",args:[{name:"message",type:{buffer:{length:32}}},{name:"sender",type:{buffer:{length:32}}}],outputs:{type:{response:{ok:{buffer:{length:32}},error:"uint128"}}}},principalHash:{name:"principal-hash",access:"read_only",args:[{name:"value",type:"principal"}],outputs:{type:{buffer:{length:32}}}},principalToBuff32:{name:"principal-to-buff32",access:"read_only",args:[{name:"value",type:"principal"}],outputs:{type:{buffer:{length:32}}}},stringToBuff:{name:"string-to-buff",access:"read_only",args:[{name:"str",type:{"string-ascii":{length:40}}}],outputs:{type:{buffer:{length:45}}}},uintToBuff1:{name:"uint-to-buff-1",access:"read_only",args:[{name:"value",type:"uint128"}],outputs:{type:{buffer:{length:17}}}},uintToBuff32:{name:"uint-to-buff-32",access:"read_only",args:[{name:"value",type:"uint128"}],outputs:{type:{buffer:{length:33}}}}},maps:{},variables:{errEmptyBuffer:{name:"err-empty-buffer",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errWrongBufferLength:{name:"err-wrong-buffer-length",type:{response:{ok:"none",error:"uint128"}},access:"constant"},errWrongMsgLength:{name:"err-wrong-msg-length",type:{response:{ok:"none",error:"uint128"}},access:"constant"},thisChainId:{name:"this-chain-id",type:"uint128",access:"constant"},zeroBytes12:{name:"zero-bytes-12",type:{buffer:{length:12}},access:"constant"},zeroBytes16:{name:"zero-bytes-16",type:{buffer:{length:16}},access:"constant"},zeroBytes32:{name:"zero-bytes-32",type:{buffer:{length:32}},access:"constant"}},constants:{errEmptyBuffer:{isOk:!1,value:5002n},errWrongBufferLength:{isOk:!1,value:5000n},errWrongMsgLength:{isOk:!1,value:5001n},thisChainId:16n,zeroBytes12:Uint8Array.from([0,0,0,0,0,0,0,0,0,0,0,0]),zeroBytes16:Uint8Array.from([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),zeroBytes32:Uint8Array.from([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])},non_fungible_tokens:[],fungible_tokens:[],epoch:"Epoch31",clarity_version:"Clarity3",contractName:"utils"}};import{STACKS_MAINNET as gs,STACKS_TESTNET as cs}from"@stacks/network";function Ft(r){return r.includes("testnet")?{...cs,client:{baseUrl:r}}:{...gs,client:{baseUrl:r}}}import{parseContractId as ls}from"@stacks/transactions";function _e(r,i,a,o,s){let[d,A]=ls(o);if(!d||!A)throw new Error(`Unable to parse stx token ${o}`);return{type:"ft-postcondition",address:a,condition:i,asset:`${d}.${A}::${s}`,amount:r}}function ea(r,i,a){return{type:"stx-postcondition",address:a,condition:i,amount:r}}var zn=class extends ne{constructor(a,o){super();this.nodeRpcUrl=a;this.api=o;let s=Ft(this.nodeRpcUrl);this.client=new us(s)}chainType="STX";client;send(a){throw new X}async buildRawTransactionSend(a){let o=await pe(this.chainType,a,this.api),{contractAddress:s,messenger:d,toChainId:A,toAccountAddress:g,toTokenAddress:c}=o,l=BigInt(o.amount),u=_e(l,"lte",a.fromAccountAddress,a.sourceToken.tokenAddress,"example-token"),p=ea(0,"gte",a.sourceToken.bridgeAddress),m=[u,p],y=BigInt(o.fee);o.extraGas&&(y=y+BigInt(o.extraGas));let Y=o.gasFeePaymentMethod==="stablecoin",h;if(Y)h=y;else{h=0n;let Re=ea(y,"lte",a.fromAccountAddress);m.push(Re)}let[B]=ps(s),W=Co(Me.bridge,s),{contractAddress:C,contractName:f,functionName:w,functionArgs:z}=W.swapAndBridge({ftRef:a.sourceToken.tokenAddress,poolRef:a.sourceToken.poolAddress,messengerRef:`${B}.messenger`,gasOracleRef:`${B}.gas-oracle`,amount:l,recipient:Uint8Array.from(g),destinationChainId:A,receiveToken:Uint8Array.from(c),nonce:Uint8Array.from(tt()),messengerId:d,feeNativeAmount:y,feeTokenAmount:h}),L=yo(),ge=vo(L),E={contractAddress:C,contractName:f,functionName:w,functionArgs:z,publicKey:ge,validateWithAbi:!0,network:this.client.network,postConditions:m,postConditionMode:ho.Deny};return(await Io(E)).serialize()}async buildRawTransactionSwap(a){let o=Ce(this.chainType,a),s=BigInt(o.amount),d=BigInt(o.minimumReceiveAmount),A=a.sourceToken.bridgeAddress,g=Co(Me.bridge,A),{contractAddress:c,contractName:l,functionName:u,functionArgs:p}=g.swap({amount:s,sendPoolRef:a.sourceToken.poolAddress,sendFtRef:a.sourceToken.tokenAddress,receivePoolRef:a.destinationToken.poolAddress,receiveFtRef:a.destinationToken.tokenAddress,recipient:a.toAccountAddress,receiveAmountMin:d}),m=yo(),y=vo(m),Y=_e(s,"lte",a.fromAccountAddress,a.sourceToken.tokenAddress,"example-token"),h=_e(d,"gte",a.destinationToken.poolAddress,a.destinationToken.tokenAddress,"example-token"),B={contractAddress:c,contractName:l,functionName:u,functionArgs:p,publicKey:y,validateWithAbi:!0,network:this.client.network,postConditions:[Y,h],postConditionMode:ho.Deny};return(await Io(B)).serialize()}};import{SuiClient as Ts}from"@mysten/sui/client";import{coinWithBalance as D,Transaction as la}from"@mysten/sui/transactions";import{SUI_CLOCK_OBJECT_ID as Mo}from"@mysten/sui/utils";import{Big as ua}from"big.js";var pa=we(ot());var $e=we(ot());ie();function Bo(r,i,a){return r.moveCall({target:`${$e.PUBLISHED_AT}::bridge_interface::swap`,typeArguments:i,arguments:[G(r,a.bridge),G(r,a.coin),fe(r,a.receiveAmountMin,"u64")]})}function Wo(r,i,a){return r.moveCall({target:`${$e.PUBLISHED_AT}::bridge_interface::deposit`,typeArguments:[i],arguments:[G(r,a.bridge),G(r,a.userDeposit),G(r,a.coin)]})}function fo(r,i,a){return r.moveCall({target:`${$e.PUBLISHED_AT}::bridge_interface::withdraw`,typeArguments:[i],arguments:[G(r,a.bridge),G(r,a.userDeposit),fe(r,a.amountLp,"u64")]})}function To(r,i,a){return r.moveCall({target:`${$e.PUBLISHED_AT}::bridge_interface::claim_reward`,typeArguments:[i],arguments:[G(r,a.bridge),G(r,a.userDeposit)]})}function Fo(r,i,a){return r.moveCall({target:`${$e.PUBLISHED_AT}::bridge_interface::pool`,typeArguments:[i],arguments:[G(r,a)]})}function na(r,i,a){return r.moveCall({target:`${$e.PUBLISHED_AT}::bridge_interface::swap_and_bridge_wormhole`,typeArguments:[i],arguments:[G(r,a.bridge),G(r,a.messenger),G(r,a.wormholeState),G(r,a.theClock),G(r,a.gasOracle),G(r,a.amount),G(r,a.recipient),fe(r,a.destinationChainId,"u8"),G(r,a.receiveToken),fe(r,a.nonce,"u256"),G(r,a.feeSuiCoin),G(r,a.feeTokenCoin)]})}function Zo(r,i){return r.moveCall({target:`${$e.PUBLISHED_AT}::bridge_interface::new_user_deposit`,typeArguments:[i],arguments:[]})}function ia(r,i,a){return r.moveCall({target:`${$e.PUBLISHED_AT}::bridge_interface::swap_and_bridge`,typeArguments:[i],arguments:[G(r,a.bridge),G(r,a.messenger),G(r,a.gasOracle),G(r,a.amount),G(r,a.recipient),fe(r,a.destinationChainId,"u8"),G(r,a.receiveToken),fe(r,a.nonce,"u256"),G(r,a.feeSuiCoin),G(r,a.feeTokenCoin)]})}var Po=we(oa());var No=we(oa());ie();function ra(r,i,a){return r.moveCall({target:`${No.PUBLISHED_AT}::cctp_bridge_interface::bridge`,typeArguments:[i],arguments:[G(r,a.cctpBridge),G(r,a.gasOracle),G(r,a.tokenMessengerMinterState),G(r,a.messageTransmitterState),G(r,a.treasury),G(r,a.denyList),G(r,a.amount),G(r,a.feeSuiCoin),G(r,a.feeTokenCoin),fe(r,a.destinationChainId,"u8"),G(r,a.recipient),G(r,a.recipientWalletAddress)]})}var Lo=we(da());var Vo=we(da());ie();import{bcs as rt}from"@mysten/sui/bcs";import{fromHEX as vs,toHEX as Rs}from"@mysten/sui/utils";import{bcs as hs}from"@mysten/sui/bcs";ie();var Aa=class r{__VectorClass=!0;static $typeName="vector";static $numTypeParams=1;static $isPhantom=[!1];$typeName="vector";$fullTypeName;$typeArgs;$isPhantom=[!1];elements;constructor(i,a){this.$fullTypeName=k(this.$typeName,...i),this.$typeArgs=i,this.elements=a}static reified(i){return{typeName:r.$typeName,fullTypeName:k(r.$typeName,N(i)),typeArgs:[N(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs(nn(i)),fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),new:a=>new r([N(i)],a),kind:"VectorClassReified"}}static get r(){return r.reified}static get bcs(){return hs.vector}static fromFields(i,a){return r.reified(i).new(a.map(o=>j(i,o)))}static fromFieldsWithTypes(i,a){return r.reified(i).new(a.map(o=>M(i,o)))}static fromBcs(i,a){return r.fromFields(i,r.bcs(nn(i)).parse(a))}toJSONField(){return this.elements.map(i=>mt(this.$typeArgs[0],i))}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,elements:this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new(a.map(o=>P(i,o)))}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a vector json object");return r.fromJSONField(i,a.elements)}};function Zt(r){return Aa.r(r)}function U(r){return typeof r=="string"?{phantomType:r,kind:"PhantomReified"}:{phantomType:r.fullTypeName,kind:"PhantomReified"}}var Ys=rt.bytes(32).transform({input:r=>vs(r),output:r=>Rs(r)});function nn(r){switch(r){case"bool":return rt.bool();case"u8":return rt.u8();case"u16":return rt.u16();case"u32":return rt.u32();case"u64":return rt.u64();case"u128":return rt.u128();case"u256":return rt.u256();case"address":return Ys;default:return r.bcs}}function N(r){switch(r){case"u8":case"u16":case"u32":case"u64":case"u128":case"u256":case"bool":case"address":return r}switch(r.kind){case"PhantomReified":return r.phantomType;case"StructClassReified":return r.fullTypeName;case"VectorClassReified":return r.fullTypeName}throw new Error("unreachable")}function j(r,i){switch(r){case"bool":case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return BigInt(i);case"address":return`0x${i}`}if(r.kind==="VectorClassReified")return r.fromFields(i).elements;switch(r.typeName){case"0x1::string::String":case"0x1::ascii::String":return new TextDecoder().decode(Uint8Array.from(i.bytes)).toString();case"0x2::url::Url":return new TextDecoder().decode(Uint8Array.from(i.url.bytes)).toString();case"0x2::object::ID":return`0x${i.bytes}`;case"0x2::object::UID":return`0x${i.id.bytes}`;case"0x1::option::Option":return i.vec.length===0?null:r.fromFields(i).vec[0];default:return r.fromFields(i)}}function M(r,i){switch(r){case"bool":case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return BigInt(i);case"address":return i}if(r.kind==="VectorClassReified")return r.fromFieldsWithTypes(i).elements;switch(r.typeName){case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":return i;case"0x2::object::UID":return i.id;case"0x2::balance::Balance":return r.fromFields({value:BigInt(i)});case"0x1::option::Option":return i===null?null:M(r.reifiedTypeArgs[0],i);default:return r.fromFieldsWithTypes(i)}}function Pe(r,i,a){if(a.length!==i.length)throw new Error(`provided item has mismatching number of type argments ${r} (expected ${a.length}, got ${i.length}))`);for(let o=0;o<i.length;o++)if(T(i[o])!==T(N(a[o])))throw new Error(`provided item has mismatching type argments ${r} (expected ${N(a[o])}, got ${i[o]}))`)}function xe(r,i){let{typeArgs:a}=de(r.type);Pe(r.type,a,i)}function mt(r,i){let{typeName:a,typeArgs:o}=de(r);switch(a){case"bool":return i;case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return i.toString();case"address":case"signer":return i;case"vector":return i.map(s=>mt(o[0],s));case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":case"0x2::object::UID":return i;case"0x1::option::Option":return i===null?null:mt(o[0],i);default:return i.toJSONField()}}function P(r,i){switch(r){case"bool":case"u8":case"u16":case"u32":return i;case"u64":case"u128":case"u256":return BigInt(i);case"address":return i}if(r.kind==="VectorClassReified")return r.fromJSONField(i).elements;switch(r.typeName){case"0x1::string::String":case"0x1::ascii::String":case"0x2::url::Url":case"0x2::object::ID":case"0x2::object::UID":return i;case"0x1::option::Option":return i===null?null:P(r.reifiedTypeArgs[0],i);default:return r.fromJSONField(i)}}ie();var xn="0x1";import{bcs as np}from"@mysten/sui/bcs";import{fromB64 as ap}from"@mysten/sui/utils";ie();import{bcs as ga}from"@mysten/sui/bcs";import{fromB64 as Bs}from"@mysten/sui/utils";function On(r){return r=T(r),r===`${xn}::string::String`}var Qn=class r{__StructClass=!0;static get $typeName(){return`${xn}::string::String`}static $numTypeParams=0;static $isPhantom=[];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;bytes;constructor(i,a){this.$fullTypeName=k(r.$typeName,...i),this.$typeArgs=i,this.bytes=a.bytes}static reified(){return{typeName:r.$typeName,fullTypeName:k(r.$typeName),typeArgs:[],isPhantom:r.$isPhantom,reifiedTypeArgs:[],fromFields:i=>r.fromFields(i),fromFieldsWithTypes:i=>r.fromFieldsWithTypes(i),fromBcs:i=>r.fromBcs(i),bcs:r.bcs,fromJSONField:i=>r.fromJSONField(i),fromJSON:i=>r.fromJSON(i),fromSuiParsedData:i=>r.fromSuiParsedData(i),fromSuiObjectData:i=>r.fromSuiObjectData(i),fetch:async(i,a)=>r.fetch(i,a),new:i=>new r([],i),kind:"StructClassReified"}}static get r(){return r.reified()}static phantom(){return U(r.reified())}static get p(){return r.phantom()}static get bcs(){return ga.struct("String",{bytes:ga.vector(ga.u8())})}static fromFields(i){return r.reified().new({bytes:j(Zt("u8"),i.bytes)})}static fromFieldsWithTypes(i){if(!On(i.type))throw new Error("not a String type");return r.reified().new({bytes:M(Zt("u8"),i.fields.bytes)})}static fromBcs(i){return r.fromFields(r.bcs.parse(i))}toJSONField(){return{bytes:mt("vector<u8>",this.bytes)}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i){return r.reified().new({bytes:P(Zt("u8"),i.bytes)})}static fromJSON(i){if(i.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return r.fromJSONField(i)}static fromSuiParsedData(i){if(i.dataType!=="moveObject")throw new Error("not an object");if(!On(i.type))throw new Error(`object at ${i.fields.id} is not a String object`);return r.fromFieldsWithTypes(i)}static fromSuiObjectData(i){if(i.bcs){if(i.bcs.dataType!=="moveObject"||!On(i.bcs.type))throw new Error("object at is not a String object");return r.fromBcs(Bs(i.bcs.bcsBytes))}if(i.content)return r.fromSuiParsedData(i.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a){let o=await i.getObject({id:a,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching String object at id ${a}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!On(o.data.bcs.type))throw new Error(`object at id ${a} is not a String object`);return r.fromSuiObjectData(o.data)}};ie();ie();var st="0x2";import{bcs as ca}from"@mysten/sui/bcs";import{fromB64 as So,fromHEX as Ws,toHEX as fs}from"@mysten/sui/utils";function Kn(r){return r=T(r),r===`${st}::object::ID`}var bt=class r{__StructClass=!0;static get $typeName(){return`${st}::object::ID`}static $numTypeParams=0;static $isPhantom=[];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;bytes;constructor(i,a){this.$fullTypeName=k(r.$typeName,...i),this.$typeArgs=i,this.bytes=a.bytes}static reified(){return{typeName:r.$typeName,fullTypeName:k(r.$typeName),typeArgs:[],isPhantom:r.$isPhantom,reifiedTypeArgs:[],fromFields:i=>r.fromFields(i),fromFieldsWithTypes:i=>r.fromFieldsWithTypes(i),fromBcs:i=>r.fromBcs(i),bcs:r.bcs,fromJSONField:i=>r.fromJSONField(i),fromJSON:i=>r.fromJSON(i),fromSuiParsedData:i=>r.fromSuiParsedData(i),fromSuiObjectData:i=>r.fromSuiObjectData(i),fetch:async(i,a)=>r.fetch(i,a),new:i=>new r([],i),kind:"StructClassReified"}}static get r(){return r.reified()}static phantom(){return U(r.reified())}static get p(){return r.phantom()}static get bcs(){return ca.struct("ID",{bytes:ca.bytes(32).transform({input:i=>Ws(i),output:i=>fs(i)})})}static fromFields(i){return r.reified().new({bytes:j("address",i.bytes)})}static fromFieldsWithTypes(i){if(!Kn(i.type))throw new Error("not a ID type");return r.reified().new({bytes:M("address",i.fields.bytes)})}static fromBcs(i){return r.fromFields(r.bcs.parse(i))}toJSONField(){return{bytes:this.bytes}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i){return r.reified().new({bytes:P("address",i.bytes)})}static fromJSON(i){if(i.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return r.fromJSONField(i)}static fromSuiParsedData(i){if(i.dataType!=="moveObject")throw new Error("not an object");if(!Kn(i.type))throw new Error(`object at ${i.fields.id} is not a ID object`);return r.fromFieldsWithTypes(i)}static fromSuiObjectData(i){if(i.bcs){if(i.bcs.dataType!=="moveObject"||!Kn(i.bcs.type))throw new Error("object at is not a ID object");return r.fromBcs(So(i.bcs.bcsBytes))}if(i.content)return r.fromSuiParsedData(i.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a){let o=await i.getObject({id:a,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching ID object at id ${a}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!Kn(o.data.bcs.type))throw new Error(`object at id ${a} is not a ID object`);return r.fromSuiObjectData(o.data)}};function Un(r){return r=T(r),r===`${st}::object::UID`}var Te=class r{__StructClass=!0;static get $typeName(){return`${st}::object::UID`}static $numTypeParams=0;static $isPhantom=[];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;id;constructor(i,a){this.$fullTypeName=k(r.$typeName,...i),this.$typeArgs=i,this.id=a.id}static reified(){return{typeName:r.$typeName,fullTypeName:k(r.$typeName),typeArgs:[],isPhantom:r.$isPhantom,reifiedTypeArgs:[],fromFields:i=>r.fromFields(i),fromFieldsWithTypes:i=>r.fromFieldsWithTypes(i),fromBcs:i=>r.fromBcs(i),bcs:r.bcs,fromJSONField:i=>r.fromJSONField(i),fromJSON:i=>r.fromJSON(i),fromSuiParsedData:i=>r.fromSuiParsedData(i),fromSuiObjectData:i=>r.fromSuiObjectData(i),fetch:async(i,a)=>r.fetch(i,a),new:i=>new r([],i),kind:"StructClassReified"}}static get r(){return r.reified()}static phantom(){return U(r.reified())}static get p(){return r.phantom()}static get bcs(){return ca.struct("UID",{id:bt.bcs})}static fromFields(i){return r.reified().new({id:j(bt.reified(),i.id)})}static fromFieldsWithTypes(i){if(!Un(i.type))throw new Error("not a UID type");return r.reified().new({id:M(bt.reified(),i.fields.id)})}static fromBcs(i){return r.fromFields(r.bcs.parse(i))}toJSONField(){return{id:this.id}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i){return r.reified().new({id:P(bt.reified(),i.id)})}static fromJSON(i){if(i.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return r.fromJSONField(i)}static fromSuiParsedData(i){if(i.dataType!=="moveObject")throw new Error("not an object");if(!Un(i.type))throw new Error(`object at ${i.fields.id} is not a UID object`);return r.fromFieldsWithTypes(i)}static fromSuiObjectData(i){if(i.bcs){if(i.bcs.dataType!=="moveObject"||!Un(i.bcs.type))throw new Error("object at is not a UID object");return r.fromBcs(So(i.bcs.bcsBytes))}if(i.content)return r.fromSuiParsedData(i.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a){let o=await i.getObject({id:a,options:{showBcs:!0}});if(o.error)throw new Error(`error fetching UID object at id ${a}: ${o.error.code}`);if(o.data?.bcs?.dataType!=="moveObject"||!Un(o.data.bcs.type))throw new Error(`object at id ${a} is not a UID object`);return r.fromSuiObjectData(o.data)}};function Le(r,i){return r.moveCall({target:`${Vo.PUBLISHED_AT}::bytes32::from_hex`,arguments:[fe(r,i,`${Qn.$typeName}`)]})}async function Oe(r,i,a=[]){let o=await r(i),s=a.concat(o.data);return o.hasNextPage&&o.nextCursor?Oe(r,o.nextCursor,s):s}var Gt=class extends ne{constructor(a,o){super();this.nodeRpcUrlsConfig=a;this.api=o;this.client=new Ts({url:a.getNodeRpcUrl(this.chainSymbol)})}chainType="SUI";chainSymbol="SUI";client;send(){throw new I("Method send not implemented.")}async buildRawTransactionSwap(a){let o=a.sourceToken.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");(0,pa.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin);let s=Ce(this.chainType,a);return await this.buildRawTransactionSwapFromParams(s,o)}async buildRawTransactionSwapFromParams(a,o){let{amount:s,fromAccountAddress:d,fromTokenAddress:A,toTokenAddress:g,minimumReceiveAmount:c}=a,l=new la;l.setSender(d);let u={bridge:o.bridgeObjectAddress,coin:D({balance:BigInt(s),type:A}),receiveAmountMin:BigInt(c)},p=Bo(l,[A,g],u),m=await Oe(y=>this.client.getCoins({owner:a.toAccountAddress,coinType:g,cursor:y}));return m.length===0||!m[0]?l.transferObjects([p],a.toAccountAddress):l.mergeCoins(m[0].coinObjectId,[p]),await l.toJSON({client:this.client})}async buildRawTransactionSendFromCustomTx(a,o,s){let d=la.from(a);return this.buildRawTransactionSendFromTx(s,d,o)}async buildRawTransactionSend(a){return this.buildRawTransactionSendFromTx(a,new la)}async buildRawTransactionSendFromTx(a,o,s){let d=await pe(this.chainType,a,this.api),{messenger:A}=d,g=a.sourceToken.suiAddresses;if(!g)throw new I("SUI token must contain 'suiAddresses'");switch((0,pa.setAddress)(g.bridgeAddress,g.bridgeAddressOrigin),(0,Lo.setAddress)(g.utilsAddress),A){case 1:return this.buildRawTransactionAllbridgeSend(d,g,o,s);case 2:return this.buildRawTransactionWormholeSend(d,g,o,s);case 3:case 4:return this.buildRawTransactionCctpSend(a,d,g,o,s);case 5:throw new le("Messenger OFT is not supported yet.")}}async buildRawTransactionAllbridgeSend(a,o,s,d){let{amount:A,fromAccountAddress:g,fromTokenAddress:c,toChainId:l,toAccountAddress:u,toTokenAddress:p,fee:m,gasFeePaymentMethod:y,extraGas:Y}=a,h=m;if(Y&&(h=ua(h).plus(Y).toFixed()),s.setSender(g),y==="stablecoin"){let B=BigInt(A)-BigInt(h),W,C;if(d){let[w]=s.splitCoins(d,[h]);W=d,C=w}else W=D({balance:B,type:c}),C=D({balance:BigInt(h),type:c});let f={bridge:o.bridgeObjectAddress,messenger:o.allbridgeMessengerObjectAddress,amount:W,destinationChainId:l,nonce:ze(),recipient:Le(s,Xe(u)),receiveToken:Le(s,Xe(p)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:C,feeSuiCoin:D({balance:BigInt(0),useGasCoin:!1})};ia(s,c,f)}else{let B=h==="0"?D({balance:BigInt(h),useGasCoin:!1}):D({balance:BigInt(h)}),W={bridge:o.bridgeObjectAddress,messenger:o.allbridgeMessengerObjectAddress,amount:d??D({balance:BigInt(A),type:c}),destinationChainId:l,nonce:ze(),recipient:Le(s,Xe(u)),receiveToken:Le(s,Xe(p)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:D({balance:BigInt(0),type:c}),feeSuiCoin:B};ia(s,c,W)}return await s.toJSON({client:this.client})}async buildRawTransactionWormholeSend(a,o,s,d){let{amount:A,fromAccountAddress:g,fromTokenAddress:c,toChainId:l,toAccountAddress:u,toTokenAddress:p,fee:m,gasFeePaymentMethod:y,extraGas:Y}=a,h=m;if(Y&&(h=ua(h).plus(Y).toFixed()),s.setSender(g),y==="stablecoin"){let B=BigInt(A)-BigInt(h),W,C;if(d){let[w]=s.splitCoins(d,[h]);W=d,C=w}else W=D({balance:B,type:c}),C=D({balance:BigInt(h),type:c});let f={bridge:o.bridgeObjectAddress,messenger:o.wormholeMessengerObjectAddress,wormholeState:o.wormholeStateObjectAddress,theClock:Mo,amount:W,destinationChainId:l,nonce:ze(),recipient:Le(s,Xe(u)),receiveToken:Le(s,Xe(p)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:C,feeSuiCoin:D({balance:BigInt(0),useGasCoin:!1})};na(s,c,f)}else{let B=h==="0"?D({balance:BigInt(h),useGasCoin:!1}):D({balance:BigInt(h)}),W={bridge:o.bridgeObjectAddress,messenger:o.wormholeMessengerObjectAddress,wormholeState:o.wormholeStateObjectAddress,theClock:Mo,amount:d??D({balance:BigInt(A),type:c}),destinationChainId:l,nonce:ze(),recipient:Le(s,Xe(u)),receiveToken:Le(s,Xe(p)),gasOracle:o.gasOracleObjectAddress,feeTokenCoin:D({balance:BigInt(0),type:c}),feeSuiCoin:B};na(s,c,W)}return await s.toJSON({client:this.client})}async buildRawTransactionCctpSend(a,o,s,d,A){let{amount:g,fromAccountAddress:c,fromTokenAddress:l,toChainId:u,toAccountAddress:p,fee:m,gasFeePaymentMethod:y,extraGas:Y}=o;(0,Po.setAddress)(s.cctpAddress,s.cctpAddressOrigin);let h=m;Y&&(h=ua(h).plus(Y).toFixed()),d.setSender(c);let B=Le(d,Xe(p)),W;if(a.destinationToken.chainType==="SOLANA"){let C=await Vn(this.chainType,a.toAccountAddress,a.destinationToken.tokenAddress,this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"));W=Le(d,Xe(C))}else W=B;if(y==="stablecoin"){let C=BigInt(g)-BigInt(h),f,w;if(A){let[L]=d.splitCoins(A,[h]);f=A,w=L}else f=D({balance:C,type:l}),w=D({balance:BigInt(h),type:l});let z={cctpBridge:s.cctpObjectAddress,tokenMessengerMinterState:s.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:s.cctpMessageTransmitterStateObjectAddress,treasury:s.cctpTreasuryObjectAddress,denyList:s.cctpDenyListObjectAddress,amount:f,destinationChainId:u,recipient:W,recipientWalletAddress:B,gasOracle:s.gasOracleObjectAddress,feeTokenCoin:w,feeSuiCoin:D({balance:BigInt(0),useGasCoin:!1})};ra(d,l,z)}else{let C=h==="0"?D({balance:BigInt(h),useGasCoin:!1}):D({balance:BigInt(h)}),f={cctpBridge:s.cctpObjectAddress,tokenMessengerMinterState:s.cctpTokenMessengerMinterStateObjectAddress,messageTransmitterState:s.cctpMessageTransmitterStateObjectAddress,treasury:s.cctpTreasuryObjectAddress,denyList:s.cctpDenyListObjectAddress,amount:A??D({balance:BigInt(g),type:l}),destinationChainId:u,recipient:W,recipientWalletAddress:B,gasOracle:s.gasOracleObjectAddress,feeTokenCoin:D({balance:BigInt(0),type:l}),feeSuiCoin:C};ra(d,l,f)}return await d.toJSON({client:this.client})}};import{Big as Gs}from"big.js";import Fs from"bn.js";function Dn(r){return"0x"+new Fs(r).toString("hex")}function Ho(r){return new Promise(i=>setTimeout(()=>i(),r))}async function En(r,i){let a=await r.trx.sign(i);if(!a.signature)throw new vt("Transaction was not signed properly");let s=(await r.trx.sendRawTransaction(a)).transaction.txID;return await Zs(r,s),{txId:s}}async function Zs(r,i,a=1e4){let o=Date.now();for(;;){if(Date.now()-o>a)throw new Ot("Transaction not found");let s=await r.trx.getUnconfirmedTransactionInfo(i);if(!s?.receipt){await Ho(2e3);continue}if(s.receipt.result==="SUCCESS")return s;throw new Ot(`Transaction status is ${s.receipt.result}`)}}var an=class extends ne{constructor(a,o){super();this.tronWeb=a;this.api=o}chainType="TRX";async send(a){let o=await pe(this.chainType,a,this.api),s=await this.buildRawTransactionSendFromParams(a,o);return await En(this.tronWeb,s)}async buildRawTransactionSwap(a){let o=Ce(this.chainType,a);return await this.buildRawTransactionSwapFromParams(o)}async buildRawTransactionSwapFromParams(a){let{amount:o,contractAddress:s,fromAccountAddress:d,fromTokenAddress:A,toAccountAddress:g,toTokenAddress:c,minimumReceiveAmount:l}=a,u=[{type:"uint256",value:o},{type:"bytes32",value:A},{type:"bytes32",value:c},{type:"address",value:g},{type:"uint256",value:l}];return this.buildRawTransaction(s,"swap(uint256,bytes32,bytes32,address,uint256)",u,"0",d)}async buildRawTransactionSend(a){let o=await pe(this.chainType,a,this.api);return this.buildRawTransactionSendFromParams(a,o)}async buildRawTransactionSendFromParams(a,o){let{amount:s,contractAddress:d,fromAccountAddress:A,fromTokenAddress:g,toChainId:c,toAccountAddress:l,toTokenAddress:u,messenger:p,fee:m,gasFeePaymentMethod:y,extraGas:Y,extraGasDest:h}=o,B=m;Y&&(B=Gs(B).plus(Y).toFixed());let W=ze().toString(),C,f,w;switch(p){case 3:case 4:y==="stablecoin"?(C=[{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:B}],f="0"):(C=[{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:0}],f=B),w="bridge(uint256,bytes32,uint256,uint256)";break;case 5:y==="stablecoin"?(C=[{type:"address",value:a.sourceToken.tokenAddress},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:B},{type:"uint256",value:h??"0"},{type:"uint256",value:"10"}],f="0"):(C=[{type:"address",value:a.sourceToken.tokenAddress},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"uint256",value:0},{type:"uint256",value:h??"0"},{type:"uint256",value:"10"}],f=B),w="bridge(address,uint256,bytes32,uint256,uint256,uint256,uint256)";break;case 1:case 2:y==="stablecoin"?(C=[{type:"bytes32",value:g},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"bytes32",value:u},{type:"uint256",value:W},{type:"uint8",value:p},{type:"uint256",value:B}],f="0"):(C=[{type:"bytes32",value:g},{type:"uint256",value:s},{type:"bytes32",value:l},{type:"uint256",value:c},{type:"bytes32",value:u},{type:"uint256",value:W},{type:"uint8",value:p},{type:"uint256",value:0}],f=B),w="swapAndBridge(bytes32,uint256,bytes32,uint256,bytes32,uint256,uint8,uint256)";break}return this.buildRawTransaction(d,w,C,f,A)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}};var _n=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new Mn(i,a,o,s)}rawTxBuilder;async getAllowance(i,a){let o,s;a?(o=i,s=a):s=i;let d=qt(s.token,s.messenger);return await this.tokenService.getAllowance({...s,spender:d},o)}async checkAllowance(i,a){let o,s;a?(o=i,s=a):s=i;let d=qt(s.token,s.messenger);return this.tokenService.checkAllowance({...s,spender:d},o)}async approve(i,a){let o=qt(a.token,a.messenger);return this.tokenService.approve(i,{...a,spender:o})}async send(i,a){return V(a.amount),H("amount",a.amount,a.sourceToken.decimals),Pn(a.sourceToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,i).send(a)}};function qt(r,i=1){switch(i){case 3:if(r.cctpAddress)return r.cctpAddress;throw new ce("Such route does not support CCTP protocol");case 4:if(r.cctpV2Address)return r.cctpV2Address;throw new ce("Such route does not support CCTP V2 protocol");case 5:if(r.oftBridgeAddress)return r.oftBridgeAddress;throw new le("Such route does not support OFT protocol");case 1:case 2:return r.bridgeAddress}}function Pn(r,i,a,o,s){switch(S.getChainProperty(r).chainType){case"EVM":{if(s)return new $t(s,i,a);{let d=a.getNodeRpcUrl(r);return new $t(new ws(d),i,a)}}case"TRX":{if(s)return new an(s,i);{let d=a.getNodeRpcUrl(r);return new an(new Ns({fullHost:d,solidityNode:d,eventServer:d}),i)}}case"SOLANA":return new Jn(a.getNodeRpcUrl("SOL"),{wormholeMessengerProgramId:o.wormholeMessengerProgramId,solanaLookUpTable:o.solanaLookUpTable,cctpParams:o.cctpParams,jupiterParams:{jupiterUrl:o.jupiterUrl,jupiterApiKeyHeader:o.jupiterApiKeyHeader,jupiterMaxAccounts:o.jupiterMaxAccounts}},i);case"SRB":return new kn(a,o,i);case"SUI":return new Gt(a,i);case"ALG":if(s){let d=s,A=jo.fromClients({algod:d});return new Et(A,i)}else{let d=a.getNodeRpcUrl(r),A=jo.fromConfig({algodConfig:{server:d}});return new Et(A,i)}case"STX":{let d=a.getNodeRpcUrl(r);return new zn(d,i)}}}import{AlgorandClient as Do}from"@algorandfoundation/algokit-utils";import{Big as td}from"big.js";import nd from"timed-cache";import{TronWeb as id}from"tronweb";import{FMT_BYTES as ad,FMT_NUMBER as od,Web3 as rd}from"web3";import{Big as qe}from"big.js";function Jo(r,i,a,o,s){let d=Z(r,3),A=qe(d),g=qe(a),c=qe(o).plus(s),l,u;if(g.eq(0)||c.eq(0)){let m=A.div(2);l=qe(o).plus(m),u=qe(s).plus(m)}else l=qe(o).plus(A.mul(o).div(c)),u=qe(s).plus(A.mul(s).div(c));return qe(Ma(i,l.toFixed(),u.toFixed())).minus(g).toFixed()}function ko(r){let i=Z(r,3);return qe(i).round().toFixed()}import{assignGroupID as ma,bytesToBigInt as Vs}from"algosdk";import{getArc56ReturnValue as Xs}from"@algorandfoundation/algokit-utils/types/app-arc56";import{AppClient as $n}from"@algorandfoundation/algokit-utils/types/app-client";import{AppFactory as ib}from"@algorandfoundation/algokit-utils/types/app-factory";import{encodeAddress as Ss}from"algosdk";var qn={name:"Pool",structs:{},methods:[{name:"createApplication",args:[{type:"address",name:"owner"},{type:"address",name:"router"},{type:"uint64",name:"a"},{type:"uint64",name:"assetId"},{type:"uint64",name:"feeShareBP"},{type:"uint64",name:"balanceRatioMinBP"}],returns:{type:"void"},actions:{create:["NoOp"],call:[]},readonly:!1,events:[],recommendations:{}},{name:"optInToApplication",args:[],returns:{type:"void"},actions:{create:[],call:["OptIn"]},readonly:!1,events:[],recommendations:{}},{name:"optInAsset",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,desc:"Opt-in the application account to the ASA stored in `this.asset`.\nThis performs an inner axfer of 0 to the app's own address.\nCall once after deploy (or whenever you change the asset).",events:[],recommendations:{}},{name:"noop",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"deposit",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]},{name:"Deposit",args:[{type:"address",name:"to"},{type:"uint64",name:"lpAmount"}]}],recommendations:{}},{name:"withdraw",args:[{type:"uint64",name:"amountLp",desc:"The Withdrawn amount"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]},{name:"Withdraw",args:[{type:"address",name:"from"},{type:"uint64",name:"lpAmount"}]}],recommendations:{}},{name:"swapToVUsd",args:[{type:"address",name:"user"},{type:"uint64",name:"amount",desc:"The amount of tokens to swap."},{type:"bool",name:"zeroFee",desc:`When true it allows to swap without incurring any fees. It is intended for use with service
2
2
  accounts.`}],returns:{type:"uint64",desc:"returns the difference between the old and the new value of vUsdBalance"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"SwappedToVUsd",args:[{type:"address",name:"sender"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"amount"},{type:"uint64",name:"vUsdAmount"},{type:"uint64",name:"fee"}]}],recommendations:{}},{name:"swapFromVUsd",args:[{type:"address",name:"user",desc:"The address of the recipient."},{type:"uint64",name:"amount",desc:"The amount of vUSD to swap."},{type:"uint64",name:"receiveAmountMin",desc:`The minimum amount of tokens required to be received during the swap, otherwise the
3
3
  transaction reverts.`},{type:"bool",name:"zeroFee",desc:`When true it allows to swap without incurring any fees. It is intended for use with service
4
4
  accounts.`}],returns:{type:"uint64",desc:"returns the difference between the old and the new value of vUsdBalance"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"SwappedFromVUsd",args:[{type:"address",name:"recipient"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"vUsdAmount"},{type:"uint64",name:"amount"},{type:"uint64",name:"fee"}]}],recommendations:{}},{name:"setFeeShare",args:[{type:"uint64",name:"feeShareBP"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"adjustTotalLpAmount",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]},{name:"Deposit",args:[{type:"address",name:"to"},{type:"uint64",name:"lpAmount"}]}],recommendations:{}},{name:"setBalanceRatioMinBP",args:[{type:"uint64",name:"balanceRatioMinBP"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"stopDeposit",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"startDeposit",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"stopWithdraw",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"startWithdraw",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setStopAuthority",args:[{type:"address",name:"stopAuthority"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"setRouter",args:[{type:"address",name:"router"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"claimRewards",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]}],recommendations:{}},{name:"setAdminFeeShare",args:[{type:"uint64",name:"adminFeeShareBP"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"claimAdminFee",args:[],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}},{name:"pendingReward",args:[{type:"account",name:"user"}],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"decimals",args:[],returns:{type:"uint64"},actions:{create:[],call:["NoOp"]},readonly:!0,events:[],recommendations:{}},{name:"transferOwnership",args:[{type:"address",name:"newOwner"}],returns:{type:"void"},actions:{create:[],call:["NoOp"]},readonly:!1,events:[],recommendations:{}}],arcs:[22,28],desc:`4AD - D = 4A(x + y) - (D\xB3 / 4xy)
5
5
  X - is value of real stable token
6
- Y - is value of virtual usd`,networks:{},state:{schema:{global:{ints:15,bytes:4},local:{ints:2,bytes:0}},keys:{global:{feeShareBP:{keyType:"AVMString",valueType:"AVMUint64",key:"ZmVlU2hhcmVCUA=="},router:{keyType:"AVMString",valueType:"address",key:"cm91dGVy"},tokenBalance:{keyType:"AVMString",valueType:"AVMUint64",key:"dG9rZW5CYWxhbmNl"},vUsdBalance:{keyType:"AVMString",valueType:"AVMUint64",key:"dlVzZEJhbGFuY2U="},balanceRatioMinBP:{keyType:"AVMString",valueType:"AVMUint64",key:"YmFsYW5jZVJhdGlvTWluQlA="},reserves:{keyType:"AVMString",valueType:"AVMUint64",key:"cmVzZXJ2ZXM="},a:{keyType:"AVMString",valueType:"AVMUint64",key:"YQ=="},d:{keyType:"AVMString",valueType:"AVMUint64",key:"ZA=="},tokenAmountReduce:{keyType:"AVMString",valueType:"AVMUint64",key:"dG9rZW5BbW91bnRSZWR1Y2U="},tokenAmountIncrease:{keyType:"AVMString",valueType:"AVMUint64",key:"dG9rZW5BbW91bnRJbmNyZWFzZQ=="},stopAuthority:{keyType:"AVMString",valueType:"address",key:"c3RvcEF1dGhvcml0eQ=="},canDeposit:{keyType:"AVMString",valueType:"AVMUint64",key:"Y2FuRGVwb3NpdA=="},canWithdraw:{keyType:"AVMString",valueType:"AVMUint64",key:"Y2FuV2l0aGRyYXc="},asset:{keyType:"AVMString",valueType:"AVMUint64",key:"YXNzZXQ="},adminFeeShareBP:{keyType:"AVMString",valueType:"AVMUint64",key:"YWRtaW5GZWVTaGFyZUJQ"},totalSupply:{keyType:"AVMString",valueType:"AVMUint64",key:"dG90YWxTdXBwbHk="},accRewardPerShareP:{keyType:"AVMString",valueType:"AVMBytes",key:"YWNjUmV3YXJkUGVyU2hhcmVQ"},adminFeeAmount:{keyType:"AVMString",valueType:"AVMUint64",key:"YWRtaW5GZWVBbW91bnQ="},owner:{keyType:"AVMString",valueType:"address",key:"b3duZXI="}},local:{balance:{keyType:"AVMString",valueType:"AVMUint64",key:"YmFsYW5jZQ=="},userRewardDebt:{keyType:"AVMString",valueType:"AVMUint64",key:"dXNlclJld2FyZERlYnQ="}},box:{}},maps:{global:{},local:{},box:{}}},bareActions:{create:[],call:[]},sourceInfo:{approval:{sourceInfo:[{pc:[1446],errorMessage:'"Pool: withdraw prohibited'},{pc:[1249],errorMessage:"Asset must go to app"},{pc:[1232],errorMessage:"Asset txn missing"},{pc:[1270],errorMessage:"CloseTo not allowed"},{pc:[514,529,553,577,589,605,617,632,647,659,671,683,695,711,723,739,773,803,819,831,840,865],errorMessage:"OnCompletion is not NoOp"},{pc:[853],errorMessage:"OnCompletion is not OptIn"},{pc:[3306],errorMessage:"Only owner"},{pc:[1216],errorMessage:"Pool: deposit prohibited"},{pc:[1141],errorMessage:"Pool: is not stopAuthority"},{pc:[1206],errorMessage:"Pool: low token balance"},{pc:[1182],errorMessage:"Pool: low vUSD balance"},{pc:[1131],errorMessage:"Pool: only router"},{pc:[1701,1983],errorMessage:"Pool: reserves"},{pc:[2027],errorMessage:"Pool: slippage"},{pc:[2116,2175],errorMessage:"Pool: too large"},{pc:[1280],errorMessage:"Pool: too little"},{pc:[1369],errorMessage:"Pool: too much"},{pc:[1723],errorMessage:"Pool: zero D changes"},{pc:[1693],errorMessage:"Pool: zero changes"},{pc:[1263],errorMessage:"Rekey not allowed"},{pc:[1468],errorMessage:"RewardManager: not enough amount"},{pc:[2994],errorMessage:"RewardManager: too high"},{pc:[1256],errorMessage:"Wrong asset"},{pc:[984],errorMessage:"asset exists"},{pc:[869],errorMessage:"can only call when creating"},{pc:[517,532,556,580,592,608,620,635,650,662,674,686,698,714,726,742,776,806,822,834,843,856],errorMessage:"can only call when not creating"},{pc:[977,1080,1129,1139,1153,1163,1180,1204,1215,1225,1229,1284,1298,1308,1326,1336,1350,1360,1374,1412,1445,1451,1476,1531,1563,1614,1618,1624,1660,1686,1690,1697,1705,1719,1728,1775,1805,1815,1823,1833,1841,1870,1929,1939,1955,1976,1987,2002,2032,2066,2137,2148,2251,2260,2408,2413,2421,2529,2537,2578,2586,2917,2954,3015,3023,3028,3064,3092,3100,3118,3138,3152,3216,3250,3304],errorMessage:"check GlobalState exists"},{pc:[1463,1500,1516,2906,2934,3058,3078,3164,3186,3201],errorMessage:"check LocalState exists"},{pc:[2626],errorMessage:"n must be non-negative"},{pc:[1395,1426,1642,1674],errorMessage:"overflow"},{pc:[1242],errorMessage:"transaction type is axfer"}],pcOffsetMethod:"none"},clear:{sourceInfo:[],pcOffsetMethod:"none"}},source:{approval:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNCAxMDAwMAogICAgYnl0ZWNibG9jayAidG9rZW5CYWxhbmNlIiAidlVzZEJhbGFuY2UiICJhc3NldCIgInJlc2VydmVzIiAiYmFsYW5jZSIgInVzZXJSZXdhcmREZWJ0IiAiZCIgInRvdGFsU3VwcGx5IiAiYWNjUmV3YXJkUGVyU2hhcmVQIiAweDAxMDAwMDAwMDAwMDAwIDB4MDEgImFkbWluRmVlQW1vdW50IiAiY2FuRGVwb3NpdCIgImNhbldpdGhkcmF3IiAib3duZXIiICJmZWVTaGFyZUJQIiAiYmFsYW5jZVJhdGlvTWluQlAiIDB4MDIgImFkbWluRmVlU2hhcmVCUCIgMHgxNTFmN2M3NSAiYSIgInJvdXRlciIgInN0b3BBdXRob3JpdHkiICJ0b2tlbkFtb3VudFJlZHVjZSIgInRva2VuQW1vdW50SW5jcmVhc2UiIDB4YmE4MTgwNzYgMHgwMyAweDAxMDAwMDAwMDAwMDAwMDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI4CiAgICAvLyBhZG1pbkZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBCUCAvIDUgfSk7IC8vIERlZmF1bHQgYWRtaW4gZmVlIGlzIDIwJQogICAgYnl0ZWMgMTggLy8gImFkbWluRmVlU2hhcmVCUCIKICAgIHB1c2hpbnQgMjAwMCAvLyAyMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIHJlc2VydmVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NgogICAgLy8gZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA2IC8vICJkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY2FuRGVwb3NpdCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEyIC8vICJjYW5EZXBvc2l0IgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDMxCiAgICBwdXNoYnl0ZXNzIDB4NTE2ZDM0N2IgMHgwMWEzYTNmZiAweDc2MTBhNDYwIDB4ZTgzYTg3YWIgMHg5MmUwM2IxYyAweDIxZjFkZGZmIDB4ZDk3OGFkMTQgMHgwZDFiNGMwNiAweDc1YmY5YTI4IDB4ZjQ5M2Q3ZWQgMHg4ZDVjYjZkZiAweGZlMDRhNWNlIDB4MDI4ZTA4NTkgMHg0MWZjOTY2ZSAweGFiZjIwMDE0IDB4MDRiMTYxZjEgMHg2NjU5MWNjZiAweGE1YWU2YmQxIDB4YTA0YzViYzQgMHgzNjFiNjE1OSAweDMyYmJiMDExIDB4Yjg3NzllZTcgMHhlMTdiYWZiNCAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Ub0FwcGxpY2F0aW9uKCl2b2lkIiwgbWV0aG9kICJvcHRJbkFzc2V0KCl2b2lkIiwgbWV0aG9kICJub29wKCl2b2lkIiwgbWV0aG9kICJkZXBvc2l0KCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhdyh1aW50NjQpdm9pZCIsIG1ldGhvZCAic3dhcFRvVlVzZChhZGRyZXNzLHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAic3dhcEZyb21WVXNkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0RmVlU2hhcmUodWludDY0KXZvaWQiLCBtZXRob2QgImFkanVzdFRvdGFsTHBBbW91bnQoKXZvaWQiLCBtZXRob2QgInNldEJhbGFuY2VSYXRpb01pbkJQKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzdG9wRGVwb3NpdCgpdm9pZCIsIG1ldGhvZCAic3RhcnREZXBvc2l0KCl2b2lkIiwgbWV0aG9kICJzdG9wV2l0aGRyYXcoKXZvaWQiLCBtZXRob2QgInN0YXJ0V2l0aGRyYXcoKXZvaWQiLCBtZXRob2QgInNldFN0b3BBdXRob3JpdHkoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJzZXRSb3V0ZXIoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJjbGFpbVJld2FyZHMoKXZvaWQiLCBtZXRob2QgInNldEFkbWluRmVlU2hhcmUodWludDY0KXZvaWQiLCBtZXRob2QgImNsYWltQWRtaW5GZWUoKXZvaWQiLCBtZXRob2QgInBlbmRpbmdSZXdhcmQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgImRlY2ltYWxzKCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyT3duZXJzaGlwKGFkZHJlc3Mpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlQXBwbGljYXRpb25fcm91dGVANSBtYWluX29wdEluVG9BcHBsaWNhdGlvbl9yb3V0ZUA2IG1haW5fb3B0SW5Bc3NldF9yb3V0ZUA3IG1haW5fbm9vcF9yb3V0ZUA4IG1haW5fZGVwb3NpdF9yb3V0ZUA5IG1haW5fd2l0aGRyYXdfcm91dGVAMTAgbWFpbl9zd2FwVG9WVXNkX3JvdXRlQDExIG1haW5fc3dhcEZyb21WVXNkX3JvdXRlQDEyIG1haW5fc2V0RmVlU2hhcmVfcm91dGVAMTMgbWFpbl9hZGp1c3RUb3RhbExwQW1vdW50X3JvdXRlQDE0IG1haW5fc2V0QmFsYW5jZVJhdGlvTWluQlBfcm91dGVAMTUgbWFpbl9zdG9wRGVwb3NpdF9yb3V0ZUAxNiBtYWluX3N0YXJ0RGVwb3NpdF9yb3V0ZUAxNyBtYWluX3N0b3BXaXRoZHJhd19yb3V0ZUAxOCBtYWluX3N0YXJ0V2l0aGRyYXdfcm91dGVAMTkgbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDIwIG1haW5fc2V0Um91dGVyX3JvdXRlQDIxIG1haW5fY2xhaW1SZXdhcmRzX3JvdXRlQDIyIG1haW5fc2V0QWRtaW5GZWVTaGFyZV9yb3V0ZUAyMyBtYWluX2NsYWltQWRtaW5GZWVfcm91dGVAMjQgbWFpbl9wZW5kaW5nUmV3YXJkX3JvdXRlQDI1IG1haW5fZGVjaW1hbHNfcm91dGVAMjYgbWFpbl90cmFuc2Zlck93bmVyc2hpcF9yb3V0ZUAyNwoKbWFpbl9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl90cmFuc2Zlck93bmVyc2hpcF9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiB0cmFuc2Zlck93bmVyc2hpcAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9kZWNpbWFsc19yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo5MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwMDAwMDAwMDAwMDAwMwogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BlbmRpbmdSZXdhcmRfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgcGVuZGluZ1Jld2FyZAogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1BZG1pbkZlZV9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xhaW1BZG1pbkZlZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRBZG1pbkZlZVNoYXJlX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0QWRtaW5GZWVTaGFyZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbGFpbVJld2FyZHNfcm91dGVAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsYWltUmV3YXJkcwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRSb3V0ZXJfcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIHNldFJvdXRlcihyb3V0ZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU3CiAgICAvLyBzZXRSb3V0ZXIocm91dGVyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBjYWxsc3ViIHNldFJvdXRlcgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBzZXRTdG9wQXV0aG9yaXR5KHN0b3BBdXRob3JpdHk6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBzZXRTdG9wQXV0aG9yaXR5KHN0b3BBdXRob3JpdHk6IEFkZHJlc3MpOiB2b2lkIHsKICAgIGNhbGxzdWIgc2V0U3RvcEF1dGhvcml0eQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFydFdpdGhkcmF3X3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQ3CiAgICAvLyBzdGFydFdpdGhkcmF3KCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0YXJ0V2l0aGRyYXcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3RvcFdpdGhkcmF3X3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQyCiAgICAvLyBzdG9wV2l0aGRyYXcoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RvcFdpdGhkcmF3CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0YXJ0RGVwb3NpdF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gc3RhcnREZXBvc2l0KCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0YXJ0RGVwb3NpdAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdG9wRGVwb3NpdF9yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzMgogICAgLy8gc3RvcERlcG9zaXQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RvcERlcG9zaXQKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0QmFsYW5jZVJhdGlvTWluQlBfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjYKICAgIC8vIHNldEJhbGFuY2VSYXRpb01pbkJQKGJhbGFuY2VSYXRpb01pbkJQOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBzZXRCYWxhbmNlUmF0aW9NaW5CUChiYWxhbmNlUmF0aW9NaW5CUDogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIHNldEJhbGFuY2VSYXRpb01pbkJQCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FkanVzdFRvdGFsTHBBbW91bnRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIGFkanVzdFRvdGFsTHBBbW91bnQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYWRqdXN0VG90YWxMcEFtb3VudAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRGZWVTaGFyZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIHNldEZlZVNoYXJlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N3YXBGcm9tVlVzZF9yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI1OS0yNjQKICAgIC8vIHN3YXBGcm9tVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICAgemVyb0ZlZTogYm9vbGVhbiwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI1OS0yNjQKICAgIC8vIHN3YXBGcm9tVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICAgemVyb0ZlZTogYm9vbGVhbiwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBjYWxsc3ViIHN3YXBGcm9tVlVzZAogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcFRvVlVzZF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIxMy0yMTcKICAgIC8vIHN3YXBUb1ZVc2QoCiAgICAvLyAgIHVzZXI6IEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICB6ZXJvRmVlOiBib29sZWFuLAogICAgLy8gKTogdWludDY0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjEzLTIxNwogICAgLy8gc3dhcFRvVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgY2FsbHN1YiBzd2FwVG9WVXNkCiAgICBpdG9iCiAgICBieXRlYyAxOSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl93aXRoZHJhd19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHdpdGhkcmF3CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2RlcG9zaXRfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVwb3NpdAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9ub29wX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo5MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3B0SW5Bc3NldF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NzcKICAgIC8vIG9wdEluQXNzZXQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0SW5Bc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcHRJblRvQXBwbGljYXRpb25fcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBvcHRJblRvQXBwbGljYXRpb24oKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzEgLy8gT3B0SW4KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG9wdEluVG9BcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVBcHBsaWNhdGlvbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTUKICAgIC8vIGNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBBZGRyZXNzLCByb3V0ZXI6IEFkZHJlc3MsIGE6IHVpbnQ2NCwgYXNzZXRJZDogdWludDY0LCBmZWVTaGFyZUJQOiB1aW50NjQsIGJhbGFuY2VSYXRpb01pbkJQOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY3JlYXRlQXBwbGljYXRpb24ob3duZXI6IEFkZHJlc3MsIHJvdXRlcjogQWRkcmVzcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6YmlndWludFRvVWludDY0TW9kdWxvKHY6IGJ5dGVzKSAtPiB1aW50NjQ6CmJpZ3VpbnRUb1VpbnQ2NE1vZHVsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyh2OiBiaWd1aW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjI4CiAgICAvLyBjb25zdCBsZW4gPSBvcC5sZW4oYik7CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MjkKICAgIC8vIGNvbnN0IHN0YXJ0OiB1aW50NjQgPSBsZW4gPiA4ID8gKGxlbiAtIDgpIDogMDsKICAgIGludGNfMiAvLyA4CiAgICA+CiAgICBieiBiaWd1aW50VG9VaW50NjRNb2R1bG9fdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18yIC8vIDgKICAgIC0KCmJpZ3VpbnRUb1VpbnQ2NE1vZHVsb190ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzAKICAgIC8vIGNvbnN0IGxhc3Q4ID0gYi5zbGljZShzdGFydCk7ICAgICAgICAgICAvLyBrZWVwIGxlYXN0LXNpZ25pZmljYW50IDggYnl0ZXMKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgPj0KICAgIGRpZyAyCiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzEKICAgIC8vIHJldHVybiBvcC5idG9pKGxhc3Q4KTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHJldHN1YgoKYmlndWludFRvVWludDY0TW9kdWxvX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czoyOQogICAgLy8gY29uc3Qgc3RhcnQ6IHVpbnQ2NCA9IGxlbiA+IDggPyAobGVuIC0gOCkgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGIgYmlndWludFRvVWludDY0TW9kdWxvX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBieXRlcywgcm91dGVyOiBieXRlcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY3JlYXRlQXBwbGljYXRpb24ob3duZXI6IEFkZHJlc3MsIHJvdXRlcjogQWRkcmVzcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gNiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWMgMTQgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6OQogICAgLy8gdGhpcy5vd25lci52YWx1ZSA9IG93bmVyOwogICAgZnJhbWVfZGlnIC02CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzgKICAgIC8vIHRoaXMuYXNzZXQudmFsdWUgPSBBc3NldChhc3NldElkKTsKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyBhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMjAgLy8gImEiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gdGhpcy5hLnZhbHVlID0gYTsKICAgIGZyYW1lX2RpZyAtNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwCiAgICAvLyByb3V0ZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDIxIC8vICJyb3V0ZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1OAogICAgLy8gdGhpcy5yb3V0ZXIudmFsdWUgPSByb3V0ZXI7CiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MQogICAgLy8gcHJpdmF0ZSBzdG9wQXV0aG9yaXR5ID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBieXRlYyAyMiAvLyAic3RvcEF1dGhvcml0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUgPSBvd25lcjsKICAgIGZyYW1lX2RpZyAtNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyBmZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMTUgLy8gImZlZVNoYXJlQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2MAogICAgLy8gdGhpcy5mZWVTaGFyZUJQLnZhbHVlID0gZmVlU2hhcmVCUDsKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE2IC8vICJiYWxhbmNlUmF0aW9NaW5CUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjYxCiAgICAvLyB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlID0gYmFsYW5jZVJhdGlvTWluQlA7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIGNvbnN0IGRlY2ltYWxzID0gdGhpcy5hc3NldC52YWx1ZS5kZWNpbWFsczsKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBTWVNURU1fUFJFQ0lTSU9OOiB1aW50NjQgPSAzOwogICAgcHVzaGludCAzIC8vIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY0CiAgICAvLyB0aGlzLnRva2VuQW1vdW50UmVkdWNlLnZhbHVlID0gZGVjaW1hbHMgPiBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKGRlY2ltYWxzIC0gU1lTVEVNX1BSRUNJU0lPTikgOiAwOwogICAgPgogICAgYnogY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFNZU1RFTV9QUkVDSVNJT046IHVpbnQ2NCA9IDM7CiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjQKICAgIC8vIHRoaXMudG9rZW5BbW91bnRSZWR1Y2UudmFsdWUgPSBkZWNpbWFscyA+IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoZGVjaW1hbHMgLSBTWVNURU1fUFJFQ0lTSU9OKSA6IDA7CiAgICAtCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBzd2FwCiAgICBleHAKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50UmVkdWNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMjMgLy8gInRva2VuQW1vdW50UmVkdWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjQKICAgIC8vIHRoaXMudG9rZW5BbW91bnRSZWR1Y2UudmFsdWUgPSBkZWNpbWFscyA+IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoZGVjaW1hbHMgLSBTWVNURU1fUFJFQ0lTSU9OKSA6IDA7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHRoaXMudG9rZW5BbW91bnRJbmNyZWFzZS52YWx1ZSA9IGRlY2ltYWxzIDwgU1lTVEVNX1BSRUNJU0lPTiA/IDEwICoqIChTWVNURU1fUFJFQ0lTSU9OIC0gZGVjaW1hbHMpIDogMDsKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMAogICAgLy8gY29uc3QgU1lTVEVNX1BSRUNJU0lPTjogdWludDY0ID0gMzsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdGhpcy50b2tlbkFtb3VudEluY3JlYXNlLnZhbHVlID0gZGVjaW1hbHMgPCBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKFNZU1RFTV9QUkVDSVNJT04gLSBkZWNpbWFscykgOiAwOwogICAgPAogICAgYnogY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMAogICAgLy8gY29uc3QgU1lTVEVNX1BSRUNJU0lPTjogdWludDY0ID0gMzsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdGhpcy50b2tlbkFtb3VudEluY3JlYXNlLnZhbHVlID0gZGVjaW1hbHMgPCBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKFNZU1RFTV9QUkVDSVNJT04gLSBkZWNpbWFscykgOiAwOwogICAgZnJhbWVfZGlnIDAKICAgIC0KICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHN3YXAKICAgIGV4cAoKY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgdG9rZW5BbW91bnRJbmNyZWFzZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDI0IC8vICJ0b2tlbkFtb3VudEluY3JlYXNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHRoaXMudG9rZW5BbW91bnRJbmNyZWFzZS52YWx1ZSA9IGRlY2ltYWxzIDwgU1lTVEVNX1BSRUNJU0lPTiA/IDEwICoqIChTWVNURU1fUFJFQ0lTSU9OIC0gZGVjaW1hbHMpIDogMDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfZmFsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY1CiAgICAvLyB0aGlzLnRva2VuQW1vdW50SW5jcmVhc2UudmFsdWUgPSBkZWNpbWFscyA8IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoU1lTVEVNX1BSRUNJU0lPTiAtIGRlY2ltYWxzKSA6IDA7CiAgICBpbnRjXzAgLy8gMAogICAgYiBjcmVhdGVBcHBsaWNhdGlvbl90ZXJuYXJ5X21lcmdlQDYKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY0CiAgICAvLyB0aGlzLnRva2VuQW1vdW50UmVkdWNlLnZhbHVlID0gZGVjaW1hbHMgPiBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKGRlY2ltYWxzIC0gU1lTVEVNX1BSRUNJU0lPTikgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wub3B0SW5Ub0FwcGxpY2F0aW9uKCkgLT4gdm9pZDoKb3B0SW5Ub0FwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjgKICAgIC8vIG9wdEluVG9BcHBsaWNhdGlvbigpOiB2b2lkIHsKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIHN1cGVyLm9wdEluVG9BcHBsaWNhdGlvbihUeG4uc2VuZGVyKTsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQyCiAgICAvLyBpZiAoIXRoaXMuYmFsYW5jZSh0bykuaGFzVmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDIKICAgIC8vIGlmICghdGhpcy5iYWxhbmNlKHRvKS5oYXNWYWx1ZSkgewogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICBibnogb3B0SW5Ub0FwcGxpY2F0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQzCiAgICAvLyB0aGlzLmJhbGFuY2UodG8pLnZhbHVlID0gMDsKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDMKICAgIC8vIHRoaXMuYmFsYW5jZSh0bykudmFsdWUgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKCm9wdEluVG9BcHBsaWNhdGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDUKICAgIC8vIGlmICghdGhpcy51c2VyUmV3YXJkRGVidCh0bykuaGFzVmFsdWUpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDUKICAgIC8vIGlmICghdGhpcy51c2VyUmV3YXJkRGVidCh0bykuaGFzVmFsdWUpIHsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYm56IG9wdEluVG9BcHBsaWNhdGlvbl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo0NgogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSAwOwogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQ2CiAgICAvLyB0aGlzLnVzZXJSZXdhcmREZWJ0KHRvKS52YWx1ZSA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAoKb3B0SW5Ub0FwcGxpY2F0aW9uX2FmdGVyX2lmX2Vsc2VANToKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9wdEluQXNzZXQoKSAtPiB2b2lkOgpvcHRJbkFzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NzgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6ODEtODcKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjg1CiAgICAvLyBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6ODEtODYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjgxLTg3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo4OQogICAgLy8gbG9nKCdQb29sOiBvcHQtaW4gY29tcGxldGVkJyk7CiAgICBwdXNoYnl0ZXMgIlBvb2w6IG9wdC1pbiBjb21wbGV0ZWQiCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9ubHlSb3V0ZXIoKSAtPiB2b2lkOgpvbmx5Um91dGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OTcKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnJvdXRlci52YWx1ZS5ieXRlcywgJ1Bvb2w6IG9ubHkgcm91dGVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MAogICAgLy8gcm91dGVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInJvdXRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo5NwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMucm91dGVyLnZhbHVlLmJ5dGVzLCAnUG9vbDogb25seSByb3V0ZXInKTsKICAgID09CiAgICBhc3NlcnQgLy8gUG9vbDogb25seSByb3V0ZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9ubHlTdG9wQXV0aG9yaXR5KCkgLT4gdm9pZDoKb25seVN0b3BBdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMDEKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUuYnl0ZXMsICdQb29sOiBpcyBub3Qgc3RvcEF1dGhvcml0eScpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJzdG9wQXV0aG9yaXR5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEwMQogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZS5ieXRlcywgJ1Bvb2w6IGlzIG5vdCBzdG9wQXV0aG9yaXR5Jyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIFBvb2w6IGlzIG5vdCBzdG9wQXV0aG9yaXR5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC52YWxpZGF0ZUJhbGFuY2VSYXRpbygpIC0+IHZvaWQ6CnZhbGlkYXRlQmFsYW5jZVJhdGlvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBwcml2YXRlIHZhbGlkYXRlQmFsYW5jZVJhdGlvKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTAKICAgIC8vIGlmICh0b2tlbkJhbGFuY2UgPiB2VXNkQmFsYW5jZSkgewogICAgPgogICAgYnogdmFsaWRhdGVCYWxhbmNlUmF0aW9fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gYXNzZXJ0KCh2VXNkQmFsYW5jZSAqIEJQKSAvIHRva2VuQmFsYW5jZSA+PSB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlLCAnUG9vbDogbG93IHZVU0QgYmFsYW5jZScpOwogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNvbnN0IEJQOiB1aW50NjQgPSAxMF8wMDA7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gYXNzZXJ0KCh2VXNkQmFsYW5jZSAqIEJQKSAvIHRva2VuQmFsYW5jZSA+PSB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlLCAnUG9vbDogbG93IHZVU0QgYmFsYW5jZScpOwogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTExCiAgICAvLyBhc3NlcnQoKHZVc2RCYWxhbmNlICogQlApIC8gdG9rZW5CYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdlVTRCBiYWxhbmNlJyk7CiAgICA+PQogICAgYXNzZXJ0IC8vIFBvb2w6IGxvdyB2VVNEIGJhbGFuY2UKCnZhbGlkYXRlQmFsYW5jZVJhdGlvX2FmdGVyX2lmX2Vsc2VANToKICAgIHJldHN1YgoKdmFsaWRhdGVCYWxhbmNlUmF0aW9fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIH0gZWxzZSBpZiAodG9rZW5CYWxhbmNlIDwgdlVzZEJhbGFuY2UpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogdmFsaWRhdGVCYWxhbmNlUmF0aW9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIGFzc2VydCgodG9rZW5CYWxhbmNlICogQlApIC8gdlVzZEJhbGFuY2UgPj0gdGhpcy5iYWxhbmNlUmF0aW9NaW5CUC52YWx1ZSwgJ1Bvb2w6IGxvdyB0b2tlbiBiYWxhbmNlJyk7CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBhc3NlcnQoKHRva2VuQmFsYW5jZSAqIEJQKSAvIHZVc2RCYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdG9rZW4gYmFsYW5jZScpOwogICAgKgogICAgZnJhbWVfZGlnIDEKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBhc3NlcnQoKHRva2VuQmFsYW5jZSAqIEJQKSAvIHZVc2RCYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdG9rZW4gYmFsYW5jZScpOwogICAgPj0KICAgIGFzc2VydCAvLyBQb29sOiBsb3cgdG9rZW4gYmFsYW5jZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuZGVwb3NpdCgpIC0+IHZvaWQ6CmRlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMjktMTMwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlcG9zaXQoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjYW5EZXBvc2l0ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7Ly8gaXMgZGVwb3NpdCBvcGVyYXRpb24gYWxsb3dlZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjYW5EZXBvc2l0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gYXNzZXJ0KHRoaXMuY2FuRGVwb3NpdC52YWx1ZSwgJ1Bvb2w6IGRlcG9zaXQgcHJvaGliaXRlZCcpOwogICAgYXNzZXJ0IC8vIFBvb2w6IGRlcG9zaXQgcHJvaGliaXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzYKICAgIC8vIGFzc2VydChUeG4uZ3JvdXBJbmRleCA+IDAsIGBBc3NldCB0eG4gbWlzc2luZ2ApOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGFzc2VydCAvLyBBc3NldCB0eG4gbWlzc2luZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjM5CiAgICAvLyBjb25zdCBwcmV2SWR4OiB1aW50NjQgPSBUeG4uZ3JvdXBJbmRleCAtIDE7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0MQogICAgLy8gY29uc3QgcGF5ID0gZ3R4bi5Bc3NldFRyYW5zZmVyVHhuKHByZXZJZHgpOwogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0NAogICAgLy8gYXNzZXJ0KHBheS5hc3NldFJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgYEFzc2V0IG11c3QgZ28gdG8gYXBwYCk7CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEFzc2V0IG11c3QgZ28gdG8gYXBwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDUKICAgIC8vIGFzc2VydChwYXkueGZlckFzc2V0LmlkID09PSBhc3NldElkLCBgV3JvbmcgYXNzZXRgKTsKICAgIGR1cAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0OAogICAgLy8gYXNzZXJ0KHBheS5yZWtleVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsIGBSZWtleSBub3QgYWxsb3dlZGApOwogICAgZHVwCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gUmVrZXkgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0OQogICAgLy8gYXNzZXJ0KHBheS5hc3NldENsb3NlVG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgYENsb3NlVG8gbm90IGFsbG93ZWRgKTsKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRDbG9zZVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gQ2xvc2VUbyBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjUwCiAgICAvLyByZXR1cm4gcGF5LmFzc2V0QW1vdW50OwogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEzNgogICAgLy8gY29uc3QgYW1vdW50U1AgPSB0aGlzLnRvU3lzdGVtUHJlY2lzaW9uKGFtb3VudCk7CiAgICBjYWxsc3ViIHRvU3lzdGVtUHJlY2lzaW9uCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEzNwogICAgLy8gYXNzZXJ0KGFtb3VudFNQID4gMCwgJ1Bvb2w6IHRvbyBsaXR0bGUnKTsKICAgIGR1cAogICAgYXNzZXJ0IC8vIFBvb2w6IHRvbyBsaXR0bGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQwCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlICs9IGFtb3VudFNQOwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIHJlc2VydmVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQwCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlICs9IGFtb3VudFNQOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIGNvbnN0IG9sZEJhbGFuY2U6IHVpbnQ2NCA9ICh0b2tlbkJhbGFuY2UgKyB2VXNkQmFsYW5jZSk7CiAgICArCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIGlmIChvbGREID09PSAwIHx8IG9sZEJhbGFuY2UgPT09IDApIHsKICAgIGJ6IGRlcG9zaXRfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgNAogICAgYm56IGRlcG9zaXRfZWxzZV9ib2R5QDMKCmRlcG9zaXRfaWZfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBoYWxmQW1vdW50OiB1aW50NjQgPSBhbW91bnRTUCA+PiAxOwogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBzaHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGhhbGZBbW91bnQ7CiAgICBkaWcgMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGhhbGZBbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHZVc2RCYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgKz0gaGFsZkFtb3VudDsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBoYWxmQW1vdW50OwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmRlcG9zaXRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyB0aGlzLnVwZGF0ZUQoKTsKICAgIGNhbGxzdWIgdXBkYXRlRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTU4CiAgICAvLyB0aGlzLmRlcG9zaXRMcChUeG4uc2VuZGVyLCB0aGlzLmQudmFsdWUgLSBvbGREKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1OAogICAgLy8gdGhpcy5kZXBvc2l0THAoVHhuLnNlbmRlciwgdGhpcy5kLnZhbHVlIC0gb2xkRCk7CiAgICBmcmFtZV9kaWcgMAogICAgLQogICAgY2FsbHN1YiBkZXBvc2l0THAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMQogICAgLy8gY29uc3QgTUFYX1RPS0VOX0JBTEFOQ0U6IHVpbnQ2NCA9IDIgKiogNDA7IC8vIE1heCBwb3NzaWJsZSB0b2tlbiBiYWxhbmNlCiAgICBwdXNoaW50IDEwOTk1MTE2Mjc3NzYgLy8gMTA5OTUxMTYyNzc3NgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyBhc3NlcnQodGhpcy50b2tlbkJhbGFuY2UudmFsdWUgPCBNQVhfVE9LRU5fQkFMQU5DRSwgJ1Bvb2w6IHRvbyBtdWNoJyk7CiAgICA8CiAgICBhc3NlcnQgLy8gUG9vbDogdG9vIG11Y2gKICAgIHJldHN1YgoKZGVwb3NpdF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IG5ldyBVaW50TjY0KChCaWdVaW50KGFtb3VudFNQKSAqIEJpZ1VpbnQodG9rZW5CYWxhbmNlKSkgLyBCaWdVaW50KG9sZEJhbGFuY2UpKS5uYXRpdmU7CiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIGRpZyAxCiAgICBiKgogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gOAogICAgYnplcm8KICAgIHN3YXAKICAgIGRpZyAxCiAgICBifAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1MwogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgKz0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50U1ApICogQmlnVWludCh0b2tlbkJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBuZXcgVWludE42NCgoQmlnVWludChhbW91bnRTUCkgKiBCaWdVaW50KHZVc2RCYWxhbmNlKSkgLyBCaWdVaW50KG9sZEJhbGFuY2UpKS5uYXRpdmU7CiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgdW5jb3ZlciA0CiAgICBiKgogICAgdW5jb3ZlciAzCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBidG9pCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTQKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgKz0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50U1ApICogQmlnVWludCh2VXNkQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZGVwb3NpdF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC53aXRoZHJhdyhhbW91bnRMcDogdWludDY0KSAtPiB2b2lkOgp3aXRoZHJhdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OC0xNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gd2l0aGRyYXcoYW1vdW50THA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAiY2FuV2l0aGRyYXciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTIyCiAgICAvLyBhc3NlcnQodGhpcy5jYW5XaXRoZHJhdy52YWx1ZSwgJyJQb29sOiB3aXRoZHJhdyBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gIlBvb2w6IHdpdGhkcmF3IHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE3MwogICAgLy8gdGhpcy53aXRoZHJhd0xwKFR4bi5zZW5kZXIsIGFtb3VudExwKTsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyNgogICAgLy8gbGV0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTI2CiAgICAvLyBsZXQgdXNlckxwQW1vdW50ID0gdGhpcy5iYWxhbmNlKGZyb20pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyNwogICAgLy8gYXNzZXJ0KHVzZXJMcEFtb3VudCA+PSBscEFtb3VudCwgJ1Jld2FyZE1hbmFnZXI6IG5vdCBlbm91Z2ggYW1vdW50Jyk7CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgPj0KICAgIGFzc2VydCAvLyBSZXdhcmRNYW5hZ2VyOiBub3QgZW5vdWdoIGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMjkKICAgIC8vIGxldCBwZW5kaW5nOiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzAKICAgIC8vIGlmICh1c2VyTHBBbW91bnQgPiAwKSB7CiAgICBieiB3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzEKICAgIC8vIHBlbmRpbmcgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWU7CiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgZnJhbWVfZGlnIDMKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzEKICAgIC8vIHBlbmRpbmcgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTMxCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KGZyb20pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBmcmFtZV9idXJ5IDQKCndpdGhkcmF3X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzMKICAgIC8vIHVzZXJMcEFtb3VudCAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzQKICAgIC8vIHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZSAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM0CiAgICAvLyB0aGlzLmJhbGFuY2UoZnJvbSkudmFsdWUgLT0gbHBBbW91bnQ7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMwogICAgLy8gYmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAiYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzQKICAgIC8vIHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZSAtPSBscEFtb3VudDsKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEzNQogICAgLy8gdGhpcy50b3RhbFN1cHBseS52YWx1ZSAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzUKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgLT0gbHBBbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEzNgogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidChmcm9tKS52YWx1ZSA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAzCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM2CiAgICAvLyB0aGlzLnVzZXJSZXdhcmREZWJ0KGZyb20pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpOwogICAgYi8KICAgIGNhbGxzdWIgYmlndWludFRvVWludDY0TW9kdWxvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzQKICAgIC8vIHVzZXJSZXdhcmREZWJ0ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA1IC8vICJ1c2VyUmV3YXJkRGVidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzYKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogYWNjUmV3YXJkUGVyU2hhcmVQIC8gUF9TQ0FMRSk7CiAgICBzd2FwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM3CiAgICAvLyBpZiAocGVuZGluZyA+IDApIHsKICAgIGZyYW1lX2RpZyA0CiAgICBieiB3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzgKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiBmcm9tIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzgKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiBmcm9tIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzkKICAgIC8vIGVtaXQ8UmV3YXJkc0NsYWltZWQ+KHsgdXNlcjogbmV3IEFkZHJlc3MoZnJvbSksIHBlbmRpbmcgfSk7CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDI1IC8vIG1ldGhvZCAiUmV3YXJkc0NsYWltZWQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKCndpdGhkcmF3X2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxNDEKICAgIC8vIGVtaXQ8V2l0aGRyYXc+KHsgZnJvbTogbmV3IEFkZHJlc3MoZnJvbSksIGxwQW1vdW50IH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4ZDNhZmE0ZjEgLy8gbWV0aG9kICJXaXRoZHJhdyhhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgxCiAgICAvLyBjb25zdCBvbGRCYWxhbmNlOiB1aW50NjQgPSAodG9rZW5CYWxhbmNlICsgdlVzZEJhbGFuY2UpOwogICAgZHVwMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE4MgogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgLT0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50THApICogQmlnVWludCh0b2tlbkJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZGlnIDQKICAgIGIqCiAgICBkaWcgMgogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGIvCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA4CiAgICBiemVybwogICAgc3dhcAogICAgZGlnIDEKICAgIGJ8CiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyB0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSAtPSBuZXcgVWludE42NCgoQmlnVWludChhbW91bnRMcCkgKiBCaWdVaW50KHRva2VuQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgzCiAgICAvLyB0aGlzLnZVc2RCYWxhbmNlLnZhbHVlIC09IG5ldyBVaW50TjY0KChCaWdVaW50KGFtb3VudExwKSAqIEJpZ1VpbnQodlVzZEJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgdW5jb3ZlciA1CiAgICBiKgogICAgdW5jb3ZlciAzCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBidG9pCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxODMKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgLT0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50THApICogQmlnVWludCh2VXNkQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gYXNzZXJ0KHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICsgdGhpcy52VXNkQmFsYW5jZS52YWx1ZSA8IG9sZEJhbGFuY2UsICdQb29sOiB6ZXJvIGNoYW5nZXMnKTsKICAgICsKICAgID4KICAgIGFzc2VydCAvLyBQb29sOiB6ZXJvIGNoYW5nZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTg4CiAgICAvLyBhc3NlcnQoYW1vdW50THAgPD0gdGhpcy5yZXNlcnZlcy52YWx1ZSwgJ1Bvb2w6IHJlc2VydmVzJyk7CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICBhc3NlcnQgLy8gUG9vbDogcmVzZXJ2ZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTkxCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlIC09IGFtb3VudExwOwogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTEKICAgIC8vIHRoaXMucmVzZXJ2ZXMudmFsdWUgLT0gYW1vdW50THA7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLnVwZGF0ZUQoKTsKICAgIGNhbGxzdWIgdXBkYXRlRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyBhc3NlcnQodGhpcy5kLnZhbHVlIDwgb2xkRCwgJ1Bvb2w6IHplcm8gRCBjaGFuZ2VzJyk7CiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYXNzZXJ0IC8vIFBvb2w6IHplcm8gRCBjaGFuZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTctMjAxCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50THApLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk5CiAgICAvLyBhc3NldEFtb3VudDogdGhpcy5mcm9tU3lzdGVtUHJlY2lzaW9uKGFtb3VudExwKSwKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBmcm9tU3lzdGVtUHJlY2lzaW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMDAKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTctMjAxCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50THApLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3dhcFRvVlVzZCh1c2VyOiBieXRlcywgYW1vdW50OiB1aW50NjQsIHplcm9GZWU6IHVpbnQ2NCkgLT4gdWludDY0Ogpzd2FwVG9WVXNkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjEzLTIxNwogICAgLy8gc3dhcFRvVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIxOAogICAgLy8gdGhpcy5vbmx5Um91dGVyKCk7CiAgICBjYWxsc3ViIG9ubHlSb3V0ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyMAogICAgLy8gbGV0IHJlc3VsdDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjIwLTIyMQogICAgLy8gbGV0IHJlc3VsdDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICAvLyBsZXQgZmVlOiB1aW50NjQgPSAwOwogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjIKICAgIC8vIGlmIChhbW91bnQgPiAwKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6IHN3YXBUb1ZVc2RfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIGlmICghemVyb0ZlZSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogc3dhcFRvVlVzZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyBmZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJmZWVTaGFyZUJQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyNAogICAgLy8gZmVlID0gKGFtb3VudCAqIHRoaXMuZmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjI0CiAgICAvLyBmZWUgPSAoYW1vdW50ICogdGhpcy5mZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgLwogICAgZnJhbWVfYnVyeSAyCgpzd2FwVG9WVXNkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gY29uc3QgYW1vdW50SW4gPSB0aGlzLnRvU3lzdGVtUHJlY2lzaW9uKGFtb3VudCAtIGZlZSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICAtCiAgICBjYWxsc3ViIHRvU3lzdGVtUHJlY2lzaW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjgKICAgIC8vIGZlZSA9IGFtb3VudCAtIHRoaXMuZnJvbVN5c3RlbVByZWNpc2lvbihhbW91bnRJbik7CiAgICBkdXAKICAgIGNhbGxzdWIgZnJvbVN5c3RlbVByZWNpc2lvbgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMzEKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGFtb3VudEluOwogICAgZGlnIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjMxCiAgICAvLyB0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSArPSBhbW91bnRJbjsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSArPSBhbW91bnRJbjsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18zIC8vICJyZXNlcnZlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSArPSBhbW91bnRJbjsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyBjb25zdCB2VXNkTmV3QW1vdW50ID0gdGhpcy5nZXRZKHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlKTsKICAgIGNhbGxzdWIgZ2V0WQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBpZiAodGhpcy52VXNkQmFsYW5jZS52YWx1ZSA+IHZVc2ROZXdBbW91bnQpIHsKICAgIDwKICAgIGJ6IHN3YXBUb1ZVc2RfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gcmVzdWx0ID0gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSAtIHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgLQogICAgZnJhbWVfYnVyeSAxCgpzd2FwVG9WVXNkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSA9IHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5hZGRSZXdhcmRzKGZlZSk7CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIGFkZFJld2FyZHMKICAgIGZyYW1lX2J1cnkgMwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgNAoKc3dhcFRvVlVzZF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIGVtaXQ8U3dhcHBlZFRvVlVzZD4oeyBzZW5kZXI6IHVzZXIsIHRva2VuSWQ6IHRoaXMuYXNzZXQudmFsdWUuaWQsIGFtb3VudCwgdlVzZEFtb3VudDogcmVzdWx0LCBmZWUgfSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgyYmJiZWNhMyAvLyBtZXRob2QgIlN3YXBwZWRUb1ZVc2QoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gdGhpcy52YWxpZGF0ZUJhbGFuY2VSYXRpbygpOwogICAgY2FsbHN1YiB2YWxpZGF0ZUJhbGFuY2VSYXRpbwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjQ1CiAgICAvLyByZXR1cm4gcmVzdWx0OwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zd2FwRnJvbVZVc2QodXNlcjogYnl0ZXMsIGFtb3VudDogdWludDY0LCByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsIHplcm9GZWU6IHVpbnQ2NCkgLT4gdWludDY0Ogpzd2FwRnJvbVZVc2Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNTktMjY0CiAgICAvLyBzd2FwRnJvbVZVc2QoCiAgICAvLyAgIHVzZXI6IEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gNCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjY1CiAgICAvLyB0aGlzLm9ubHlSb3V0ZXIoKTsKICAgIGNhbGxzdWIgb25seVJvdXRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjY3CiAgICAvLyBsZXQgcmVzdWx0U1A6IHVpbnQ2NCA9IDA7IC8vIDAgYnkgZGVmYXVsdAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI2OC0yNjkKICAgIC8vIGxldCByZXN1bHQ6IHVpbnQ2NCA9IDA7IC8vIDAgYnkgZGVmYXVsdAogICAgLy8gbGV0IGZlZTogdWludDY0ID0gMDsKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjcwCiAgICAvLyBpZiAoYW1vdW50ID4gMCkgewogICAgZnJhbWVfZGlnIC0zCiAgICBieiBzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBhbW91bnQ7CiAgICBmcmFtZV9kaWcgLTMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBhbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHZVc2RCYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzIKICAgIC8vIGNvbnN0IG5ld0Ftb3VudCA9IHRoaXMuZ2V0WSh0aGlzLnZVc2RCYWxhbmNlLnZhbHVlKTsKICAgIGNhbGxzdWIgZ2V0WQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBpZiAodG9rZW5CYWxhbmNlID4gbmV3QW1vdW50KSB7CiAgICA8CiAgICBieiBzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIHJlc3VsdFNQID0gdG9rZW5CYWxhbmNlIC0gbmV3QW1vdW50OwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyByZXN1bHQgPSB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24ocmVzdWx0U1ApOwogICAgY2FsbHN1YiBmcm9tU3lzdGVtUHJlY2lzaW9uCiAgICBmcmFtZV9idXJ5IDMKCnN3YXBGcm9tVlVzZF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gYXNzZXJ0KHJlc3VsdFNQIDw9IHRoaXMucmVzZXJ2ZXMudmFsdWUsICdQb29sOiByZXNlcnZlcycpOwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA8PQogICAgYXNzZXJ0IC8vIFBvb2w6IHJlc2VydmVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSAtPSByZXN1bHRTUDsKICAgIHN3YXAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18zIC8vICJyZXNlcnZlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSAtPSByZXN1bHRTUDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyODMKICAgIC8vIGlmICghemVyb0ZlZSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzkKICAgIC8vIGZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gImZlZVNoYXJlQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyBmZWUgPSAocmVzdWx0ICogdGhpcy5mZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgZnJhbWVfZGlnIDMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNvbnN0IEJQOiB1aW50NjQgPSAxMF8wMDA7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4NAogICAgLy8gZmVlID0gKHJlc3VsdCAqIHRoaXMuZmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIC8KICAgIGZyYW1lX2J1cnkgNAoKc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4NwogICAgLy8gcmVzdWx0IC09IGZlZTsKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4OQogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgPSBuZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5MAogICAgLy8gYXNzZXJ0KHJlc3VsdCA+PSByZWNlaXZlQW1vdW50TWluLCAnUG9vbDogc2xpcHBhZ2UnKTsKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICA+PQogICAgYXNzZXJ0IC8vIFBvb2w6IHNsaXBwYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyOTEtMjk1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiByZXN1bHQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHVzZXIubmF0aXZlLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjkxLTI5NQogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLAogICAgLy8gICBhc3NldEFtb3VudDogcmVzdWx0LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB1c2VyLm5hdGl2ZSwKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gdGhpcy5hZGRSZXdhcmRzKGZlZSk7CiAgICBkaWcgMQogICAgY2FsbHN1YiBhZGRSZXdhcmRzCiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2J1cnkgNQoKc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANzoKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5OAogICAgLy8gZW1pdDxTd2FwcGVkRnJvbVZVc2Q+KHsgcmVjaXBpZW50OiB1c2VyLCB0b2tlbklkOiB0aGlzLmFzc2V0LnZhbHVlLmlkLCB2VXNkQW1vdW50OiBhbW91bnQsIGFtb3VudDogcmVzdWx0LCBmZWUgfSk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhkM2YxZDU0MiAvLyBtZXRob2QgIlN3YXBwZWRGcm9tVlVzZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzAwCiAgICAvLyB0aGlzLnZhbGlkYXRlQmFsYW5jZVJhdGlvKCk7CiAgICBjYWxsc3ViIHZhbGlkYXRlQmFsYW5jZVJhdGlvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDEKICAgIC8vIHJldHVybiByZXN1bHQ7CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldEZlZVNoYXJlKGZlZVNoYXJlQlA6IHVpbnQ2NCkgLT4gdm9pZDoKc2V0RmVlU2hhcmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIHNldEZlZVNoYXJlKGZlZVNoYXJlQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzA5CiAgICAvLyBhc3NlcnQoZmVlU2hhcmVCUCA8PSBCUCwgJ1Bvb2w6IHRvbyBsYXJnZScpOwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTkKICAgIC8vIGV4cG9ydCBjb25zdCBCUDogdWludDY0ID0gMTBfMDAwOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDkKICAgIC8vIGFzc2VydChmZWVTaGFyZUJQIDw9IEJQLCAnUG9vbDogdG9vIGxhcmdlJyk7CiAgICA8PQogICAgYXNzZXJ0IC8vIFBvb2w6IHRvbyBsYXJnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzkKICAgIC8vIGZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyAxNSAvLyAiZmVlU2hhcmVCUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMxMAogICAgLy8gdGhpcy5mZWVTaGFyZUJQLnZhbHVlID0gZmVlU2hhcmVCUDsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmFkanVzdFRvdGFsTHBBbW91bnQoKSAtPiB2b2lkOgphZGp1c3RUb3RhbExwQW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzEzCiAgICAvLyBhZGp1c3RUb3RhbExwQW1vdW50KCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsU3VwcGx5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyBpZiAoZCA+IHRvdGFsU3VwcGx5KSB7CiAgICA+CiAgICBieiBhZGp1c3RUb3RhbExwQW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzE5CiAgICAvLyB0aGlzLmRlcG9zaXRMcChUeG4uc2VuZGVyLCBkIC0gdG90YWxTdXBwbHkpOwogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICBjYWxsc3ViIGRlcG9zaXRMcAoKYWRqdXN0VG90YWxMcEFtb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zZXRCYWxhbmNlUmF0aW9NaW5CUChiYWxhbmNlUmF0aW9NaW5CUDogdWludDY0KSAtPiB2b2lkOgpzZXRCYWxhbmNlUmF0aW9NaW5CUDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gc2V0QmFsYW5jZVJhdGlvTWluQlAoYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI4CiAgICAvLyBhc3NlcnQoYmFsYW5jZVJhdGlvTWluQlAgPD0gQlAsICdQb29sOiB0b28gbGFyZ2UnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI4CiAgICAvLyBhc3NlcnQoYmFsYW5jZVJhdGlvTWluQlAgPD0gQlAsICdQb29sOiB0b28gbGFyZ2UnKTsKICAgIDw9CiAgICBhc3NlcnQgLy8gUG9vbDogdG9vIGxhcmdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MwogICAgLy8gYmFsYW5jZVJhdGlvTWluQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUgPSBiYWxhbmNlUmF0aW9NaW5CUDsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnN0b3BEZXBvc2l0KCkgLT4gdm9pZDoKc3RvcERlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIHRoaXMub25seVN0b3BBdXRob3JpdHkoKTsKICAgIGNhbGxzdWIgb25seVN0b3BBdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjYW5EZXBvc2l0ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7Ly8gaXMgZGVwb3NpdCBvcGVyYXRpb24gYWxsb3dlZAogICAgYnl0ZWMgMTIgLy8gImNhbkRlcG9zaXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIHRoaXMuY2FuRGVwb3NpdC52YWx1ZSA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zdGFydERlcG9zaXQoKSAtPiB2b2lkOgpzdGFydERlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNhbkRlcG9zaXQgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBieXRlYyAxMiAvLyAiY2FuRGVwb3NpdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzOQogICAgLy8gdGhpcy5jYW5EZXBvc2l0LnZhbHVlID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3RvcFdpdGhkcmF3KCkgLT4gdm9pZDoKc3RvcFdpdGhkcmF3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyB0aGlzLm9ubHlTdG9wQXV0aG9yaXR5KCk7CiAgICBjYWxsc3ViIG9ubHlTdG9wQXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0NAogICAgLy8gdGhpcy5jYW5XaXRoZHJhdy52YWx1ZSA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zdGFydFdpdGhkcmF3KCkgLT4gdm9pZDoKc3RhcnRXaXRoZHJhdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0OQogICAgLy8gdGhpcy5jYW5XaXRoZHJhdy52YWx1ZSA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogYnl0ZXMpIC0+IHZvaWQ6CnNldFN0b3BBdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTIKICAgIC8vIHNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTMKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgYnl0ZWMgMjIgLy8gInN0b3BBdXRob3JpdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTQKICAgIC8vIHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZSA9IHN0b3BBdXRob3JpdHk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zZXRSb3V0ZXIocm91dGVyOiBieXRlcykgLT4gdm9pZDoKc2V0Um91dGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU3CiAgICAvLyBzZXRSb3V0ZXIocm91dGVyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MAogICAgLy8gcm91dGVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBieXRlYyAyMSAvLyAicm91dGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU5CiAgICAvLyB0aGlzLnJvdXRlci52YWx1ZSA9IHJvdXRlcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmdldFkoeDogdWludDY0KSAtPiB1aW50NjQ6CmdldFk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjUKICAgIC8vIHByaXZhdGUgZ2V0WSh4OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjYKICAgIC8vIGNvbnN0IHhfID0gQmlnVWludCh4KTsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NgogICAgLy8gZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjcKICAgIC8vIGNvbnN0IGRfID0gQmlnVWludCh0aGlzLmQudmFsdWUpOwogICAgaXRvYgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NQogICAgLy8gYSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGNvbnN0IGE0ID0gQmlnVWludCh0aGlzLmEudmFsdWUgPDwgMik7CiAgICBwdXNoaW50IDIgLy8gMgogICAgc2hsCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2OQogICAgLy8gY29uc3QgYTggPSBCaWdVaW50KGE0ICogMm4pOwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgYioKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3MQogICAgLy8gY29uc3QgZE1pbnVzWElzUG9zaXRpdmUgPSBkXyA+PSB4XzsKICAgIGI8PQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIGNvbnN0IGRNaW51c1hBYnM6IGJpZ3VpbnQgPSBkTWludXNYSXNQb3NpdGl2ZSA/IChkXyAtIHhfKSA6ICh4XyAtIGRfKTsKICAgIGJ6IGdldFlfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIGItCgpnZXRZX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3NAogICAgLy8gY29uc3QgYTRCeURNaW51c1hBYnM6IGJpZ3VpbnQgPSBhNCAqIGRNaW51c1hBYnM7CiAgICBmcmFtZV9kaWcgNAogICAgYioKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzc5CiAgICAvLyBpZiAoZE1pbnVzWElzUG9zaXRpdmUpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBieiBnZXRZX2Vsc2VfYm9keUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODAKICAgIC8vIGlmIChhNEJ5RE1pbnVzWEFicyA+PSBkXykgewogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBiPj0KICAgIGJ6IGdldFlfZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gcGFydDFBYnMgPSBhNEJ5RE1pbnVzWEFicyAtIGRfOwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBiLQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODIKICAgIC8vIHBhcnQxSXNQb3NpdGl2ZSA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQoKZ2V0WV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTMKICAgIC8vIGNvbnN0IHBhcnQyOiBiaWd1aW50ID0gQmlnVWludCh4KSAqIChhNCAqIGRfICogZF8gKiBkXyArIHhfICogKHBhcnQxQWJzICogcGFydDFBYnMpKTsKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiKgogICAgZGlnIDEKICAgIGIqCiAgICBiKgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYioKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYioKICAgIHVuY292ZXIgMgogICAgYisKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTQKICAgIC8vIGxldCBudW1lcmF0b3I6IGJpZ3VpbnQgPSB0aGlzLnNxcnQocGFydDIpOwogICAgY2FsbHN1YiBzcXJ0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTcKICAgIC8vIGlmIChwYXJ0MUlzUG9zaXRpdmUpIHsKICAgIGJ6IGdldFlfZWxzZV9ib2R5QDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTgKICAgIC8vIG51bWVyYXRvciArPSB4XyAqIHBhcnQxQWJzOwogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICBiKgogICAgYisKCmdldFlfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwNAogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhudW1lcmF0b3IgLyAoYTggKiB4XykgKyAxbik7IC8vICsxIHRvIG9mZnNldCByb3VuZGluZyBlcnJvcnMKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgMgogICAgYioKICAgIGIvCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiKwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRZX2Vsc2VfYm9keUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gbnVtZXJhdG9yIC09IHhfICogcGFydDFBYnM7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIGIqCiAgICBiLQogICAgYiBnZXRZX2FmdGVyX2lmX2Vsc2VAMTIKCmdldFlfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODQKICAgIC8vIHBhcnQxQWJzID0gZF8gLSBhNEJ5RE1pbnVzWEFiczsKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgYi0KICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyBwYXJ0MUlzUG9zaXRpdmUgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBiIGdldFlfYWZ0ZXJfaWZfZWxzZUA5CgpnZXRZX2Vsc2VfYm9keUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzg4CiAgICAvLyBwYXJ0MUFicyA9IGE0QnlETWludXNYQWJzICsgZF87CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDMKICAgIGIrCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gcGFydDFJc1Bvc2l0aXZlID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRZX2FmdGVyX2lmX2Vsc2VAOQoKZ2V0WV90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIGNvbnN0IGRNaW51c1hBYnM6IGJpZ3VpbnQgPSBkTWludXNYSXNQb3NpdGl2ZSA/IChkXyAtIHhfKSA6ICh4XyAtIGRfKTsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMwogICAgYi0KICAgIGIgZ2V0WV90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC51cGRhdGVEKCkgLT4gdm9pZDoKdXBkYXRlRDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwNwogICAgLy8gcHJpdmF0ZSB1cGRhdGVEKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDA4CiAgICAvLyBjb25zdCB4ID0gQmlnVWludCh0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSk7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwOQogICAgLy8gY29uc3QgeSA9IEJpZ1VpbnQodGhpcy52VXNkQmFsYW5jZS52YWx1ZSk7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MTQKICAgIC8vIGNvbnN0IHh5OiBiaWd1aW50ID0geCAqIHk7CiAgICBkdXAyCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDUKICAgIC8vIGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDE1CiAgICAvLyBjb25zdCBhXyA9IEJpZ1VpbnQodGhpcy5hLnZhbHVlKTsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gY29uc3QgcDE6IGJpZ3VpbnQgPSBhXyAqIHh5ICogKHggKyB5KTsKICAgIGR1cAogICAgZGlnIDIKICAgIGIqCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgYisKICAgIGIqCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxOQogICAgLy8gY29uc3QgcDI6IGJpZ3VpbnQgPSAoeHkgKiAoKGFfICogNG4pIC0gMW4pKSAvIDNuOwogICAgcHVzaGJ5dGVzIDB4MDQKICAgIGIqCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiLQogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWMgMjYgLy8gMHgwMwogICAgYi8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyMQogICAgLy8gY29uc3QgcDM6IGJpZ3VpbnQgPSB0aGlzLnNxcnQoKHAxICogcDEpICsgKHAyICogcDIgKiBwMikpOwogICAgZGlnIDEKICAgIGRpZyAyCiAgICBiKgogICAgZGlnIDEKICAgIGRpZyAyCiAgICBiKgogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYisKICAgIGNhbGxzdWIgc3FydAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjIKICAgIC8vIGxldCBkXyA9IHRoaXMuY2JydChwMSArIHAzKTsKICAgIGR1cDIKICAgIGIrCiAgICBjYWxsc3ViIGNicnQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gaWYgKHAzID4gcDEpIHsKICAgIGI8CiAgICBieiB1cGRhdGVEX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjQKICAgIC8vIGRfIC09IHRoaXMuY2JydChwMyAtIHAxKTsKICAgIGZyYW1lX2RpZyAwCiAgICBiLQogICAgY2FsbHN1YiBjYnJ0CiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgLQogICAgZnJhbWVfYnVyeSAxCgp1cGRhdGVEX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyOAogICAgLy8gdGhpcy5kLnZhbHVlID0gKGRfIDw8IDEpOwogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBzaGwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDYgLy8gImQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjgKICAgIC8vIHRoaXMuZC52YWx1ZSA9IChkXyA8PCAxKTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnVwZGF0ZURfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjYKICAgIC8vIGRfICs9IHRoaXMuY2JydChwMSAtIHAzKTsKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBiLQogICAgY2FsbHN1YiBjYnJ0CiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHVwZGF0ZURfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wudG9TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9TeXN0ZW1QcmVjaXNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIHByaXZhdGUgdG9TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OAogICAgLy8gcHJpdmF0ZSB0b2tlbkFtb3VudFJlZHVjZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAidG9rZW5BbW91bnRSZWR1Y2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50SW5jcmVhc2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInRva2VuQW1vdW50SW5jcmVhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDM1CiAgICAvLyBpZiAodG9rZW5BbW91bnRSZWR1Y2UgPiAwKSB7CiAgICBieiB0b1N5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDM2CiAgICAvLyByZXR1cm4gYW1vdW50IC8gdG9rZW5BbW91bnRSZWR1Y2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9TeXN0ZW1QcmVjaXNpb25fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzcKICAgIC8vIH0gZWxzZSBpZiAodG9rZW5BbW91bnRJbmNyZWFzZSA+IDApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBieiB0b1N5c3RlbVByZWNpc2lvbl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzOAogICAgLy8gcmV0dXJuIGFtb3VudCAqIHRva2VuQW1vdW50SW5jcmVhc2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAxCiAgICAqCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyByZXR1cm4gYW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKZnJvbVN5c3RlbVByZWNpc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0MwogICAgLy8gcHJpdmF0ZSBmcm9tU3lzdGVtUHJlY2lzaW9uKGFtb3VudDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgKICAgIC8vIHByaXZhdGUgdG9rZW5BbW91bnRSZWR1Y2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gInRva2VuQW1vdW50UmVkdWNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OQogICAgLy8gcHJpdmF0ZSB0b2tlbkFtb3VudEluY3JlYXNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJ0b2tlbkFtb3VudEluY3JlYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0NwogICAgLy8gaWYgKHRva2VuQW1vdW50UmVkdWNlID4gMCkgewogICAgYnogZnJvbVN5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQ4CiAgICAvLyByZXR1cm4gYW1vdW50ICogdG9rZW5BbW91bnRSZWR1Y2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAwCiAgICAqCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZnJvbVN5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0OQogICAgLy8gfSBlbHNlIGlmICh0b2tlbkFtb3VudEluY3JlYXNlID4gMCkgewogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGZyb21TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTAKICAgIC8vIHJldHVybiBhbW91bnQgLyB0b2tlbkFtb3VudEluY3JlYXNlOwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMQogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmZyb21TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDUyCiAgICAvLyByZXR1cm4gYW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNxcnQobjogYnl0ZXMpIC0+IGJ5dGVzOgpzcXJ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDU1CiAgICAvLyBwcml2YXRlIHNxcnQobjogYmlndWludCk6IGJpZ3VpbnQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTYKICAgIC8vIGFzc2VydChuID4gMG4sICduIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hieXRlcyAweAogICAgYj4KICAgIGFzc2VydCAvLyBuIG11c3QgYmUgbm9uLW5lZ2F0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTcKICAgIC8vIGlmIChuID09PSAwbikgcmV0dXJuIDBuOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYnogc3FydF9hZnRlcl9pZl9lbHNlQDIKICAgIHB1c2hieXRlcyAweAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnNxcnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDU4CiAgICAvLyBpZiAobiA8PSAzbikgcmV0dXJuIDFuOwogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlYyAyNiAvLyAweDAzCiAgICBiPD0KICAgIGJ6IHNxcnRfYWZ0ZXJfaWZfZWxzZUA0CiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc3FydF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjEKICAgIC8vIGNvbnN0IGJsID0gYml0TGVuZ3RoKEJ5dGVzKG4pKTsKICAgIGZyYW1lX2RpZyAtMQogICAgYml0bGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjIKICAgIC8vIGxldCB3aWRlID0gZXhwdygyLCAoYmwgKyAxKSAvIDIpOwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAvCiAgICBwdXNoaW50IDIgLy8gMgogICAgc3dhcAogICAgZXhwdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBjb25zdCBoaSA9IEJpZ1VpbnQod2lkZVswXSk7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjQKICAgIC8vIGNvbnN0IGxvID0gQmlnVWludCh3aWRlWzFdKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2NQogICAgLy8gbGV0IHg6IGJpZ3VpbnQgPSBoaSAqIFNISUZUNjQgKyBsbzsKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBjb25zdCBTSElGVDY0OiBiaWd1aW50ID0gMTg0NDY3NDQwNzM3MDk1NTE2MTZuOyAvLyAyXjY0CiAgICBieXRlYyAyNyAvLyAweDAxMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyBsZXQgeDogYmlndWludCA9IGhpICogU0hJRlQ2NCArIGxvOwogICAgYioKICAgIGIrCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY4CiAgICAvLyBsZXQgeTogYmlndWludCA9ICh4ICsgbiAvIHgpIC8gMm47CiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAxCiAgICBiLwogICAgYisKICAgIGJ5dGVjIDE3IC8vIDB4MDIKICAgIGIvCiAgICBmcmFtZV9idXJ5IDEKCnNxcnRfd2hpbGVfdG9wQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjkKICAgIC8vIHdoaWxlICh5IDwgeCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICBiPAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY5LTQ3MgogICAgLy8gd2hpbGUgKHkgPCB4KSB7CiAgICAvLyAgIHggPSB5OwogICAgLy8gICB5ID0gKHggKyBuIC8geCkgLyAybjsKICAgIC8vIH0KICAgIGJ6IHNxcnRfYWZ0ZXJfd2hpbGVANwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDcxCiAgICAvLyB5ID0gKHggKyBuIC8geCkgLyAybjsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYi8KICAgIGRpZyAxCiAgICBiKwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgYi8KICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICBiIHNxcnRfd2hpbGVfdG9wQDUKCnNxcnRfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ3MwogICAgLy8gcmV0dXJuIHg7CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5jYnJ0KG46IGJ5dGVzKSAtPiB1aW50NjQ6CmNicnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzYKICAgIC8vIHByaXZhdGUgY2JydChuOiBiaWd1aW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDc3CiAgICAvLyBpZiAobiA9PT0gMG4pIHJldHVybiAwOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYnogY2JydF9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2JydF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzgKICAgIC8vIGlmIChuIDwgOG4pIHJldHVybiAxOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgwOAogICAgYjwKICAgIGJ6IGNicnRfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNicnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgxCiAgICAvLyBjb25zdCBibCA9IGJpdExlbmd0aChCeXRlcyhuKSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJpdGxlbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgyCiAgICAvLyBsZXQgd2lkZSA9IGV4cHcoMiwgKGJsICsgMikgLyAzKTsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBwdXNoaW50IDMgLy8gMwogICAgLwogICAgcHVzaGludCAyIC8vIDIKICAgIHN3YXAKICAgIGV4cHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4MwogICAgLy8gY29uc3QgaGkgPSBCaWdVaW50KHdpZGVbMF0pOwogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyBjb25zdCBsbyA9IEJpZ1VpbnQod2lkZVsxXSk7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODUKICAgIC8vIGxldCB4OiBiaWd1aW50ID0gaGkgKiBTSElGVDY0ICsgbG87CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMgogICAgLy8gY29uc3QgU0hJRlQ2NDogYmlndWludCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE2bjsgLy8gMl42NAogICAgYnl0ZWMgMjcgLy8gMHgwMTAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gbGV0IHg6IGJpZ3VpbnQgPSBoaSAqIFNISUZUNjQgKyBsbzsKICAgIGIqCiAgICBiKwogICAgZnJhbWVfYnVyeSAxCgpjYnJ0X3doaWxlX3RvcEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDg5CiAgICAvLyBjb25zdCB4MjogYmlndWludCA9IHggKiB4OwogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYioKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTAKICAgIC8vIGlmICh4MiA9PT0gMG4pIGJyZWFrOyAvLyBzaG91bGQgbm90IGhhcHBlbiBmb3IgeD4wCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYm56IGNicnRfd2hpbGVfdG9wQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTEKICAgIC8vIGNvbnN0IG5leHQ6IGJpZ3VpbnQgPSAoMm4gKiB4ICsgbiAvIHgyKSAvIDNuOwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYioKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDMKICAgIGIvCiAgICBiKwogICAgYnl0ZWMgMjYgLy8gMHgwMwogICAgYi8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTIKICAgIC8vIGlmIChuZXh0ID09PSB4IHx8IG5leHQgPT09IHggLSAxbikgewogICAgYj09CiAgICBibnogY2JydF9pZl9ib2R5QDEwCiAgICBmcmFtZV9kaWcgMQogICAgYnl0ZWMgMTAgLy8gMHgwMQogICAgYi0KICAgIGZyYW1lX2RpZyAwCiAgICBiPT0KICAgIGJ6IGNicnRfYWZ0ZXJfaWZfZWxzZUAxMQoKY2JydF9pZl9ib2R5QDEwOgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMQoKY2JydF93aGlsZV90b3BAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MDAKICAgIC8vIHdoaWxlICgoeCArIDFuKSAqICh4ICsgMW4pICogKHggKyAxbikgPD0gbikgeCArPSAxbjsKICAgIGZyYW1lX2RpZyAxCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgZGlnIDEKICAgIGIqCiAgICBiKgogICAgZnJhbWVfZGlnIC0xCiAgICBiPD0KICAgIGJ6IGNicnRfd2hpbGVfdG9wQDE3CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNicnRfd2hpbGVfdG9wQDE0CgpjYnJ0X3doaWxlX3RvcEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUwMQogICAgLy8gd2hpbGUgKHggKiB4ICogeCA+IG4pIHggLT0gMW47CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBkaWcgMQogICAgYioKICAgIGIqCiAgICBmcmFtZV9kaWcgLTEKICAgIGI+CiAgICBieiBjYnJ0X2FmdGVyX3doaWxlQDE5CiAgICBmcmFtZV9kaWcgMQogICAgYnl0ZWMgMTAgLy8gMHgwMQogICAgYi0KICAgIGZyYW1lX2J1cnkgMQogICAgYiBjYnJ0X3doaWxlX3RvcEAxNwoKY2JydF9hZnRlcl93aGlsZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUwMgogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyh4KTsKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNicnRfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgY2JydF93aGlsZV90b3BANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5jbGFpbVJld2FyZHMoKSAtPiB2b2lkOgpjbGFpbVJld2FyZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTAtNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gY2xhaW1SZXdhcmRzKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUyCiAgICAvLyBjb25zdCB1c2VyID0gVHhuLnNlbmRlcjsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUzCiAgICAvLyBjb25zdCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodXNlcikudmFsdWU7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUzCiAgICAvLyBjb25zdCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodXNlcikudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTQKICAgIC8vIGlmICh1c2VyTHBBbW91bnQgPiAwKSB7CiAgICBieiBjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IHJld2FyZHMgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgLyBQX1NDQUxFKTsKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU1CiAgICAvLyBjb25zdCByZXdhcmRzID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlIC8gUF9TQ0FMRSk7CiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IHJld2FyZHMgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgLyBQX1NDQUxFKTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NgogICAgLy8gY29uc3QgcGVuZGluZzogdWludDY0ID0gcmV3YXJkcyAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU2CiAgICAvLyBjb25zdCBwZW5kaW5nOiB1aW50NjQgPSByZXdhcmRzIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NwogICAgLy8gaWYgKHBlbmRpbmcgPiAwKSB7CiAgICBieiBjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTgKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWUgPSByZXdhcmRzOwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTgKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWUgPSByZXdhcmRzOwogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHVzZXIgfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHVzZXIgfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjYwCiAgICAvLyBlbWl0PFJld2FyZHNDbGFpbWVkPih7IHVzZXI6IG5ldyBBZGRyZXNzKHVzZXIpLCBwZW5kaW5nIH0pOwogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlYyAyNSAvLyBtZXRob2QgIlJld2FyZHNDbGFpbWVkKGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCgpjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLnNldEFkbWluRmVlU2hhcmUoYWRtaW5GZWVTaGFyZUJQOiB1aW50NjQpIC0+IHZvaWQ6CnNldEFkbWluRmVlU2hhcmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjUtNjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0QWRtaW5GZWVTaGFyZShhZG1pbkZlZVNoYXJlQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjcKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY4CiAgICAvLyBhc3NlcnQoYWRtaW5GZWVTaGFyZUJQIDw9IEJQLCAnUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY4CiAgICAvLyBhc3NlcnQoYWRtaW5GZWVTaGFyZUJQIDw9IEJQLCAnUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gnKTsKICAgIDw9CiAgICBhc3NlcnQgLy8gUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOAogICAgLy8gYWRtaW5GZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogQlAgLyA1IH0pOyAvLyBEZWZhdWx0IGFkbWluIGZlZSBpcyAyMCUKICAgIGJ5dGVjIDE4IC8vICJhZG1pbkZlZVNoYXJlQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjkKICAgIC8vIHRoaXMuYWRtaW5GZWVTaGFyZUJQLnZhbHVlID0gYWRtaW5GZWVTaGFyZUJQOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmNsYWltQWRtaW5GZWUoKSAtPiB2b2lkOgpjbGFpbUFkbWluRmVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjcyLTczCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGNsYWltQWRtaW5GZWUoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3NAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3NgogICAgLy8gaWYgKGFkbWluRmVlQW1vdW50ID4gMCkgewogICAgYnogY2xhaW1BZG1pbkZlZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3Ny04MQogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFkbWluRmVlQW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAib3duZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3Ny04MQogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFkbWluRmVlQW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMxCiAgICAvLyBhZG1pbkZlZUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODIKICAgIC8vIHRoaXMuYWRtaW5GZWVBbW91bnQudmFsdWUgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbUFkbWluRmVlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5wZW5kaW5nUmV3YXJkKHVzZXI6IGJ5dGVzKSAtPiB1aW50NjQ6CnBlbmRpbmdSZXdhcmQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODYtODcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gcGVuZGluZ1Jld2FyZCh1c2VyOiBBY2NvdW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODgKICAgIC8vIHJldHVybiBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodGhpcy5iYWxhbmNlKHVzZXIpLnZhbHVlKSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlKSAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo4OAogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbygoQmlnVWludCh0aGlzLmJhbGFuY2UodXNlcikudmFsdWUpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUpIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KHVzZXIpLnZhbHVlOwogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyMAogICAgLy8gY29uc3QgUF9TQ0FMRTogYmlndWludCA9IEJpZ1VpbnQoMSA8PCBQKTsKICAgIGJ5dGVjIDkgLy8gMHgwMTAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5hZGRSZXdhcmRzKHJld2FyZEFtb3VudDogdWludDY0KSAtPiB2b2lkOgphZGRSZXdhcmRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk2CiAgICAvLyBwcm90ZWN0ZWQgYWRkUmV3YXJkcyhyZXdhcmRBbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjkKICAgIC8vIHRvdGFsU3VwcGx5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk4CiAgICAvLyBpZiAodG90YWxTdXBwbHkgPiAwKSB7CiAgICBieiBhZGRSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI4CiAgICAvLyBhZG1pbkZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBCUCAvIDUgfSk7IC8vIERlZmF1bHQgYWRtaW4gZmVlIGlzIDIwJQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJhZG1pbkZlZVNoYXJlQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk5CiAgICAvLyBjb25zdCBhZG1pbkZlZVJld2FyZHM6IHVpbnQ2NCA9IChyZXdhcmRBbW91bnQgKiB0aGlzLmFkbWluRmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk5CiAgICAvLyBjb25zdCBhZG1pbkZlZVJld2FyZHM6IHVpbnQ2NCA9IChyZXdhcmRBbW91bnQgKiB0aGlzLmFkbWluRmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDAKICAgIC8vIHJld2FyZEFtb3VudCAtPSBhZG1pbkZlZVJld2FyZHM7CiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAxCiAgICAtCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMQogICAgLy8gdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgKz0gQmlnVWludChyZXdhcmRBbW91bnQpICogUF9TQ0FMRSAvIEJpZ1VpbnQodG90YWxTdXBwbHkpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDEKICAgIC8vIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlICs9IEJpZ1VpbnQocmV3YXJkQW1vdW50KSAqIFBfU0NBTEUgLyBCaWdVaW50KHRvdGFsU3VwcGx5KTsKICAgIGIqCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgYi8KICAgIGIrCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGJ5dGVjIDggLy8gImFjY1Jld2FyZFBlclNoYXJlUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDEKICAgIC8vIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlICs9IEJpZ1VpbnQocmV3YXJkQW1vdW50KSAqIFBfU0NBTEUgLyBCaWdVaW50KHRvdGFsU3VwcGx5KTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMgogICAgLy8gdGhpcy5hZG1pbkZlZUFtb3VudC52YWx1ZSArPSBhZG1pbkZlZVJld2FyZHM7CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDIKICAgIC8vIHRoaXMuYWRtaW5GZWVBbW91bnQudmFsdWUgKz0gYWRtaW5GZWVSZXdhcmRzOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFkZFJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmRlcG9zaXRMcCh0bzogYnl0ZXMsIGxwQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmRlcG9zaXRMcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDYKICAgIC8vIHByb3RlY3RlZCBkZXBvc2l0THAodG86IEFjY291bnQsIGxwQW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDgKICAgIC8vIGxldCBwZW5kaW5nOiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDkKICAgIC8vIGxldCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodG8pLnZhbHVlOwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwOQogICAgLy8gbGV0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZSh0bykudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTEwCiAgICAvLyBpZiAodXNlckxwQW1vdW50ID4gMCkgewogICAgYnogZGVwb3NpdExwX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExMQogICAgLy8gcGVuZGluZyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlOwogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTExCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExMQogICAgLy8gcGVuZGluZyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBmcmFtZV9idXJ5IDEKCmRlcG9zaXRMcF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTEzCiAgICAvLyB1c2VyTHBBbW91bnQgKz0gbHBBbW91bnQ7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE0CiAgICAvLyB0aGlzLmJhbGFuY2UodG8pLnZhbHVlICs9IGxwQW1vdW50OwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNAogICAgLy8gdGhpcy5iYWxhbmNlKHRvKS52YWx1ZSArPSBscEFtb3VudDsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9kaWcgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMwogICAgLy8gYmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAiYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTQKICAgIC8vIHRoaXMuYmFsYW5jZSh0bykudmFsdWUgKz0gbHBBbW91bnQ7CiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsU3VwcGx5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTUKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgKz0gbHBBbW91bnQ7CiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE1CiAgICAvLyB0aGlzLnRvdGFsU3VwcGx5LnZhbHVlICs9IGxwQW1vdW50OwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTcKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSk7CiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMAogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyMAogICAgLy8gY29uc3QgUF9TQ0FMRTogYmlndWludCA9IEJpZ1VpbnQoMSA8PCBQKTsKICAgIGJ5dGVjIDkgLy8gMHgwMTAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNwogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzQKICAgIC8vIHVzZXJSZXdhcmREZWJ0ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA1IC8vICJ1c2VyUmV3YXJkRGVidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTcKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSk7CiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTgKICAgIC8vIGlmIChwZW5kaW5nID4gMCkgewogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGRlcG9zaXRMcF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTkKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiB0byB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTkKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiB0byB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTIwCiAgICAvLyBlbWl0PFJld2FyZHNDbGFpbWVkPih7IHVzZXI6IG5ldyBBZGRyZXNzKHRvKSwgcGVuZGluZyB9KTsKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAyNSAvLyBtZXRob2QgIlJld2FyZHNDbGFpbWVkKGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCgpkZXBvc2l0THBfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyMgogICAgLy8gZW1pdDxEZXBvc2l0Pih7IHRvOiBuZXcgQWRkcmVzcyh0byksIGxwQW1vdW50IH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4Y2ZhYjg3MjMgLy8gbWV0aG9kICJEZXBvc2l0KGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo6T3duYWJsZS5vbmx5T3duZXIoKSAtPiB2b2lkOgpvbmx5T3duZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgb3duZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjpPd25hYmxlLnRyYW5zZmVyT3duZXJzaGlwKG5ld093bmVyOiBieXRlcykgLT4gdm9pZDoKdHJhbnNmZXJPd25lcnNoaXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNi0xNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGJ5dGVjIDE0IC8vICJvd25lciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE5CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gbmV3T3duZXI7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK",clear:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},byteCode:{approval:"CiAFAAEIBJBOJhwMdG9rZW5CYWxhbmNlC3ZVc2RCYWxhbmNlBWFzc2V0CHJlc2VydmVzB2JhbGFuY2UOdXNlclJld2FyZERlYnQBZAt0b3RhbFN1cHBseRJhY2NSZXdhcmRQZXJTaGFyZVAHAQAAAAAAAAEBDmFkbWluRmVlQW1vdW50CmNhbkRlcG9zaXQLY2FuV2l0aGRyYXcFb3duZXIKZmVlU2hhcmVCUBFiYWxhbmNlUmF0aW9NaW5CUAECD2FkbWluRmVlU2hhcmVCUAQVH3x1AWEGcm91dGVyDXN0b3BBdXRob3JpdHkRdG9rZW5BbW91bnRSZWR1Y2UTdG9rZW5BbW91bnRJbmNyZWFzZQS6gYB2AQMJAQAAAAAAAAAAMRhAACgnEoHQD2cnByJnJwiAAGcnCyJnKCJnKSJnKyJnJwYiZycMI2cnDSNnMRtBAKiCFwRRbTR7BAGjo/8EdhCkYAToOoerBJLgOxwEIfHd/wTZeK0UBA0bTAYEdb+aKAT0k9ftBI1ctt8E/gSlzgQCjghZBEH8lm4Eq/IAFAQEsWHxBGZZHM8Epa5r0QSgTFvEBDYbYVkEMruwEQS4d57nBOF7r7Q2GgCOFwFhAVQBSAE/ATMBIwEFAOMA0wDHALcAqwCfAJMAhwB4AGkAXQBNAEEAKQARAAIiQzEZFEQxGEQ2GgGICuAjQzEZFEQxGESADBUffHUAAAAAAAAAA7AjQzEZFEQxGEQ2GgEXwByICbMWJxNMULAjQzEZFEQxGESICXEjQzEZFEQxGEQ2GgEXiAlPI0MxGRREMRhEiAjlI0MxGRREMRhENhoBiAY/I0MxGRREMRhENhoBiAYkI0MxGRREMRhEiAYQI0MxGRREMRhEiAX8I0MxGRREMRhEiAXoI0MxGRREMRhEiAXUI0MxGRREMRhENhoBF4gFsiNDMRkURDEYRIgFfSNDMRkURDEYRDYaAReIBVsjQzEZFEQxGEQ2GgE2GgIXNhoDFzYaBCJTiAR7FicTTFCwI0MxGRREMRhENhoBNhoCFzYaAyJTiAO+FicTTFCwI0MxGRREMRhENhoBF4gCcCNDMRkURDEYRIgBfiNDMRkURDEYRCNDMRkURDEYRIgA4iNDMRkjEkQxGESIAK4jQzEZFEQxGBRENhoBNhoCNhoDFzYaBBc2GgUXNhoGF4gAKiNDigEBi/8VSSQNQQAYiwAkCUmLAElOAw9LAkxNi/9MTwJSF0yJIkL/6IoGACcOi/pnKov9ZycUi/xnJxWL+2cnFov6ZycPi/5nJxCL/2ciKmVEcQFMSU8CRIEDDUEAJ4sAgQMJgQpMlCcXTGeLAIEDDEEADoEDiwAJgQpMlCcYTGeJIkL/9yJC/96KAAAxAEkiJwRjRQFAAAaLACcEImaLACInBWNFAUAABosAJwUiZomICK6xIiplRDIKshQishKyESWyECKyAbOAFlBvb2w6IG9wdC1pbiBjb21wbGV0ZWSwiTEAIicVZUQSRIkxACInFmVEEkSJigAAIihlTElPAkQiKWVMSU4CTgNEDUEAEIsBIQQLiwAKIicQZUQPRImLAIsBDEH/94sAIQQLiwEKIicQZUQPRImKAAAiJwxlREQiJwZlTElPAkQiKmVEMRZEMRYjCUk4ECUSREk4FDIKEkRJOBFPAhJESTggMgMSREk4FTIDEkQ4EogE2klOAklEIitlRAgrTGciKGVMSU4CTgNEIillTElOAk4ERAhMQQAFiwRAADSLASORIihlREsBCChMZyIpZUQIKUxniAQiMQAiJwZlRIsACYgG/CIoZUSBgICAgIAgDESJIihlRIsBFosCFksBo4sEFkxLAaJJFSQORCSvTEsBqxdPBAgoTGciKWVEiwMWTwSjTwOiSRUkDkRPAqsXCClMZ0L/n4oBACInDWVERCInBmVEMQBJIicEY0xJTwJESYv/D0QiJwhlTE4CRCJMQQAWiwIWiwOjJwmiiP2riwEiJwVjRAmMBIsCi/8JiwFJIicEY0SL/wlLAScETwJmIicHZUSL/wknB0xnTBaLA6MnCaKI/XMnBUxmiwRBACOxIiplRIsBSU4CshSLBElOArISshElshAisgGzFlAnGUxQsIv/FosBSwFQgATTr6TxTFCwIihlRCIpZURKCCIoZURPAxZLBKNLAhZMSwGiSRUkDkQkr0xLAasXTwNMCShMZyIpZURPBBZPBaNPA6JJFSQORE8CqxcJKUxnIihlRCIpZUQIDUQiK2VEi/8PRCIrZUSL/wkrTGeIAq8iJwZlRIsADESxIiplRIv/iANBMQCyFLISshElshAisgGziYoDAYAAiP2FIkcDi/5BAGGL/0AADSInD2VEi/4LIQQKjAKL/osCCYgC1kmIAwOL/kwJjAIiKGVESwEIKExnIitlRAgrTGciKGVEiAGbSYwAIillRAxBAAkiKWVEiwAJjAEpiwBniwJJiATIjAOLAYwEiwOLBCIqZUQWi/4WSwIWTwQWi/1PBFBPA1BPAlBMUIAEK7vso0xQsIj9BYwAiYoEAYAASYj85SJHBIv9QQCFIillRIv9CClMZyIpZUSIASdJjAAiKGVMSU4CjAFEDEEADYsBiwAJSYwCiAJUjAMiK2VEiwJJTwIORCIrZURMCStMZ4v/QAANIicPZUSLAwshBAqMBIsDiwRJTgIJKIsAZ0mL/g9EsSIqZUSL/LIUSwGyErIRJbIQIrIBs0sBiAQCjAaMBYsFiwYiKmVEFov9FksCFk8EFov8TwRQTwNQTwJQTFCABNPx1UJMULCI/EGMAImKAQCIBKOL/yEEDkQnD4v/Z4mKAACIBJEiJwZlTElPAkQiJwdlTElOAk4DRA1BAAoxAIsAiwEJiAPWiYoBAIgEaIv/IQQORCcQi/9niYj75CcMImeJiARRJwwjZ4mI+9QnDSJniYgEQScNI2eJigEAiAQ2JxaL/2eJigEAiAQqJxWL/2eJigEBIkmL/xZJIicGZUQWSU4CIicUZUSBApAWSU4DJxGjTgKmSUEAdIsDiwKhiwSjjACLBkEAWosAiwOnQQBHiwCLA6GMASOLBIsDSU4Co0sBo6OLAUmjiwJJTwKjTwKgo4gBFkxBABWLAosBo6CLBYsCo6InCqCI+kmMAImLAosBo6FC/+iLA4sAoYwBIkL/tosAiwOgjAEiQv+riwKLA6FC/4mKAAAiKGVEFiIpZUQWSqMiJxRlRBZJSwKjTwRPBKCjSU4CTgOAAQSjJwqhTwKjJxqiSwFLAqNLAUsCo08Co6CIAJRJTgJKoIgA8k4DpEEAFYsAoYgA5osBTAmMAYsBI5AnBkxniYsATKGIANCLAQiMAUL/6IoBASInF2VMSU8CRCInGGVMTgJEQQAIi/+LAAqMAImLAUEACIv/iwELjACJi/+MAImKAQEiJxdlTElPAkQiJxhlTE4CREEACIv/iwALjACJiwFBAAiL/4sBCowAiYv/jACJigEBIkmL/4AApUSL/4AAqEEABYAAjACJi/8nGqZBAAUnCowAiYv/kyMIgQIKgQJMlUwWTBZMJxujoEmMAIv/SwGioCcRoowBiwGLAKRBABWL/4sBSU4CoksBoCcRoowBjABC/+OJigEBIkcDi/+AAKhBAAQijACJi/+AAQikQQAEI4wAiYv/k4ECCIEDCoECTJVMFkwWTCcbo6CMAYsBSaNJjAOAAKhAACcnEYsBSU4Co4v/iwOioCcaokmMAKhAAAuLAScKoYsAqEEAPYsAjAGLAScKoEmMAklLAaOji/+mQQAHiwKMAUL/5osBSUsBo6OL/6VBAAqLAScKoYwBQv/piwGI+EKMAImLAIwBQv+MigAAgABJMQBJIicEY0xJTwJEQQBIiwMWIicIZUSjJwmiiPgUSYwBiwIiJwVjRAlJjABBACiLAkknBYsBZrEiKmVESwGyFIsASU4CshKyESWyECKyAbMWUCcZTFCwiYoBAIgBNYv/IQQORCcSi/9niYoAAIgBIyInC2VMSU8CREEAHbEiKmVEIicOZUSyFIsAshKyESWyECKyAbMnCyJniYoBAYv/IicEY0QWIicIZUSjJwmiiPeBi/8iJwVjRAmJigEAIicHZUxJTwJEQQAwIicSZUSL/wshBAqL/0sBCYz/IicIZUSL/xYnCaOLABaioCcITGciJwtlRAgnC0xniYoCACInCGVEIov+IicEY0xJTwJEQQAWiwIWiwCjJwmiiPcVi/4iJwVjRAmMAYsCi/8Ii/4iJwRjRIv/CIv+JwRPAmYiJwdlRIv/CCcHTGcWiwCjJwmiiPbfi/4nBU8CZosBQQAjsSIqZUSL/rIUiwFJTgKyErIRJbIQIrIBsxaL/kxQJxlMULCL/xaL/kxQgATPq4cjTFCwiTEAIicOZUQSRImKAQCI//AnDov/Z4k=",clear:"CoEBQw=="},events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]},{name:"Deposit",args:[{type:"address",name:"to"},{type:"uint64",name:"lpAmount"}]},{name:"Withdraw",args:[{type:"address",name:"from"},{type:"uint64",name:"lpAmount"}]},{name:"SwappedToVUsd",args:[{type:"address",name:"sender"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"amount"},{type:"uint64",name:"vUsdAmount"},{type:"uint64",name:"fee"}]},{name:"SwappedFromVUsd",args:[{type:"address",name:"recipient"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"vUsdAmount"},{type:"uint64",name:"amount"},{type:"uint64",name:"fee"}]}],templateVariables:{}},Dn=class{constructor(i){this.value=i}asByteArray(){return this.value}asString(){return this.value!==void 0?Buffer.from(this.value).toString("utf-8"):void 0}},h=class r{static get create(){return{_resolveByMethod(i){switch(i.method){case"createApplication":case"createApplication(address,address,uint64,uint64,uint64,uint64)void":return r.create.createApplication(i)}throw new Error("Unknown ' + verb + ' method")},createApplication(i){return{...i,method:"createApplication(address,address,uint64,uint64,uint64,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.owner,i.args.router,i.args.a,i.args.assetId,i.args.feeShareBp,i.args.balanceRatioMinBp]}}}}static get optIn(){return{optInToApplication(i){return{...i,method:"optInToApplication()void",args:Array.isArray(i.args)?i.args:[]}}}}static optInAsset(i){return{...i,method:"optInAsset()void",args:Array.isArray(i.args)?i.args:[]}}static noop(i){return{...i,method:"noop()void",args:Array.isArray(i.args)?i.args:[]}}static deposit(i){return{...i,method:"deposit()void",args:Array.isArray(i.args)?i.args:[]}}static withdraw(i){return{...i,method:"withdraw(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.amountLp]}}static swapToVUsd(i){return{...i,method:"swapToVUsd(address,uint64,bool)uint64",args:Array.isArray(i.args)?i.args:[i.args.user,i.args.amount,i.args.zeroFee]}}static swapFromVUsd(i){return{...i,method:"swapFromVUsd(address,uint64,uint64,bool)uint64",args:Array.isArray(i.args)?i.args:[i.args.user,i.args.amount,i.args.receiveAmountMin,i.args.zeroFee]}}static setFeeShare(i){return{...i,method:"setFeeShare(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.feeShareBp]}}static adjustTotalLpAmount(i){return{...i,method:"adjustTotalLpAmount()void",args:Array.isArray(i.args)?i.args:[]}}static setBalanceRatioMinBp(i){return{...i,method:"setBalanceRatioMinBP(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.balanceRatioMinBp]}}static stopDeposit(i){return{...i,method:"stopDeposit()void",args:Array.isArray(i.args)?i.args:[]}}static startDeposit(i){return{...i,method:"startDeposit()void",args:Array.isArray(i.args)?i.args:[]}}static stopWithdraw(i){return{...i,method:"stopWithdraw()void",args:Array.isArray(i.args)?i.args:[]}}static startWithdraw(i){return{...i,method:"startWithdraw()void",args:Array.isArray(i.args)?i.args:[]}}static setStopAuthority(i){return{...i,method:"setStopAuthority(address)void",args:Array.isArray(i.args)?i.args:[i.args.stopAuthority]}}static setRouter(i){return{...i,method:"setRouter(address)void",args:Array.isArray(i.args)?i.args:[i.args.router]}}static claimRewards(i){return{...i,method:"claimRewards()void",args:Array.isArray(i.args)?i.args:[]}}static setAdminFeeShare(i){return{...i,method:"setAdminFeeShare(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.adminFeeShareBp]}}static claimAdminFee(i){return{...i,method:"claimAdminFee()void",args:Array.isArray(i.args)?i.args:[]}}static pendingReward(i){return{...i,method:"pendingReward(account)uint64",args:Array.isArray(i.args)?i.args:[i.args.user]}}static decimals(i){return{...i,method:"decimals()uint64",args:Array.isArray(i.args)?i.args:[]}}static transferOwnership(i){return{...i,method:"transferOwnership(address)void",args:Array.isArray(i.args)?i.args:[i.args.newOwner]}}};var En=class r{appClient;constructor(i){this.appClient=i instanceof Kn?i:new Kn({...i,appSpec:Un})}decodeReturnValue(i,a){return a!==void 0?ss(a,this.appClient.getABIMethod(i),Un.structs):void 0}static async fromCreatorAndName(i){return new r(await Kn.fromCreatorAndName({...i,appSpec:Un}))}static async fromNetwork(i){return new r(await Kn.fromNetwork({...i,appSpec:Un}))}get appId(){return this.appClient.appId}get appAddress(){return this.appClient.appAddress}get appName(){return this.appClient.appName}get appSpec(){return this.appClient.appSpec}get algorand(){return this.appClient.algorand}params={optIn:{optInToApplication:(i={args:[]})=>this.appClient.params.optIn(h.optIn.optInToApplication(i))},clearState:i=>this.appClient.params.bare.clearState(i),optInAsset:(i={args:[]})=>this.appClient.params.call(h.optInAsset(i)),noop:(i={args:[]})=>this.appClient.params.call(h.noop(i)),deposit:(i={args:[]})=>this.appClient.params.call(h.deposit(i)),withdraw:i=>this.appClient.params.call(h.withdraw(i)),swapToVUsd:i=>this.appClient.params.call(h.swapToVUsd(i)),swapFromVUsd:i=>this.appClient.params.call(h.swapFromVUsd(i)),setFeeShare:i=>this.appClient.params.call(h.setFeeShare(i)),adjustTotalLpAmount:(i={args:[]})=>this.appClient.params.call(h.adjustTotalLpAmount(i)),setBalanceRatioMinBp:i=>this.appClient.params.call(h.setBalanceRatioMinBp(i)),stopDeposit:(i={args:[]})=>this.appClient.params.call(h.stopDeposit(i)),startDeposit:(i={args:[]})=>this.appClient.params.call(h.startDeposit(i)),stopWithdraw:(i={args:[]})=>this.appClient.params.call(h.stopWithdraw(i)),startWithdraw:(i={args:[]})=>this.appClient.params.call(h.startWithdraw(i)),setStopAuthority:i=>this.appClient.params.call(h.setStopAuthority(i)),setRouter:i=>this.appClient.params.call(h.setRouter(i)),claimRewards:(i={args:[]})=>this.appClient.params.call(h.claimRewards(i)),setAdminFeeShare:i=>this.appClient.params.call(h.setAdminFeeShare(i)),claimAdminFee:(i={args:[]})=>this.appClient.params.call(h.claimAdminFee(i)),pendingReward:i=>this.appClient.params.call(h.pendingReward(i)),decimals:(i={args:[]})=>this.appClient.params.call(h.decimals(i)),transferOwnership:i=>this.appClient.params.call(h.transferOwnership(i))};createTransaction={optIn:{optInToApplication:(i={args:[]})=>this.appClient.createTransaction.optIn(h.optIn.optInToApplication(i))},clearState:i=>this.appClient.createTransaction.bare.clearState(i),optInAsset:(i={args:[]})=>this.appClient.createTransaction.call(h.optInAsset(i)),noop:(i={args:[]})=>this.appClient.createTransaction.call(h.noop(i)),deposit:(i={args:[]})=>this.appClient.createTransaction.call(h.deposit(i)),withdraw:i=>this.appClient.createTransaction.call(h.withdraw(i)),swapToVUsd:i=>this.appClient.createTransaction.call(h.swapToVUsd(i)),swapFromVUsd:i=>this.appClient.createTransaction.call(h.swapFromVUsd(i)),setFeeShare:i=>this.appClient.createTransaction.call(h.setFeeShare(i)),adjustTotalLpAmount:(i={args:[]})=>this.appClient.createTransaction.call(h.adjustTotalLpAmount(i)),setBalanceRatioMinBp:i=>this.appClient.createTransaction.call(h.setBalanceRatioMinBp(i)),stopDeposit:(i={args:[]})=>this.appClient.createTransaction.call(h.stopDeposit(i)),startDeposit:(i={args:[]})=>this.appClient.createTransaction.call(h.startDeposit(i)),stopWithdraw:(i={args:[]})=>this.appClient.createTransaction.call(h.stopWithdraw(i)),startWithdraw:(i={args:[]})=>this.appClient.createTransaction.call(h.startWithdraw(i)),setStopAuthority:i=>this.appClient.createTransaction.call(h.setStopAuthority(i)),setRouter:i=>this.appClient.createTransaction.call(h.setRouter(i)),claimRewards:(i={args:[]})=>this.appClient.createTransaction.call(h.claimRewards(i)),setAdminFeeShare:i=>this.appClient.createTransaction.call(h.setAdminFeeShare(i)),claimAdminFee:(i={args:[]})=>this.appClient.createTransaction.call(h.claimAdminFee(i)),pendingReward:i=>this.appClient.createTransaction.call(h.pendingReward(i)),decimals:(i={args:[]})=>this.appClient.createTransaction.call(h.decimals(i)),transferOwnership:i=>this.appClient.createTransaction.call(h.transferOwnership(i))};send={optIn:{optInToApplication:async(i={args:[]})=>{let a=await this.appClient.send.optIn(h.optIn.optInToApplication(i));return{...a,return:a.return}}},clearState:i=>this.appClient.send.bare.clearState(i),optInAsset:async(i={args:[]})=>{let a=await this.appClient.send.call(h.optInAsset(i));return{...a,return:a.return}},noop:async(i={args:[]})=>{let a=await this.appClient.send.call(h.noop(i));return{...a,return:a.return}},deposit:async(i={args:[]})=>{let a=await this.appClient.send.call(h.deposit(i));return{...a,return:a.return}},withdraw:async i=>{let a=await this.appClient.send.call(h.withdraw(i));return{...a,return:a.return}},swapToVUsd:async i=>{let a=await this.appClient.send.call(h.swapToVUsd(i));return{...a,return:a.return}},swapFromVUsd:async i=>{let a=await this.appClient.send.call(h.swapFromVUsd(i));return{...a,return:a.return}},setFeeShare:async i=>{let a=await this.appClient.send.call(h.setFeeShare(i));return{...a,return:a.return}},adjustTotalLpAmount:async(i={args:[]})=>{let a=await this.appClient.send.call(h.adjustTotalLpAmount(i));return{...a,return:a.return}},setBalanceRatioMinBp:async i=>{let a=await this.appClient.send.call(h.setBalanceRatioMinBp(i));return{...a,return:a.return}},stopDeposit:async(i={args:[]})=>{let a=await this.appClient.send.call(h.stopDeposit(i));return{...a,return:a.return}},startDeposit:async(i={args:[]})=>{let a=await this.appClient.send.call(h.startDeposit(i));return{...a,return:a.return}},stopWithdraw:async(i={args:[]})=>{let a=await this.appClient.send.call(h.stopWithdraw(i));return{...a,return:a.return}},startWithdraw:async(i={args:[]})=>{let a=await this.appClient.send.call(h.startWithdraw(i));return{...a,return:a.return}},setStopAuthority:async i=>{let a=await this.appClient.send.call(h.setStopAuthority(i));return{...a,return:a.return}},setRouter:async i=>{let a=await this.appClient.send.call(h.setRouter(i));return{...a,return:a.return}},claimRewards:async(i={args:[]})=>{let a=await this.appClient.send.call(h.claimRewards(i));return{...a,return:a.return}},setAdminFeeShare:async i=>{let a=await this.appClient.send.call(h.setAdminFeeShare(i));return{...a,return:a.return}},claimAdminFee:async(i={args:[]})=>{let a=await this.appClient.send.call(h.claimAdminFee(i));return{...a,return:a.return}},pendingReward:async i=>{let a=await this.appClient.send.call(h.pendingReward(i));return{...a,return:a.return}},decimals:async(i={args:[]})=>{let a=await this.appClient.send.call(h.decimals(i));return{...a,return:a.return}},transferOwnership:async i=>{let a=await this.appClient.send.call(h.transferOwnership(i));return{...a,return:a.return}}};clone(i){return new r(this.appClient.clone(i))}async pendingReward(i){return(await this.appClient.send.call(h.pendingReward(i))).return}async decimals(i={args:[]}){return(await this.appClient.send.call(h.decimals(i))).return}state={global:{getAll:async()=>{let i=await this.appClient.state.global.getAll();return{feeShareBp:i.feeShareBP,router:i.router,tokenBalance:i.tokenBalance,vUsdBalance:i.vUsdBalance,balanceRatioMinBp:i.balanceRatioMinBP,reserves:i.reserves,a:i.a,d:i.d,tokenAmountReduce:i.tokenAmountReduce,tokenAmountIncrease:i.tokenAmountIncrease,stopAuthority:i.stopAuthority,canDeposit:i.canDeposit,canWithdraw:i.canWithdraw,asset:i.asset,adminFeeShareBp:i.adminFeeShareBP,totalSupply:i.totalSupply,accRewardPerShareP:new Dn(i.accRewardPerShareP),adminFeeAmount:i.adminFeeAmount,owner:i.owner}},feeShareBp:async()=>await this.appClient.state.global.getValue("feeShareBP"),router:async()=>await this.appClient.state.global.getValue("router"),tokenBalance:async()=>await this.appClient.state.global.getValue("tokenBalance"),vUsdBalance:async()=>await this.appClient.state.global.getValue("vUsdBalance"),balanceRatioMinBp:async()=>await this.appClient.state.global.getValue("balanceRatioMinBP"),reserves:async()=>await this.appClient.state.global.getValue("reserves"),a:async()=>await this.appClient.state.global.getValue("a"),d:async()=>await this.appClient.state.global.getValue("d"),tokenAmountReduce:async()=>await this.appClient.state.global.getValue("tokenAmountReduce"),tokenAmountIncrease:async()=>await this.appClient.state.global.getValue("tokenAmountIncrease"),stopAuthority:async()=>await this.appClient.state.global.getValue("stopAuthority"),canDeposit:async()=>await this.appClient.state.global.getValue("canDeposit"),canWithdraw:async()=>await this.appClient.state.global.getValue("canWithdraw"),asset:async()=>await this.appClient.state.global.getValue("asset"),adminFeeShareBp:async()=>await this.appClient.state.global.getValue("adminFeeShareBP"),totalSupply:async()=>await this.appClient.state.global.getValue("totalSupply"),accRewardPerShareP:async()=>new Dn(await this.appClient.state.global.getValue("accRewardPerShareP")),adminFeeAmount:async()=>await this.appClient.state.global.getValue("adminFeeAmount"),owner:async()=>await this.appClient.state.global.getValue("owner")},local:i=>{let a=typeof i=="string"?i:ds(i.publicKey);return{getAll:async()=>{let o=await this.appClient.state.local(a).getAll();return{balance:o.balance,userRewardDebt:o.userRewardDebt}},balance:async()=>await this.appClient.state.local(a).getValue("balance"),userRewardDebt:async()=>await this.appClient.state.local(a).getValue("userRewardDebt")}}};newGroup(){let i=this,a=this.algorand.newGroup(),o=Promise.resolve(),s=[];return{optInAsset(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.optInAsset(d))),s.push(void 0),this},noop(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.noop(d))),s.push(void 0),this},deposit(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.deposit(d))),s.push(void 0),this},withdraw(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.withdraw(d))),s.push(void 0),this},swapToVUsd(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swapToVUsd(d))),s.push(A=>i.decodeReturnValue("swapToVUsd(address,uint64,bool)uint64",A)),this},swapFromVUsd(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swapFromVUsd(d))),s.push(A=>i.decodeReturnValue("swapFromVUsd(address,uint64,uint64,bool)uint64",A)),this},setFeeShare(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setFeeShare(d))),s.push(void 0),this},adjustTotalLpAmount(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.adjustTotalLpAmount(d))),s.push(void 0),this},setBalanceRatioMinBp(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setBalanceRatioMinBp(d))),s.push(void 0),this},stopDeposit(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.stopDeposit(d))),s.push(void 0),this},startDeposit(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.startDeposit(d))),s.push(void 0),this},stopWithdraw(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.stopWithdraw(d))),s.push(void 0),this},startWithdraw(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.startWithdraw(d))),s.push(void 0),this},setStopAuthority(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setStopAuthority(d))),s.push(void 0),this},setRouter(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setRouter(d))),s.push(void 0),this},claimRewards(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.claimRewards(d))),s.push(void 0),this},setAdminFeeShare(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setAdminFeeShare(d))),s.push(void 0),this},claimAdminFee(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.claimAdminFee(d))),s.push(void 0),this},pendingReward(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.pendingReward(d))),s.push(A=>i.decodeReturnValue("pendingReward(account)uint64",A)),this},decimals(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.decimals(d))),s.push(A=>i.decodeReturnValue("decimals()uint64",A)),this},transferOwnership(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.transferOwnership(d))),s.push(void 0),this},get optIn(){return{optInToApplication:d=>(o=o.then(async()=>a.addAppCallMethodCall(await i.params.optIn.optInToApplication(d))),s.push(void 0),this)}},clearState(d){return o=o.then(()=>a.addAppCall(i.params.clearState(d))),this},addTransaction(d,A){return o=o.then(()=>a.addTransaction(d,A)),this},async composer(){return await o,a},async simulate(d){await o;let A=await(d?a.simulate(d):a.simulate());return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}},async send(d){await o;let A=await a.send(d);return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}}}}};var q=class{lpAmount;rewardDebt;constructor(i){this.lpAmount=i.lpAmount,this.rewardDebt=i.rewardDebt}get userLiquidity(){return F(this.lpAmount,3).toFixed()}earned(i,a){let o=va(this.lpAmount,this.rewardDebt,i.accRewardPerShareP,i.p);return a?F(o,a).toFixed():o}};var ce=class{};var tn=class extends ce{constructor(a,o){super();this.algorand=a;this.api=o}chainType="ALG";P=48;async buildRawTransactionClaimRewards(a){let o=a.accountAddress,s=BigInt(a.token.tokenAddress),d=BigInt(a.token.poolAddress),A=this.getPool(d),g=this.algorand.newGroup();g.addAppCallMethodCall(await A.params.claimRewards({args:[],sender:o,extraFee:dt(1),assetReferences:[s]}));let{transactions:c}=await g.buildTransactions();return c=ra(c),_e(...c)}async buildRawTransactionDeposit(a){let o=a.accountAddress,s=BigInt(a.amount),d=BigInt(a.token.tokenAddress),A=BigInt(a.token.poolAddress),g=this.getPool(A),c=await Fn(A,o,this.algorand),l=this.algorand.newGroup();c||l.addAppCallMethodCall(await g.params.optIn.optInToApplication({args:[],sender:o})),l.addAssetTransfer({assetId:d,amount:s,sender:o,receiver:g.appAddress}),l.addAppCallMethodCall(await g.params.deposit({args:[],sender:o,extraFee:dt(1)})),yt({composer:l,appId:A,sender:o,count:4});let{transactions:u}=await l.buildTransactions();return u=ra(u),_e(...u)}async buildRawTransactionWithdraw(a){let o=a.accountAddress,s=BigInt(a.amount),d=BigInt(a.token.tokenAddress),A=BigInt(a.token.poolAddress),g=this.getPool(A),c=this.algorand.newGroup();c.addAppCallMethodCall(await g.params.withdraw({args:{amountLp:s},sender:o,extraFee:dt(2),assetReferences:[d]})),yt({composer:c,appId:A,sender:o,count:4});let{transactions:l}=await c.buildTransactions();return l=ra(l),_e(...l)}async getPoolInfoFromChain(a){let s=await this.getPool(BigInt(a.poolAddress)).state.global.getAll(),d=s.a?.toString(),A=s.d?.toString(),g=s.tokenBalance?.toString(),c=s.vUsdBalance?.toString(),l=s.totalSupply?.toString(),u=As(s.accRewardPerShareP?.asByteArray()??Uint8Array.from([])).toString();if(d&&A&&g&&c&&l&&u){let m=te({tokenBalance:g,vUsdBalance:c});return{aValue:d,dValue:A,tokenBalance:g,vUsdBalance:c,totalLpAmount:l,accRewardPerShareP:u,p:this.P,imbalance:m}}throw new I("Unable to pool info from chain")}async getUserBalanceInfo(a,o){let s=BigInt(o.poolAddress),d=this.getPool(s);try{let{balance:A,userRewardDebt:g}=await d.state.local(a).getAll();if(A!==void 0&&g!==void 0)return new q({lpAmount:A.toString(),rewardDebt:g.toString()})}catch{let c=(await this.algorand.account.getInformation(a)).appsLocalState;if(c&&!c.find(({id:u})=>u===s))return new q({lpAmount:"0",rewardDebt:"0"})}throw new I("Unable to get user balance")}getPool(a){return this.algorand.client.getTypedAppClientById(En,{appId:a})}};import{Web3 as ot}from"web3";var gs={abi:[{inputs:[{internalType:"address",name:"_router",type:"address"},{internalType:"uint256",name:"_a",type:"uint256"},{internalType:"contract ERC20",name:"_token",type:"address"},{internalType:"uint16",name:"_feeShareBP",type:"uint16"},{internalType:"uint256",name:"_balanceRatioMinBP",type:"uint256"},{internalType:"string",name:"lpName",type:"string"},{internalType:"string",name:"lpSymbol",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Deposit",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"RewardsClaimed",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"vUsdAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"fee",type:"uint256"}],name:"SwappedFromVUsd",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"vUsdAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"fee",type:"uint256"}],name:"SwappedToVUsd",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"a",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"accRewardPerShareP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"adjustTotalLpAmount",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"adminFeeAmount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"balanceRatioMinBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"canDeposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"canWithdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"claimAdminFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"claimRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"d",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"deposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"feeShareBP",outputs:[{internalType:"uint16",name:"",type:"uint16"}],stateMutability:"view",type:"function"},{inputs:[],name:"getPrice",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"x",type:"uint256"}],name:"getY",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"pendingReward",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"reserves",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"router",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_adminFeeShareBP",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_balanceRatioMinBP",type:"uint256"}],name:"setBalanceRatioMinBP",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint16",name:"_feeShareBP",type:"uint16"}],name:"setFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_router",type:"address"}],name:"setRouter",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_stopAuthority",type:"address"}],name:"setStopAuthority",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startDeposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopDeposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"},{internalType:"bool",name:"zeroFee",type:"bool"}],name:"swapFromVUsd",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bool",name:"zeroFee",type:"bool"}],name:"swapToVUsd",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"token",outputs:[{internalType:"contract ERC20",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"tokenBalance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"userRewardDebt",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"vUsdBalance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amountLp",type:"uint256"}],name:"withdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},nn=gs;var an=class extends ce{constructor(a,o){super();this.web3=a;this.api=o}chainType="EVM";P=52;async getUserBalanceInfo(a,o){let s;try{s=await Rn(this.getUserBalanceInfoByBatch(a,o),`Cannot get UserBalanceInfo for ${o.name} on ${o.chainSymbol}`,5e3)}catch{s=await wi(()=>this.getUserBalanceInfoPerProperty(a,o),`Cannot get UserBalanceInfo for ${o.name} on ${o.chainSymbol}`,5,2e3)}return s}async getPoolInfoFromChain(a){let o;try{o=await Rn(this.getPoolInfoByBatch(a),`Cannot get PoolInfo for ${a.name} on ${a.chainSymbol}`,5e3)}catch{o=await wi(()=>this.getPoolInfoPerProperty(a),`Cannot get PoolInfo for ${a.name} on ${a.chainSymbol}`,5,2e3)}return o}async getUserBalanceInfoByBatch(a,o){let s=new this.web3.eth.BatchRequest,d=this.getPoolContract(o.poolAddress),A=d.methods.userRewardDebt(a).encodeABI(),g=d.methods.balanceOf(a).encodeABI();s.add({method:"eth_call",params:[{to:o.poolAddress,data:A},"latest"]}),s.add({method:"eth_call",params:[{to:o.poolAddress,data:g},"latest"]});let[c,l]=await s.execute();if(c&&l&&!c.error&&!l.error)return new q({lpAmount:ot.utils.toBigInt(l.result).toString(),rewardDebt:ot.utils.toBigInt(c.result).toString()});throw new Error("Batched failed")}async getUserBalanceInfoPerProperty(a,o){let s=(await this.getPoolContract(o.poolAddress).methods.userRewardDebt(a).call()).toString(),d=(await this.getPoolContract(o.poolAddress).methods.balanceOf(a).call()).toString();return new q({lpAmount:d,rewardDebt:s})}async getPoolInfoByBatch(a){let o=new this.web3.eth.BatchRequest,s=this.getPoolContract(a.poolAddress),d=s.methods.a().encodeABI(),A=s.methods.d().encodeABI(),g=s.methods.tokenBalance().encodeABI(),c=s.methods.vUsdBalance().encodeABI(),l=s.methods.totalSupply().encodeABI(),u=s.methods.accRewardPerShareP().encodeABI();o.add({method:"eth_call",params:[{to:a.poolAddress,data:d},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:A},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:g},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:c},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:l},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:u},"latest"]});let[m,p,b,W,y,Z]=await o.execute();if(m&&p&&b&&W&&y&&Z&&!m.error&&!p.error&&!b.error&&!W.error&&!y.error&&!Z.error){let v=ot.utils.toBigInt(b.result).toString(),Y=ot.utils.toBigInt(W.result).toString(),B=te({tokenBalance:v,vUsdBalance:Y});return{aValue:ot.utils.toBigInt(m.result).toString(),dValue:ot.utils.toBigInt(p.result).toString(),tokenBalance:v,vUsdBalance:Y,totalLpAmount:ot.utils.toBigInt(y.result).toString(),accRewardPerShareP:ot.utils.toBigInt(Z.result).toString(),p:this.P,imbalance:B}}throw new Error("Batched failed")}async getPoolInfoPerProperty(a){let o=this.getPoolContract(a.poolAddress),s=(await o.methods.a().call()).toString(),d=(await o.methods.d().call()).toString(),A=(await o.methods.tokenBalance().call()).toString(),g=(await o.methods.vUsdBalance().call()).toString(),c=(await o.methods.totalSupply().call()).toString(),l=(await o.methods.accRewardPerShareP().call()).toString(),u=te({tokenBalance:A,vUsdBalance:g});return{aValue:s,dValue:d,tokenBalance:A,vUsdBalance:g,totalLpAmount:c,accRewardPerShareP:l,p:this.P,imbalance:u}}async buildRawTransactionDeposit(a){return Promise.resolve({...this.buildTxParams(a),data:this.getPoolContract(a.token.poolAddress).methods.deposit(a.amount).encodeABI()})}async buildRawTransactionWithdraw(a){return Promise.resolve({...this.buildTxParams(a),data:this.getPoolContract(a.token.poolAddress).methods.withdraw(a.amount).encodeABI()})}async buildRawTransactionClaimRewards(a){return Promise.resolve({...this.buildTxParams(a),data:this.getPoolContract(a.token.poolAddress).methods.claimRewards().encodeABI()})}buildTxParams(a){return{from:a.accountAddress,to:a.token.poolAddress,value:"0"}}getPoolContract(a){return new this.web3.eth.Contract(nn.abi,a)}};var _n=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s}async approve(i,a){if(a){let o=i,s=a;return this.tokenService.buildRawTransactionApprove({...s,spender:s.token.poolAddress},o)}else{let o=i;return this.tokenService.buildRawTransactionApprove({...o,spender:o.token.poolAddress})}}async deposit(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),i.amount=f(i.amount,i.token.decimals).toFixed(),Ft(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionDeposit(i)}async withdraw(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),i.amount=f(i.amount,3).toFixed(),Ft(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionWithdraw(i)}async claimRewards(i,a){return Ft(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionClaimRewards(i)}};import{AnchorProvider as cs,BN as Wo,Program as ls,Spl as us,web3 as ms}from"@project-serum/anchor";import{Connection as ps,PublicKey as rt}from"@solana/web3.js";var $n=class extends ce{constructor(a,o){super();this.solanaRpcUrl=a;this.api=o}chainType="SOLANA";P=48;async getUserBalanceInfo(a,o){let s=this.buildAnchorProvider(a),d=this.getBridge(o.bridgeAddress,s),A=new rt(o.poolAddress),g=await d.account.pool.fetch(A);try{let c=await ji(new rt(a),g.mint,d.programId),{lpAmount:l,rewardDebt:u}=await d.account.userDeposit.fetch(c);return new q({lpAmount:l.toString(),rewardDebt:u.toString()})}catch{return new q({lpAmount:"0",rewardDebt:"0"})}}async getPoolInfoFromChain(a){let o=this.buildAnchorProvider(a.bridgeAddress),s=await this.getBridge(a.bridgeAddress,o).account.pool.fetch(a.poolAddress),d=s.vUsdBalance.toString(),A=s.tokenBalance.toString(),g=te({tokenBalance:A,vUsdBalance:d});return{dValue:s.d.toString(),aValue:s.a.toString(),totalLpAmount:s.totalLpAmount.toString(),vUsdBalance:d,tokenBalance:A,accRewardPerShareP:s.accRewardPerShareP.toString(),p:this.P,imbalance:g}}async buildRawTransactionDeposit(a){let{bridge:o,accounts:s,preInstructions:d}=await this.prepareDataForTransaction(a),A=await o.methods.deposit(new Wo(a.amount)).accounts(s).preInstructions(d).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(a.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new rt(a.accountAddress),await Wt(A,a.txFeeParams,this.solanaRpcUrl),A}async buildRawTransactionWithdraw(a){let{bridge:o,accounts:s,preInstructions:d}=await this.prepareDataForTransaction(a),A=await o.methods.withdraw(new Wo(a.amount)).accounts(s).preInstructions(d).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(a.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new rt(a.accountAddress),await Wt(A,a.txFeeParams,this.solanaRpcUrl),A}async buildRawTransactionClaimRewards(a){let{bridge:o,accounts:s,preInstructions:d}=await this.prepareDataForTransaction(a),A=await o.methods.claimRewards().accounts(s).preInstructions(d).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(a.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new rt(a.accountAddress),await Wt(A,a.txFeeParams,this.solanaRpcUrl),A}async prepareDataForTransaction(a){let o=this.buildAnchorProvider(a.accountAddress),s=this.getBridge(a.token.bridgeAddress,o),{accounts:d,preInstructions:A}=await this._getLPTransactionData(s,a.token.poolAddress,a.accountAddress,o);return{bridge:s,accounts:d,preInstructions:A}}getBridge(a,o){return new ls(_t,a,o)}buildAnchorProvider(a){let o=new ps(this.solanaRpcUrl,"confirmed"),s=new rt(a);return new cs(o,{publicKey:s},{preflightCommitment:"confirmed",commitment:"confirmed"})}async _getLPTransactionData(a,o,s,d){let A=new rt(s),g=await qe(a.programId),c=await vt(a.programId),l=new rt(o),m=(await a.account.pool.fetch(l)).mint,p=await we(A,m),b=await Yt(m,a.programId),W=await ji(A,m,a.programId),y=[ms.ComputeBudgetProgram.setComputeUnitLimit({units:1e6})];try{await Rt(p,d)}catch{let B=await us.associatedToken(d).methods.create().accounts({mint:m,owner:A,associatedAccount:p}).instruction();y.push(B)}try{await a.account.userDeposit.fetch(W)}catch{let Y=await a.methods.initDepositAccount().accounts({mint:m,user:A,userDeposit:W}).instruction();y.push(Y)}return{accounts:{mint:m,user:A,config:g,pool:l,bridgeAuthority:c,userDeposit:W,userToken:p,bridgeToken:b},preInstructions:y}}};import{contract as ZW}from"@stellar/stellar-sdk";import{contract as t}from"@stellar/stellar-sdk";var Cs=t.Spec,Is=t.Client;var qn=class extends Is{constructor(a){super(new Cs(["AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABwAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAZicmlkZ2UAAAAAABMAAAAAAAAAAWEAAAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAADGZlZV9zaGFyZV9icAAAAAoAAAAAAAAAFGJhbGFuY2VfcmF0aW9fbWluX2JwAAAACgAAAAAAAAASYWRtaW5fZmVlX3NoYXJlX2JwAAAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAHZGVwb3NpdAAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAId2l0aGRyYXcAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAACWFtb3VudF9scAAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc3dhcF90b192X3VzZAAAAAAAAAMAAAAAAAAABHVzZXIAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAAPc3dhcF9mcm9tX3ZfdXNkAAAAAAQAAAAAAAAABHVzZXIAAAATAAAAAAAAAAt2dXNkX2Ftb3VudAAAAAAKAAAAAAAAABJyZWNlaXZlX2Ftb3VudF9taW4AAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAANY2xhaW1fcmV3YXJkcwAAAAAAAAEAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAdgYWRtaW5gAAAAAA1zZXRfZmVlX3NoYXJlAAAAAAAAAQAAAAAAAAAMZmVlX3NoYXJlX2JwAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAWYWRqdXN0X3RvdGFsX2xwX2Ftb3VudAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAYc2V0X2JhbGFuY2VfcmF0aW9fbWluX2JwAAAAAQAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAMc3RvcF9kZXBvc2l0AAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAANc3RhcnRfZGVwb3NpdAAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc3RvcF93aXRoZHJhdwAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAOc3RhcnRfd2l0aGRyYXcAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAKc2V0X2JyaWRnZQAAAAAAAQAAAAAAAAAGYnJpZGdlAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAATc2V0X2FkbWluX2ZlZV9zaGFyZQAAAAABAAAAAAAAABJhZG1pbl9mZWVfc2hhcmVfYnAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAPY2xhaW1fYWRtaW5fZmVlAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAZgdmlld2AAAAAAAA5wZW5kaW5nX3Jld2FyZAAAAAAAAQAAAAAAAAAEdXNlcgAAABMAAAABAAAD6QAAAAoAAAAD","AAAAAAAAAAAAAAAIZ2V0X3Bvb2wAAAAAAAAAAQAAA+kAAAfQAAAABFBvb2wAAAAD","AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==","AAAAAAAAAAAAAAAKZ2V0X2JyaWRnZQAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAQZ2V0X3VzZXJfZGVwb3NpdAAAAAEAAAAAAAAABHVzZXIAAAATAAAAAQAAA+kAAAfQAAAAC1VzZXJEZXBvc2l0AAAAAAM=","AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAQAAAAAAAAAAAAAAD1N3YXBwZWRGcm9tVlVzZAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAAC3Z1c2RfYW1vdW50AAAAAAo=","AAAAAQAAAAAAAAAAAAAADVN3YXBwZWRUb1ZVc2QAAAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAALdnVzZF9hbW91bnQAAAAACg==","AAAAAQAAAAAAAAAAAAAAB0RlcG9zaXQAAAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==","AAAAAQAAAAAAAAAAAAAACFdpdGhkcmF3AAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==","AAAAAQAAAAAAAAAAAAAADlJld2FyZHNDbGFpbWVkAAAAAAACAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAABHVzZXIAAAAT","AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAEAAAAT","AAAAAQAAAAAAAAAAAAAABFBvb2wAAAAPAAAAAAAAAAFhAAAAAAAACgAAAAAAAAAWYWNjX3Jld2FyZF9wZXJfc2hhcmVfcAAAAAAACgAAAAAAAAAQYWRtaW5fZmVlX2Ftb3VudAAAAAoAAAAAAAAAEmFkbWluX2ZlZV9zaGFyZV9icAAAAAAACgAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAAAAAAtjYW5fZGVwb3NpdAAAAAABAAAAAAAAAAxjYW5fd2l0aGRyYXcAAAABAAAAAAAAAAFkAAAAAAAACgAAAAAAAAAIZGVjaW1hbHMAAAAEAAAAAAAAAAxmZWVfc2hhcmVfYnAAAAAKAAAAAAAAAAhyZXNlcnZlcwAAAAoAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAANdG9rZW5fYmFsYW5jZQAAAAAAAAoAAAAAAAAAD3RvdGFsX2xwX2Ftb3VudAAAAAAKAAAAAAAAAA12X3VzZF9iYWxhbmNlAAAAAAAACg==","AAAAAQAAAAAAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAIAAAAAAAAACWxwX2Ftb3VudAAAAAAAAAoAAAAAAAAAC3Jld2FyZF9kZWJ0AAAAAAo=","AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==","AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT","AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ"]),a);this.options=a}fromJSON={initialize:this.txFromJSON,deposit:this.txFromJSON,withdraw:this.txFromJSON,swap_to_v_usd:this.txFromJSON,swap_from_v_usd:this.txFromJSON,claim_rewards:this.txFromJSON,set_fee_share:this.txFromJSON,adjust_total_lp_amount:this.txFromJSON,set_balance_ratio_min_bp:this.txFromJSON,stop_deposit:this.txFromJSON,start_deposit:this.txFromJSON,stop_withdraw:this.txFromJSON,start_withdraw:this.txFromJSON,set_stop_authority:this.txFromJSON,set_bridge:this.txFromJSON,set_admin:this.txFromJSON,set_admin_fee_share:this.txFromJSON,claim_admin_fee:this.txFromJSON,pending_reward:this.txFromJSON,get_pool:this.txFromJSON,get_admin:this.txFromJSON,get_stop_authority:this.txFromJSON,get_bridge:this.txFromJSON,get_user_deposit:this.txFromJSON,upgrade:this.txFromJSON}};import{contract as pC,rpc as bs}from"@stellar/stellar-sdk";var Bo=bs.Api;function ft(r){let{simulation:i,options:a}=r;if(!i)throw new Error("Soroban assembled transaction does not have simulation");if(Bo.isSimulationSuccess(i))return i.result==null?void 0:a.parseResultXdr(i.result.retval);throw new Error(i.error)}function Nt(r){let{simulation:i}=r;if(!i)throw new Error("Soroban assembled transaction does not have simulation");return Bo.isSimulationError(i)}var ei=class extends ce{constructor(a,o,s){super();this.nodeRpcUrlsConfig=a;this.params=o;this.api=s}chainType="SRB";P=48;async getUserBalanceInfo(a,o){let d=await this.getContract(o.poolAddress).get_user_deposit({user:a});if(Nt(d))throw new I;let A=ft(d);if(!A)throw new I;let g=A.unwrap();return new q({lpAmount:g.lp_amount.toString(),rewardDebt:g.reward_debt.toString()})}async getPoolInfoFromChain(a){let s=await this.getContract(a.poolAddress).get_pool();if(Nt(s))throw new I;let d=ft(s);if(!d)throw new I;let A=d.unwrap();return{aValue:A.a.toString(),accRewardPerShareP:A.acc_reward_per_share_p.toString(),dValue:A.d.toString(),tokenBalance:A.token_balance.toString(),p:this.P,totalLpAmount:A.total_lp_amount.toString(),vUsdBalance:A.v_usd_balance.toString(),imbalance:te({tokenBalance:A.token_balance.toString(),vUsdBalance:A.v_usd_balance.toString()})}}async buildRawTransactionDeposit(a){return(await this.getContract(a.token.poolAddress,a.accountAddress).deposit({sender:a.accountAddress,amount:BigInt(a.amount)})).toXDR()}async buildRawTransactionWithdraw(a){return(await this.getContract(a.token.poolAddress,a.accountAddress).withdraw({sender:a.accountAddress,amount_lp:BigInt(a.amount)})).toXDR()}async buildRawTransactionClaimRewards(a){return(await this.getContract(a.token.poolAddress,a.accountAddress).claim_rewards({sender:a.accountAddress})).toXDR()}getContract(a,o){let s={publicKey:o,contractId:a,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new qn(s)}};import{SuiClient as Bs}from"@mysten/sui/client";import{Transaction as Ai}from"@mysten/sui/transactions";var wt=Ne(nt());ne();ne();import{bcs as Zo}from"@mysten/sui/bcs";import{fromB64 as ys}from"@mysten/sui/utils";function ti(r){return r=G(r),r.startsWith(`${at}::balance::Balance<`)}var re=class r{__StructClass=!0;static get $typeName(){return`${at}::balance::Balance`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;value;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.value=a.value}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([T(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return Zo.struct("Balance",{value:Zo.u64()})}static fromFields(i,a){return r.reified(i).new({value:L("u64",a.value)})}static fromFieldsWithTypes(i,a){if(!ti(a.type))throw new Error("not a Balance type");return ze(a,[i]),r.reified(i).new({value:S("u64",a.fields.value)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{value:this.value.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({value:M("u64",a.value)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Ve(j(r.$typeName,T(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!ti(a.type))throw new Error(`object at ${a.fields.id} is not a Balance object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!ti(a.bcs.type))throw new Error("object at is not a Balance object");let o=oe(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=G(o[0]),d=G(T(i));if(s!==G(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,ys(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching Balance object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!ti(s.data.bcs.type))throw new Error(`object at id ${o} is not a Balance object`);return r.fromSuiObjectData(a,s.data)}};var Aa=Ne(nt());ne();var sa=Ne(nt());import{bcs as ni}from"@mysten/sui/bcs";import{fromB64 as hs}from"@mysten/sui/utils";function ii(r){return r=G(r),r.startsWith(`${sa.PKG_V1}::pool_rewards::PoolRewards<`)}var mt=class r{__StructClass=!0;static get $typeName(){return`${sa.PKG_V1}::pool_rewards::PoolRewards`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;accRewardPerShareP;adminFeeShareBp;adminFee;rewards;lpSupply;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.accRewardPerShareP=a.accRewardPerShareP,this.adminFeeShareBp=a.adminFeeShareBp,this.adminFee=a.adminFee,this.rewards=a.rewards,this.lpSupply=a.lpSupply}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([T(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return ni.struct("PoolRewards",{acc_reward_per_share_p:ni.u128(),admin_fee_share_bp:ni.u64(),admin_fee:re.bcs,rewards:re.bcs,lp_supply:ni.u64()})}static fromFields(i,a){return r.reified(i).new({accRewardPerShareP:L("u128",a.acc_reward_per_share_p),adminFeeShareBp:L("u64",a.admin_fee_share_bp),adminFee:L(re.reified(i),a.admin_fee),rewards:L(re.reified(i),a.rewards),lpSupply:L("u64",a.lp_supply)})}static fromFieldsWithTypes(i,a){if(!ii(a.type))throw new Error("not a PoolRewards type");return ze(a,[i]),r.reified(i).new({accRewardPerShareP:S("u128",a.fields.acc_reward_per_share_p),adminFeeShareBp:S("u64",a.fields.admin_fee_share_bp),adminFee:S(re.reified(i),a.fields.admin_fee),rewards:S(re.reified(i),a.fields.rewards),lpSupply:S("u64",a.fields.lp_supply)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{accRewardPerShareP:this.accRewardPerShareP.toString(),adminFeeShareBp:this.adminFeeShareBp.toString(),adminFee:this.adminFee.toJSONField(),rewards:this.rewards.toJSONField(),lpSupply:this.lpSupply.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({accRewardPerShareP:M("u128",a.accRewardPerShareP),adminFeeShareBp:M("u64",a.adminFeeShareBp),adminFee:M(re.reified(i),a.adminFee),rewards:M(re.reified(i),a.rewards),lpSupply:M("u64",a.lpSupply)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Ve(j(r.$typeName,T(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!ii(a.type))throw new Error(`object at ${a.fields.id} is not a PoolRewards object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!ii(a.bcs.type))throw new Error("object at is not a PoolRewards object");let o=oe(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=G(o[0]),d=G(T(i));if(s!==G(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,hs(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching PoolRewards object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!ii(s.data.bcs.type))throw new Error(`object at id ${o} is not a PoolRewards object`);return r.fromSuiObjectData(a,s.data)}};ne();var da=Ne(nt());import{bcs as Tt}from"@mysten/sui/bcs";import{fromB64 as vs}from"@mysten/sui/utils";function ai(r){return r=G(r),r.startsWith(`${da.PKG_V1}::pool_state::PoolState<`)}var pt=class r{__StructClass=!0;static get $typeName(){return`${da.PKG_V1}::pool_state::PoolState`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;tokenBalance;vusdBalance;d;a;balanceRatioMinBp;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.tokenBalance=a.tokenBalance,this.vusdBalance=a.vusdBalance,this.d=a.d,this.a=a.a,this.balanceRatioMinBp=a.balanceRatioMinBp}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([T(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return Tt.struct("PoolState",{token_balance:Tt.u64(),vusd_balance:Tt.u64(),d:Tt.u64(),a:Tt.u64(),balance_ratio_min_bp:Tt.u64()})}static fromFields(i,a){return r.reified(i).new({tokenBalance:L("u64",a.token_balance),vusdBalance:L("u64",a.vusd_balance),d:L("u64",a.d),a:L("u64",a.a),balanceRatioMinBp:L("u64",a.balance_ratio_min_bp)})}static fromFieldsWithTypes(i,a){if(!ai(a.type))throw new Error("not a PoolState type");return ze(a,[i]),r.reified(i).new({tokenBalance:S("u64",a.fields.token_balance),vusdBalance:S("u64",a.fields.vusd_balance),d:S("u64",a.fields.d),a:S("u64",a.fields.a),balanceRatioMinBp:S("u64",a.fields.balance_ratio_min_bp)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{tokenBalance:this.tokenBalance.toString(),vusdBalance:this.vusdBalance.toString(),d:this.d.toString(),a:this.a.toString(),balanceRatioMinBp:this.balanceRatioMinBp.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({tokenBalance:M("u64",a.tokenBalance),vusdBalance:M("u64",a.vusdBalance),d:M("u64",a.d),a:M("u64",a.a),balanceRatioMinBp:M("u64",a.balanceRatioMinBp)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Ve(j(r.$typeName,T(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!ai(a.type))throw new Error(`object at ${a.fields.id} is not a PoolState object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!ai(a.bcs.type))throw new Error("object at is not a PoolState object");let o=oe(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=G(o[0]),d=G(T(i));if(s!==G(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,vs(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching PoolState object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!ai(s.data.bcs.type))throw new Error(`object at id ${o} is not a PoolState object`);return r.fromSuiObjectData(a,s.data)}};import{bcs as on}from"@mysten/sui/bcs";import{fromB64 as Ys}from"@mysten/sui/utils";function oi(r){return r=G(r),r.startsWith(`${Aa.PKG_V1}::pool::Pool<`)}var ri=class r{__StructClass=!0;static get $typeName(){return`${Aa.PKG_V1}::pool::Pool`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;id;state;rewards;feeShareBp;canDeposit;canWithdraw;decimals;balance;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.id=a.id,this.state=a.state,this.rewards=a.rewards,this.feeShareBp=a.feeShareBp,this.canDeposit=a.canDeposit,this.canWithdraw=a.canWithdraw,this.decimals=a.decimals,this.balance=a.balance}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([T(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return on.struct("Pool",{id:Ze.bcs,state:pt.bcs,rewards:mt.bcs,fee_share_bp:on.u64(),can_deposit:on.bool(),can_withdraw:on.bool(),decimals:on.u8(),balance:re.bcs})}static fromFields(i,a){return r.reified(i).new({id:L(Ze.reified(),a.id),state:L(pt.reified(i),a.state),rewards:L(mt.reified(i),a.rewards),feeShareBp:L("u64",a.fee_share_bp),canDeposit:L("bool",a.can_deposit),canWithdraw:L("bool",a.can_withdraw),decimals:L("u8",a.decimals),balance:L(re.reified(i),a.balance)})}static fromFieldsWithTypes(i,a){if(!oi(a.type))throw new Error("not a Pool type");return ze(a,[i]),r.reified(i).new({id:S(Ze.reified(),a.fields.id),state:S(pt.reified(i),a.fields.state),rewards:S(mt.reified(i),a.fields.rewards),feeShareBp:S("u64",a.fields.fee_share_bp),canDeposit:S("bool",a.fields.can_deposit),canWithdraw:S("bool",a.fields.can_withdraw),decimals:S("u8",a.fields.decimals),balance:S(re.reified(i),a.fields.balance)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{id:this.id,state:this.state.toJSONField(),rewards:this.rewards.toJSONField(),feeShareBp:this.feeShareBp.toString(),canDeposit:this.canDeposit,canWithdraw:this.canWithdraw,decimals:this.decimals,balance:this.balance.toJSONField()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({id:M(Ze.reified(),a.id),state:M(pt.reified(i),a.state),rewards:M(mt.reified(i),a.rewards),feeShareBp:M("u64",a.feeShareBp),canDeposit:M("bool",a.canDeposit),canWithdraw:M("bool",a.canWithdraw),decimals:M("u8",a.decimals),balance:M(re.reified(i),a.balance)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Ve(j(r.$typeName,T(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!oi(a.type))throw new Error(`object at ${a.fields.id} is not a Pool object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!oi(a.bcs.type))throw new Error("object at is not a Pool object");let o=oe(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=G(o[0]),d=G(T(i));if(s!==G(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,Ys(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching Pool object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!oi(s.data.bcs.type))throw new Error(`object at id ${o} is not a Pool object`);return r.fromSuiObjectData(a,s.data)}};ne();var ca=Ne(nt());import{bcs as ga}from"@mysten/sui/bcs";import{fromB64 as Rs}from"@mysten/sui/utils";function si(r){return r=G(r),r.startsWith(`${ca.PKG_V1}::user_deposit::UserDeposit<`)}var di=class r{__StructClass=!0;static get $typeName(){return`${ca.PKG_V1}::user_deposit::UserDeposit`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;id;lpAmount;rewardDebt;constructor(i,a){this.$fullTypeName=j(r.$typeName,...i),this.$typeArgs=i,this.id=a.id,this.lpAmount=a.lpAmount,this.rewardDebt=a.rewardDebt}static reified(i){return{typeName:r.$typeName,fullTypeName:j(r.$typeName,T(i)),typeArgs:[T(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([T(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return ga.struct("UserDeposit",{id:Ze.bcs,lp_amount:ga.u64(),reward_debt:ga.u64()})}static fromFields(i,a){return r.reified(i).new({id:L(Ze.reified(),a.id),lpAmount:L("u64",a.lp_amount),rewardDebt:L("u64",a.reward_debt)})}static fromFieldsWithTypes(i,a){if(!si(a.type))throw new Error("not a UserDeposit type");return ze(a,[i]),r.reified(i).new({id:S(Ze.reified(),a.fields.id),lpAmount:S("u64",a.fields.lp_amount),rewardDebt:S("u64",a.fields.reward_debt)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{id:this.id,lpAmount:this.lpAmount.toString(),rewardDebt:this.rewardDebt.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({id:M(Ze.reified(),a.id),lpAmount:M("u64",a.lpAmount),rewardDebt:M("u64",a.rewardDebt)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Ve(j(r.$typeName,T(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!si(a.type))throw new Error(`object at ${a.fields.id} is not a UserDeposit object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!si(a.bcs.type))throw new Error("object at is not a UserDeposit object");let o=oe(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=G(o[0]),d=G(T(i));if(s!==G(T(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,Rs(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching UserDeposit object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!si(s.data.bcs.type))throw new Error(`object at id ${o} is not a UserDeposit object`);return r.fromSuiObjectData(a,s.data)}};function Fo(r,i,a){if(i.length===0||!i[0])return[];let o=i[0],s=r.reduce((g,c)=>g+BigInt(c),BigInt(0)),d=BigInt(o.balance),A=[];for(let g of i.slice(1)){if(d>s)return Go(a,o,A,r);d+=BigInt(g.balance),A.push(g)}return d>=s?Go(a,o,A,r):[]}function Go(r,i,a,o){let s=o.map(d=>r.pure.u64(d));return a.length>0&&r.mergeCoins(i.coinObjectId,a.map(d=>d.coinObjectId)),r.splitCoins(i.coinObjectId,s)}var Ws="0x0000000000000000000000000000000000000000000000000000000000000000";async function fo(r,i,a){let o=await r.devInspectTransactionBlock({sender:Ws,transactionBlock:i});if(o.effects.status.status!=="success")throw new Error(`inspectionResult failed. ${JSON.stringify(o,null,2)}`);let s=o.results?.pop()?.returnValues?.pop();if(!s)throw new Error(`Something with inspectionResult went wrong. ${JSON.stringify(o,null,2)}`);let[d,A]=s;return typeof a=="object"?a.fromBcs(Uint8Array.from(d)).toJSONField():qt(a).parse(Uint8Array.from(d))}var gi=class extends ce{constructor(a,o){super();this.suiRpcUrl=a;this.api=o;this.client=new Bs({url:a})}chainType="SUI";client;async getUserBalanceInfo(a,o){if(!o.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=o.suiAddresses;if(!s)throw new I("SUI token must contain 'suiAddresses'");(0,wt.setAddress)(s.bridgeAddress,s.bridgeAddressOrigin);let A=(await this.fetchDeposits(a,o.originTokenAddress)).reduce((g,c)=>{if(c.data)return g.lpAmount+=BigInt(c.data.content.fields.lp_amount),g.rewardDebt+=BigInt(c.data.content.fields.reward_debt),g;throw new I("Deposits fetch failed")},{lpAmount:BigInt(0),rewardDebt:BigInt(0)});return new q({lpAmount:A.lpAmount.toString(),rewardDebt:A.rewardDebt.toString()})}async fetchDeposits(a,o){return await xe(s=>this.client.getOwnedObjects({owner:a,filter:{StructType:di.phantom(U(o)).phantomType},options:{showContent:!0},cursor:s}))}async getPoolInfoFromChain(a){let o=a.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,wt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=48,d=new Ai;Ao(d,a.originTokenAddress,o.bridgeObjectAddress);let A=await fo(this.client,d,ri.reified(U(a.originTokenAddress))),g=A.state.tokenBalance,c=A.state.vusdBalance,l=te({tokenBalance:g,vUsdBalance:c});return{dValue:A.state.d,aValue:A.state.a,totalLpAmount:A.rewards.lpSupply,vUsdBalance:c,tokenBalance:g,accRewardPerShareP:A.rewards.accRewardPerShareP,p:s,imbalance:l}}async buildRawTransactionDeposit(a){let o=a.token.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,wt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=await xe(m=>this.client.getCoins({owner:a.accountAddress,coinType:a.token.originTokenAddress,cursor:m}));if(s.length===0||!s[0])throw new Qe("No coins to deposit");let d=s[0],A=new Ai;A.setSender(a.accountAddress);let{depositObj:g,isNewDeposit:c}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,A),[l]=Fo([a.amount],s,A);if(!l)throw new Qe("No coins to deposit");if(!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let u=oo(A,a.token.originTokenAddress,{bridge:o.bridgeObjectAddress,userDeposit:g,coin:l});return A.mergeCoins(d.coinObjectId,[u]),c&&A.transferObjects([g],a.accountAddress),await A.toJSON({client:this.client})}async getDepositObject(a,o,s){let d=await this.fetchDeposits(a,o);if(d.length===0||!d[0]){let A=U(o).phantomType;return{depositObj:go(s,A),isNewDeposit:!0}}else{if(d[0].data?.objectId)return{depositObj:d[0].data.objectId,isNewDeposit:!1};throw new I("Something went wrong while deposit")}}async buildRawTransactionWithdraw(a){let o=a.token.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,wt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=U(a.token.originTokenAddress).phantomType,d=new Ai;d.setSender(a.accountAddress);let{depositObj:A,isNewDeposit:g}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,d);if(g)throw new Qe("No deposit found");let c=ro(d,s,{bridge:o.bridgeObjectAddress,userDeposit:A,amountLp:BigInt(a.amount)}),l=await xe(u=>this.client.getCoins({owner:a.accountAddress,coinType:a.token.originTokenAddress,cursor:u}));if(!c[0]||!c[1])throw new I("No rewards found");return l[0]?d.mergeCoins(l[0].coinObjectId,[c[0],c[1]]):(d.mergeCoins(c[0],[c[1]]),d.transferObjects([c[0]],a.accountAddress)),await d.toJSON({client:this.client})}async buildRawTransactionClaimRewards(a){let o=a.token.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,wt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=U(a.token.originTokenAddress).phantomType,d=new Ai;d.setSender(a.accountAddress);let{depositObj:A,isNewDeposit:g}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,d);if(g)throw new Qe("No deposit found");let c=so(d,s,{bridge:o.bridgeObjectAddress,userDeposit:A}),l=await xe(u=>this.client.getCoins({owner:a.accountAddress,coinType:a.token.originTokenAddress,cursor:u}));return l[0]?d.mergeCoins(l[0].coinObjectId,[c]):d.transferObjects([c],a.accountAddress),await d.toJSON({client:this.client})}};import{Web3 as ci}from"web3";import{encodeFunctionCall as Zs}from"web3-eth-abi";var rn=class extends ce{constructor(a,o,s){super();this.tronWeb=a;this.api=o;this.tronJsonRpc=s}chainType="TRX";P=52;async getUserBalanceInfo(a,o){let s;if(this.tronJsonRpc)try{s=await this.getUserBalanceInfoByBatch(this.tronJsonRpc,a,o)}catch{s=await this.getUserBalanceInfoPerProperty(a,o)}else s=await this.getUserBalanceInfoPerProperty(a,o);return s}async getUserBalanceInfoByBatch(a,o,s){let d=Qt(s.poolAddress),A=Qt(o),g=[{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:d,data:this.getFunctionAbi("userRewardDebt",A)},"latest"]},{jsonrpc:"2.0",id:2,method:"eth_call",params:[{to:d,data:this.getFunctionAbi("balanceOf",A)},"latest"]}],l=await(await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)})).json();if(Array.isArray(l)&&l.length===2){let u=m=>{let p=l.find(b=>b.id===m);if(!p||!p.result)throw new Error(`Missing or invalid result for id ${m}`);return ci.utils.toBigInt(p.result).toString()};return new q({lpAmount:ci.utils.toBigInt(u(2)).toString(),rewardDebt:ci.utils.toBigInt(u(1)).toString()})}throw new Error("Batched HTTP call failed")}async getUserBalanceInfoPerProperty(a,o){this.tronWeb.defaultAddress.base58||this.tronWeb.setAddress(a);let s=this.getContract(o.poolAddress),d=(await s.methods.userRewardDebt(a).call()).toString(),A=(await s.methods.balanceOf(a).call()).toString();return new q({lpAmount:A,rewardDebt:d})}async getPoolInfoFromChain(a){let o;if(this.tronJsonRpc)try{o=await this.getPoolInfoByBatch(this.tronJsonRpc,a)}catch{o=await this.getPoolInfoPerProperty(a)}else o=await this.getPoolInfoPerProperty(a);return o}async getPoolInfoByBatch(a,o){let s=Qt(o.poolAddress),d=[{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("a")},"latest"]},{jsonrpc:"2.0",id:2,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("d")},"latest"]},{jsonrpc:"2.0",id:3,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("tokenBalance")},"latest"]},{jsonrpc:"2.0",id:4,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("vUsdBalance")},"latest"]},{jsonrpc:"2.0",id:5,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("totalSupply")},"latest"]},{jsonrpc:"2.0",id:6,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("accRewardPerShareP")},"latest"]}],g=await(await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)})).json();if(Array.isArray(g)&&g.length===6){let c=p=>{let b=g.find(W=>W.id===p);if(!b||!b.result)throw new Error(`Missing or invalid result for id ${p}`);return ci.utils.toBigInt(b.result).toString()},l=c(3),u=c(4),m=te({tokenBalance:l,vUsdBalance:u});return{aValue:c(1),dValue:c(2),tokenBalance:l,vUsdBalance:u,totalLpAmount:c(5),accRewardPerShareP:c(6),p:this.P,imbalance:m}}throw new Error("Batched pool info call failed")}async getPoolInfoPerProperty(a){this.tronWeb.defaultAddress.base58||this.tronWeb.setAddress(a.poolAddress);let o=this.getContract(a.poolAddress),[s,d,A,g,c,l]=await Promise.all([o.methods.a().call(),o.methods.d().call(),o.methods.tokenBalance().call(),o.methods.vUsdBalance().call(),o.methods.totalSupply().call(),o.methods.accRewardPerShareP().call()]),u=A.toString(),m=g.toString(),p=te({tokenBalance:u,vUsdBalance:m});return{aValue:s.toString(),dValue:d.toString(),tokenBalance:u,vUsdBalance:m,totalLpAmount:c.toString(),accRewardPerShareP:l.toString(),p:this.P,imbalance:p}}buildRawTransactionDeposit(a){let{amount:o,accountAddress:s}=a,d=[{type:"uint256",value:o}];return this.buildRawTransaction(a.token.poolAddress,"deposit(uint256)",d,"0",s)}buildRawTransactionWithdraw(a){let{amount:o,accountAddress:s}=a,d=[{type:"uint256",value:o}];return this.buildRawTransaction(a.token.poolAddress,"withdraw(uint256)",d,"0",s)}buildRawTransactionClaimRewards(a){let{accountAddress:o}=a,s=[];return this.buildRawTransaction(a.token.poolAddress,"claimRewards()",s,"0",o)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}getContract(a){return this.tronWeb.contract(nn.abi,a)}getFunctionAbi(a,...o){let s=nn.abi.find(d=>d.type==="function"&&"name"in d&&d.name===a);if(!s)throw new Error(`${a} method not found in Pool ABI`);return Zs(s,o)}};var li=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new _n(i,a,this.params,s);let d=o.cachePoolInfoChainSec>0?o.cachePoolInfoChainSec*1e3:20*1e3;this.cache=new Fs({defaultTtl:d})}rawTxBuilder;cache;async getAllowance(i,a){if(a){let o=i,s=a;return await this.tokenService.getAllowance({...s,spender:s.token.poolAddress},o)}else{let o=i;return await this.tokenService.getAllowance({...o,spender:o.token.poolAddress})}}async checkAllowance(i,a){if(a){let o=i,s=a;return this.tokenService.checkAllowance({...s,spender:s.token.poolAddress},o)}else{let o=i;return this.tokenService.checkAllowance({...o,spender:o.token.poolAddress})}}async approve(i,a){return this.tokenService.approve(i,{...a,spender:a.token.poolAddress})}async getAmountToBeDeposited(i,a,o){V(i),H("amount",i,a.decimals);let s=await this.getPoolInfoFromChain(a,o),{vUsdBalance:d,tokenBalance:A,aValue:g,dValue:c}=s,l=Yo(i,g,c,A,d);return F(l,3).toFixed()}async getAmountToBeWithdrawn(i,a,o,s){V(i),H("amount",i,o.decimals);let d=await this.getPoolInfoFromChain(o,s),A=Ro(i),g=be(A,o.decimals),l=(await this.getUserBalanceInfo(a,o,s)).earned(d)||"0",u=Gs(g).plus(l).toFixed();return F(u,o.decimals).toFixed()}async getUserBalanceInfo(i,a,o){return Ft(a.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,o).getUserBalanceInfo(i,a)}async getPoolInfoFromChain(i,a){let o={chainSymbol:i.chainSymbol,poolAddress:i.poolAddress},s=this.cache.get(o);if(s)return s;{let d=await Ft(i.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).getPoolInfoFromChain(i);return this.cache.put(o,d),this.api.cachePut({chainSymbol:i.chainSymbol,poolAddress:i.poolAddress},d),d}}};function Ft(r,i,a,o,s){switch(X.getChainProperty(r).chainType){case"EVM":{if(s)return new an(s,i);{let d=a.getNodeRpcUrl(r),A=new ws(d);return A.defaultReturnFormat={number:Ts.STR,bytes:Ns.HEX},new an(A,i)}}case"TRX":{let d=a.getNodeRpcUrl(r),A=o.tronJsonRpc;if(s)return new rn(s,i,A);{let g=new fs({fullHost:d});return new rn(g,i,A)}}case"SOLANA":{let d=a.getNodeRpcUrl(r);return new $n(d,i)}case"SRB":return new ei(a,o,i);case"SUI":return new gi(a.getNodeRpcUrl(r),i);case"ALG":if(s){let d=s,A=No.fromClients({algod:d});return new tn(A,i)}else{let d=a.getNodeRpcUrl(r),A=No.fromConfig({algodConfig:{server:d}});return new tn(A,i)}}}import{TronWeb as Ss}from"tronweb";import{FMT_BYTES as Ms,FMT_NUMBER as Hs,Web3 as Ls}from"web3";var Xs={abi:[{inputs:[{internalType:"string",name:"tokenName_",type:"string"},{internalType:"string",name:"tokenSymbol_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"lpAmount",type:"uint256"}],name:"Deposited",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"token",type:"address"}],name:"DepositedRewards",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256[4]",name:"values",type:"uint256[4]"}],name:"MultiTransfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdrawn",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"NUM_TOKENS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"},{internalType:"uint256",name:"minVirtualAmount",type:"uint256"}],name:"deposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"depositRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"getEstimatedAmountOnDeposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"getRewardsAmount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"virtualAmount",type:"uint256"}],name:"getWithdrawProportionAmount",outputs:[{internalType:"uint256[4]",name:"",type:"uint256[4]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"pools",outputs:[{internalType:"contract IPool",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"},{internalType:"contract IPool",name:"pool",type:"address"}],name:"setPool",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subBalanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"subDepositRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"subTotalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subTransfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subTransferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"virtualAmount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"tokens",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"virtualAmount",type:"uint256"}],name:"withdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},ui=Xs;var Ct=class{};var sn=class extends Ct{constructor(a,o){super();this.web3=a;this.api=o}chainType="EVM";async balanceOf(a){let o=(await this.getYieldContract(a.token.yieldAddress).methods.balanceOf(a.owner).call()).toString();return F(o,3).toFixed()}async getEstimatedAmountOnDeposit(a){let o=f(a.amount,a.token.decimals).toFixed(),s=(await this.getYieldContract(a.token.yieldAddress).methods.getEstimatedAmountOnDeposit(o,a.token.yieldId).call()).toString();return F(s,3).toFixed()}async getWithdrawProportionAmount(a){let o=f(a.amount,3).toFixed();return await this.getYieldContract(a.cydToken.yieldAddress).methods.getWithdrawProportionAmount(a.owner,o).call()}async buildRawTransactionDeposit(a){return Promise.resolve({...this.buildTxParams({owner:a.owner,yieldAddress:a.token.yieldAddress}),data:this.getYieldContract(a.token.yieldAddress).methods.deposit(a.amount,a.token.yieldId,a.minVirtualAmount).encodeABI()})}async buildRawTransactionWithdraw(a){return Promise.resolve({...this.buildTxParams({owner:a.owner,yieldAddress:a.token.yieldAddress}),data:this.getYieldContract(a.token.yieldAddress).methods.withdraw(a.amount).encodeABI()})}buildTxParams(a){return{from:a.owner,to:a.yieldAddress,value:"0"}}getYieldContract(a){return new this.web3.eth.Contract(ui.abi,a)}};var mi=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s}async approve(i,a){return this.tokenService.buildRawTransactionApprove({...i,spender:i.token.yieldAddress},a)}async deposit(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),V(i.minVirtualAmount),H("minVirtualAmount",i.minVirtualAmount,3),i.amount=f(i.amount,i.token.decimals).toFixed(),i.minVirtualAmount=f(i.minVirtualAmount,3).toFixed(),Xt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).buildRawTransactionDeposit(i)}async withdraw(i,a){return V(i.amount),H("amount",i.amount,3),i.amount=f(i.amount,3).toFixed(),Xt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).buildRawTransactionWithdraw(i)}};var dn=class extends Ct{constructor(a,o){super();this.tronWeb=a;this.api=o}chainType="TRX";async balanceOf(a){let o=(await(await this.getContract(a.token.yieldAddress)).methods.balanceOf(a.owner).call()).toString();return F(o,3).toFixed()}async getEstimatedAmountOnDeposit(a){let o=f(a.amount,a.token.decimals).toFixed(),s=(await(await this.getContract(a.token.yieldAddress)).methods.getEstimatedAmountOnDeposit(o,a.token.yieldId).call()).toString();return F(s,3).toFixed()}async getWithdrawProportionAmount(a){let o=f(a.amount,3).toFixed();return(await(await this.getContract(a.cydToken.yieldAddress)).methods.getWithdrawProportionAmount(a.owner,o).call()).toString().split(",")}async buildRawTransactionDeposit(a){let{amount:o,owner:s,token:d,minVirtualAmount:A}=a,g=[{type:"uint256",value:o},{type:"uint256",value:d.yieldId},{type:"uint256",value:A}];return this.buildRawTransaction(a.token.yieldAddress,"deposit(uint256,uint256,uint256)",g,"0",s)}async buildRawTransactionWithdraw(a){let{amount:o,owner:s}=a,d=[{type:"uint256",value:o}];return this.buildRawTransaction(a.token.yieldAddress,"withdraw(uint256)",d,"0",s)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}getContract(a){return this.tronWeb.contract(ui.abi,a)}};function Vs(r){if(!pi(r))throw new vn("Token does not support Yield")}function pi(r){return!!r.yieldAddress&&r.yieldId!==void 0}var Ci=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new mi(i,a,o,s)}rawTxBuilder;async getCYDTokens(){let i=[],a=await this.api.getChainDetailsMap("pool");return Object.values(a).forEach(o=>{if(o.yieldAddress){let s=o.tokens.find(A=>A.tokenAddress===o.yieldAddress),d=o.tokens.filter(pi);if(d.length>0){let A=s??{allbridgeChainId:o.allbridgeChainId,apr:"",apr30d:"",apr7d:"",bridgeId:o.bridgeId,bridgeAddress:o.bridgeAddress,chainId:o.chainId,chainName:o.name,chainSymbol:o.chainSymbol,chainType:o.chainType,confirmations:o.confirmations,decimals:3,feeShare:"",lpRate:"",name:"Core Yield",poolAddress:"",symbol:"CYD",tokenAddress:o.yieldAddress,transferTime:{},txCostAmount:{maxAmount:"0",swap:"0",transfer:"0"},yieldAddress:o.yieldAddress};i.push({...A,yieldAddress:o.yieldAddress,tokens:d})}}}),i}async getAllowance(i,a){return await this.tokenService.getAllowance({...i,spender:i.token.yieldAddress},a)}async checkAllowance(i,a){return this.tokenService.checkAllowance({...i,spender:i.token.yieldAddress},a)}async balanceOf(i,a){return Xt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).balanceOf(i)}async getEstimatedAmountOnDeposit(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),Xt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.token.yieldAddress,a).getEstimatedAmountOnDeposit(i)}async getWithdrawAmounts(i,a){V(i.amount),H("amount",i.amount,3);let o=await Xt(i.cydToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).getWithdrawProportionAmount(i);return i.cydToken.tokens.filter(s=>o[s.yieldId]!==void 0).map(s=>({amount:F(o[s.yieldId],s.decimals).toFixed(),token:s}))}};function Xt(r,i,a,o,s){switch(X.getChainProperty(r).chainType){case"EVM":{if(s)return new sn(s,i);{let d=a.getNodeRpcUrl(r),A=new Ls(d);return A.defaultReturnFormat={number:Hs.STR,bytes:Ms.HEX},new sn(A,i)}}case"TRX":{if(s)return new dn(s,i);{let d=a.getNodeRpcUrl(r),A=new Ss({fullHost:d});return A.setAddress(o),new dn(A,i)}}case"SOLANA":throw new k;case"SRB":throw new k;case"SUI":throw new k;case"ALG":throw new k}}import{Big as E}from"big.js";function Xo(r,i,a){let o=Ps(r,{decimals:i.decimals,feeShare:i.feeShare},i.poolInfo),s=js(o.amountIncludingCommissionInSystemPrecision,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo);return{swapToVUsdCalcResult:o,swapFromVUsdCalcResult:s}}function Vo(r,i,a){let o=Js(r,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo),s=ks(o.amountIncludingCommissionInSystemPrecision,{decimals:i.decimals,feeShare:i.feeShare},i.poolInfo);return{swapToVUsdCalcResult:o,swapFromVUsdCalcResult:s}}function Ps(r,{feeShare:i,decimals:a},o){let s=E(r),d=s.times(i),A=s.minus(d);return{bridgeFeeInTokenPrecision:d.round().toFixed(),amountIncludingCommissionInSystemPrecision:To(At(A,a),o),amountExcludingCommissionInSystemPrecision:To(At(s,a),o)}}function To(r,i){if(r.eq(0))return"0";let a=E(i.tokenBalance).plus(r),o=Je(a.toFixed(),i.aValue,i.dValue);return E(i.vUsdBalance).minus(o).round().toFixed()}function js(r,{feeShare:i,decimals:a},o){if(E(r).eq(0))return{bridgeFeeInTokenPrecision:"0",amountIncludingCommissionInTokenPrecision:"0",amountExcludingCommissionInTokenPrecision:"0"};let d=E(r).plus(o.vUsdBalance),A=Je(d,o.aValue,o.dValue),g=be(E(o.tokenBalance).minus(A),a),c=E(g).times(i),l=E(g).minus(c).round();return{bridgeFeeInTokenPrecision:c.round().toFixed(),amountIncludingCommissionInTokenPrecision:l.toFixed(),amountExcludingCommissionInTokenPrecision:g.toFixed()}}function Js(r,{feeShare:i,decimals:a},o){let s=E(i).div(E(1).minus(i)),d=E(r).times(s),A=E(r).plus(d);return{bridgeFeeInTokenPrecision:d.round().toFixed(),amountIncludingCommissionInSystemPrecision:wo(At(A,a),o),amountExcludingCommissionInSystemPrecision:wo(At(r,a),o)}}function wo(r,i){let a=E(i.tokenBalance).minus(r),o=Je(a.toFixed(),i.aValue,i.dValue);return E(o).minus(i.vUsdBalance).round().toFixed()}function ks(r,{feeShare:i,decimals:a},o){if(E(r).eq(0))return{bridgeFeeInTokenPrecision:"0",amountIncludingCommissionInTokenPrecision:"0",amountExcludingCommissionInTokenPrecision:"0"};let s=E(o.vUsdBalance).minus(r),d=Je(s.toFixed(),o.aValue,o.dValue),A=E(d).minus(o.tokenBalance),g=be(A.toFixed(),a),c=E(i).div(E(1).minus(i)),l=E(g).times(c),u=E(g).plus(l);return{bridgeFeeInTokenPrecision:l.round().toFixed(),amountIncludingCommissionInTokenPrecision:u.round().toFixed(),amountExcludingCommissionInTokenPrecision:g.toFixed()}}import{Big as st}from"big.js";function So(r,i,a,o,s){let d=je(r,i,a),A=be(d,i.decimals),g=Ot(d,o,s),c=st(r).times(i.feeShare),l=st(g).div(st(1).minus(o.feeShare)).minus(g);return{sourceLPSwap:{fee:F(c,i.decimals).neg().round(i.decimals,st.roundUp).toFixed(),swap:F(st(r).minus(A).minus(c),i.decimals).neg().round(i.decimals,st.roundUp).toFixed()},destLPSwap:{fee:F(l,o.decimals).neg().round(o.decimals,st.roundUp).toFixed(),swap:F(be(d,o.decimals).minus(g).minus(l),o.decimals).neg().round(o.decimals,st.roundUp).toFixed()}}}import{AlgorandClient as Mo}from"@algorandfoundation/algokit-utils";import{ABIMethod as zs,OnApplicationComplete as xs}from"algosdk";var Ii=class{constructor(i){this.nodeRpcUrlsConfig=i}async checkAssetOptIn(i,a,o){let s=this.getAlgorand(o);return Gn(i,a,s)}async buildRawTransactionAssetOptIn(i,a,o){let s=this.getAlgorand(o);typeof i=="string"&&(i=BigInt(i));let d=await s.createTransaction.assetOptIn({assetId:i,sender:a});return _e(d)}async checkAppOptIn(i,a,o){let s=this.getAlgorand(o);return Fn(i,a,s)}async buildRawTransactionAppOptIn(i,a,o){let s=this.getAlgorand(o);typeof i=="string"&&(i=BigInt(i));let d=s.newGroup(),A=s.account.random();d.addAppCallMethodCall({appId:i,method:new zs({name:"optInToApplication",desc:void 0,args:[],returns:{type:"void",desc:void 0},events:[],readonly:!1}),args:[],sender:a,signer:A,onComplete:xs.OptInOC});let{transactions:g}=await d.buildTransactions();return _e(...g)}getAlgorand(i){if(i)return Mo.fromClients({algod:i});{let a=this.nodeRpcUrlsConfig.getNodeRpcUrl("ALG");return Mo.fromConfig({algodConfig:{server:a}})}}};import Es from"axios";var Ho="3.27.0-alpha.2";function Lo(r){return Object.entries(r).reduce((i,a)=>{let o=a[0],s=a[1],d=Ds(o,s);return d&&(i[o]=d),i},{})}function Po(r){let i={};for(let[a,o]of Object.entries(r)){let s=a;for(let d of o.tokens){let A=Vt({chainSymbol:s,poolAddress:d.poolAddress}),g=te(d.poolInfo);i[A]={...d.poolInfo,imbalance:g}}}return i}function Os(r,i){let{name:a,...o}=r,{poolInfo:s,...d}=i;return{...d,...o,chainName:a}}function Qs(r){switch(r){case"allbridge":return 1;case"wormhole":return 2;case"cctp":return 3;case"cctpV2":return 4;case"oft":return 5}}function Ks(r){return Object.entries(r).reduce((i,[a,o])=>(i[a]=Us(o),i),{})}function Us(r){return Object.entries(r).reduce((i,[a,o])=>{let s=Qs(a);return s&&o!=null&&(i[s]=o),i},{})}function Ds(r,i){let a=X.getChainsProperties()[r];if(!a)return null;let o={...a,allbridgeChainId:i.chainId,bridgeId:i.bridgeId,bridgeAddress:i.bridgeAddress,oftBridgeAddress:i.oftBridgeAddress,yieldAddress:i.yieldAddress,transferTime:Ks(i.transferTime),txCostAmount:i.txCostAmount,confirmations:i.confirmations,suiAddresses:i.suiAddresses};return{...o,tokens:i.tokens.map(s=>Os(o,s))}}function Vt(r){return r.chainSymbol+"_"+r.poolAddress}function jo(r){let i=[];for(let[a,o]of Object.entries(r)){let s=a;for(let d of o.tokens)i.push({chainSymbol:s,poolAddress:d.poolAddress})}return i}function Jo(r){let i={};for(let[a,o]of Object.entries(r)){let s=a;for(let[d,A]of Object.entries(o))A.imbalance=te(A),i[Vt({chainSymbol:s,poolAddress:d})]=A}return i}var St=class{api;constructor(i){this.api=Es.create({baseURL:i.coreApiUrl,headers:{Accept:"application/json",...i.coreApiHeaders,"x-Sdk-Agent":"AllbridgeCoreSDK/"+Ho},params:i.coreApiQueryParams})}async getTokenInfo(){let{data:i}=await this.api.get("/token-info",{params:{filter:"all"}});return{chainDetailsMap:Lo(i),poolInfoMap:Po(i)}}async getPendingInfo(){let{data:i}=await this.api.get("/pending-info");return i}async getGasBalance(i,a){let{data:o}=await this.api.get(`/check/${i}/${a}`);return o}async getTransferStatus(i,a){let{data:o}=await this.api.get(`/chain/${i}/${a}`);return o}async getReceiveTransactionCost(i){if(i.messenger===5&&!i.sourceToken)throw new In("For OFT sourceToken required");let{data:a}=await this.api.post("/receive-fee",i,{headers:{"Content-Type":"application/json"}});return{exchangeRate:a.exchangeRate,fee:a.fee,sourceNativeTokenPrice:a.sourceNativeTokenPrice,adminFeeShareWithExtras:a.adminFeeShareWithExtras}}async getPoolInfoMap(i){let a=i instanceof Array?i:[i],{data:o}=await this.api.post("/pool-info",{pools:a},{headers:{"Content-Type":"application/json"}});return Jo(o)}};import bi from"timed-cache";var la=20*1e3,_s=55*1e3,Mt=class{constructor(i){this.apiClient=i;this.tokenInfoCache=new bi({defaultTtl:_s}),this.receivedTransactionCache=new bi({defaultTtl:la}),this.pendingInfoCache=new bi({defaultTtl:la}),this.gasBalanceCache=new bi({defaultTtl:la})}tokenInfoCache;pendingInfoCache;gasBalanceCache;receivedTransactionCache;getTokenInfo(){let i="TOKEN_INFO_CACHE_KEY",a=this.tokenInfoCache.get(i);if(a)return a;let o=this.apiClient.getTokenInfo();return this.tokenInfoCache.put(i,o),o}async getGasBalance(i,a){let o=`GAS_BALANCE_${i}_${a}`,s=this.gasBalanceCache.get(o);if(s)return s;let d=this.apiClient.getGasBalance(i,a);return this.gasBalanceCache.put(o,d),d}async getPendingInfo(){let i="PENDING_INFO_CACHE_KEY",a=this.pendingInfoCache.get(i);if(a)return a;let o=this.apiClient.getPendingInfo();return this.pendingInfoCache.put(i,o),o}async getReceiveTransactionCost(i){let a=`RECEIVE_TX_COST_${i.sourceChainId}_${i.destinationChainId}_${i.messenger}${i.sourceToken?"_"+i.sourceToken:""}`,o=this.receivedTransactionCache.get(a);if(o)return o;let s=await this.apiClient.getReceiveTransactionCost(i);return this.receivedTransactionCache.put(a,s),s}async getTransferStatus(i,a){return this.apiClient.getTransferStatus(i,a)}async getPoolInfoMap(i){return this.apiClient.getPoolInfoMap(i)}};var Ht=class{constructor(i){this.apiClient=i}async getChainDetailsMap(){return(await this.apiClient.getTokenInfo()).chainDetailsMap}async tokens(){let i=await this.getChainDetailsMap();return Object.values(i).flatMap(a=>a.tokens)}async getPendingInfo(){return this.apiClient.getPendingInfo()}async getGasBalance(i,a){return this.apiClient.getGasBalance(i,a)}async getChainDetailsMapAndPoolInfoMap(){return await this.apiClient.getTokenInfo()}async getTransferStatus(i,a){return await this.apiClient.getTransferStatus(i,a)}async getReceiveTransactionCost(i){return await this.apiClient.getReceiveTransactionCost(i)}async getPoolInfoMap(i){return await this.apiClient.getPoolInfoMap(i)}};var Lt=class{constructor(i,a){this.client=i;this.isStaging=a.coreApiQueryParams?.staging==="true"}isStaging;async getChainDetailsMap(i){let a=await this.client.getChainDetailsMap(),o={};for(let s in a){let d=a[s];d&&(o[s]={...d,tokens:ko(d.tokens,i,this.isStaging)})}return o}async tokens(i){return ko(await this.client.tokens(),i,this.isStaging)}async getPendingInfo(){return this.client.getPendingInfo()}async getGasBalance(i,a){return this.client.getGasBalance(i,a)}async getTransferStatus(i,a){return await this.client.getTransferStatus(i,a)}async getReceiveTransactionCost(i){return await this.client.getReceiveTransactionCost(i)}cachePut(i,a){return this.client.cachePut(i,a)}getPoolInfoByKey(i){return this.client.getPoolInfoByKey(i)}refreshPoolInfo(i){return this.client.refreshPoolInfo(i)}};function ko(r,i,a){return r.filter(o=>a?!0:o.flags[i]).map($s)}function $s(r){let{flags:i,...a}=r;return a}import qs from"timed-cache";var ed=55*1e3,Pt=class{constructor(i){this.client=i;this.poolInfoCache=new ua}poolInfoCache;async getChainDetailsMap(){return(await this.client.getChainDetailsMapAndPoolInfoMap()).chainDetailsMap}async tokens(){return await this.client.tokens()}getTransferStatus(i,a){return this.client.getTransferStatus(i,a)}getReceiveTransactionCost(i){return this.client.getReceiveTransactionCost(i)}getPendingInfo(){return this.client.getPendingInfo()}getGasBalance(i,a){return this.client.getGasBalance(i,a)}async getPoolInfoByKey(i){this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap);let a=this.poolInfoCache.get(i);if(a)return a;{let o=await this.client.getPoolInfoMap(i);this.poolInfoCache.putAll(o);let s=o[Vt(i)];if(s)return s;throw new I("Cannot find pool info for "+i.poolAddress+" on chain "+i.chainSymbol)}}async refreshPoolInfo(i){let a;if(i)this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap),a=await this.client.getPoolInfoMap(i);else{let o=await this.client.getChainDetailsMapAndPoolInfoMap();a=await this.client.getPoolInfoMap(jo(o.chainDetailsMap))}this.poolInfoCache.putAll(a)}cachePut(i,a){this.poolInfoCache.put(Vt(i),a)}},ua=class{cache;constructor(){this.cache=new qs({defaultTtl:ed})}putAll(i){for(let[a,o]of Object.entries(i))this.cache.put(a,o)}putAllIfNotExists(i){for(let[a,o]of Object.entries(i))this.cache.get(a)||this.cache.put(a,o)}put(i,a){this.cache.put(i,a)}get(i){let a=Vt(i);return this.cache.get(a)}};import{AlgorandClient as xo}from"@algorandfoundation/algokit-utils";import{Big as gd}from"big.js";import{TronWeb as cd}from"tronweb";import{Web3 as ld}from"web3";import{Big as zo}from"big.js";var le=class{async checkAllowance(i){let a=await this.getAllowance(i);return zo(a).gte(zo(i.amount))}};var An=class extends le{constructor(a,o){super();this.algorand=a;this.api=o}chainType="SUI";approve(a){throw new k}buildRawTransactionApprove(a){throw new k}getAllowance(a){throw new k}async getNativeTokenBalance(a){let{account:o}=a;return(await this.algorand.account.getInformation(o)).balance.microAlgo.toString()}async getTokenBalance(a){let{account:o,token:s}=a;try{return(await this.algorand.asset.getAccountInformation(o,BigInt(s.tokenAddress))).balance.toString()}catch(d){if(d instanceof Error)return d.message.includes("account asset info not found"),"0";throw d}}};var td={abi:[{inputs:[{internalType:"string",name:"name_",type:"string"},{internalType:"string",name:"symbol_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}]},yi=td;var nd="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",id="0xdac17f958d2ee523a2206206994597c13d831ec7",ad=1e5,gn=class extends le{constructor(a,o){super();this.web3=a;this.api=o}chainType="EVM";getAllowance(a){let o=a.token.tokenAddress,s=a.owner,d=a.spender;return this.getAllowanceByTokenAddress(o,s,d)}getAllowanceByTokenAddress(a,o,s){return this.getERC20Contract(a).methods.allowance(o,s).call()}async getTokenBalance(a){return await this.getERC20Contract(a.token.tokenAddress).methods.balanceOf(a.account).call()}async getNativeTokenBalance(a){return(await this.web3.eth.getBalance(a.account)).toString()}async approve(a){if(this.isUsdt(a.tokenAddress)&&await this.getAllowanceByTokenAddress(a.tokenAddress,a.owner,a.spender)!=="0"){let d=await this.buildRawTransactionApprove({...a,amount:"0"});await this.sendRawTransaction(d,a.chainSymbol)}let o=await this.buildRawTransactionApprove(a);return await this.sendRawTransaction(o,a.chainSymbol)}isUsdt(a){return a.toLowerCase()===id}buildRawTransactionApprove(a){let{tokenAddress:o,spender:s,owner:d,amount:A}=a,c=this.getERC20Contract(o).methods.approve(s,A==null?nd:xn(A));return Promise.resolve({from:d,to:o,value:"0",data:c.encodeABI()})}async sendRawTransaction(a,o){let s=a,d={maxPriorityFeePerGas:void 0,maxFeePerGas:void 0};o==="POL"?s.gas=ad:s.gas=await this.web3.eth.estimateGas(a);let{transactionHash:A}=await this.web3.eth.sendTransaction({...s,...d});return{txId:A.toString()}}getERC20Contract(a){return new this.web3.eth.Contract(yi.abi,a)}};import{AnchorProvider as od}from"@project-serum/anchor";import{Connection as rd,PublicKey as hi}from"@solana/web3.js";var vi=class extends le{constructor(a,o){super();this.solanaRpcUrl=a;this.api=o}chainType="SOLANA";approve(a){throw new k}buildRawTransactionApprove(a){throw new k}buildAnchorProvider(a){let o=new rd(this.solanaRpcUrl,"confirmed"),s=new hi(a);return new od(o,{publicKey:s},{preflightCommitment:"confirmed",commitment:"confirmed"})}getAllowance(a){throw new k}async getTokenBalance(a){let{account:o,token:s}=a;try{let d=await we(new hi(o),new hi(s.tokenAddress));return(await Rt(d,this.buildAnchorProvider(o))).amount.toString()}catch(d){if(d instanceof Error)return d.message.startsWith("Account does not exist"),"0";throw d}}async getNativeTokenBalance(a){return(await this.buildAnchorProvider(a.account).connection.getBalance(new hi(a.account))).toString()}};import{Horizon as w2,NotFoundError as sd}from"@stellar/stellar-sdk";var Yi=class extends le{constructor(a,o,s){super();this.nodeRpcUrlsConfig=a;this.params=o;this.api=s}chainType="SRB";getAllowance(){throw new k}async getTokenBalance(a){if(!a.token.originTokenAddress)throw new I("OriginTokenAddress missing");let[o,s]=a.token.originTokenAddress.split(":"),d=new w2.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),A;try{A=await d.loadAccount(a.account)}catch(l){if(l instanceof sd)return"0";throw l}let c=A.balances.find(l=>(l.asset_type==="credit_alphanum4"||l.asset_type==="credit_alphanum12")&&l.asset_code==o&&l.asset_issuer==s);return c?.balance?f(c.balance,X.getChainDecimalsByType(X.getChainProperty(a.token.chainSymbol).chainType)).toFixed():"0"}async getNativeTokenBalance(a){let A=(await new w2.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")).loadAccount(a.account)).balances.find(g=>g.asset_type==="native");return A?.balance?f(A.balance,X.getChainDecimalsByType(X.getChainProperty(a.chainSymbol).chainType)).toFixed():"0"}approve(){throw new k}buildRawTransactionApprove(){throw new k}};import{SuiClient as dd}from"@mysten/sui/client";var Ri=class extends le{constructor(a,o){super();this.suiRpcUrl=a;this.api=o;this.suiClient=new dd({url:this.suiRpcUrl})}chainType="SUI";suiClient;approve(a){throw new k}buildRawTransactionApprove(a){throw new k}getAllowance(a){throw new k}async getTokenBalance(a){if(!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");return(await this.suiClient.getBalance({owner:a.account,coinType:a.token.originTokenAddress})).totalBalance}async getNativeTokenBalance(a){let o=await xe(s=>this.suiClient.getCoins({owner:a.account,cursor:s}));return o.length===0?"0":o.reduce((s,d)=>s+BigInt(d.balance),BigInt(0)).toString()}};var Ad="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",cn=class extends le{constructor(a,o){super();this.tronWeb=a;this.api=o}chainType="TRX";async getAllowance(a){let{token:{tokenAddress:o},owner:s}=a;return(await(await this.getContract(o)).methods.allowance(s,a.spender).call()).toString()}async getTokenBalance(a){return(await(await this.getContract(a.token.tokenAddress)).balanceOf(a.account).call()).toString()}async getNativeTokenBalance(a){return(await this.tronWeb.trx.getBalance(a.account)).toString()}async approve(a){let o=await this.buildRawTransactionApprove(a);return await On(this.tronWeb,o)}async buildRawTransactionApprove(a){let{tokenAddress:o,spender:s,owner:d,amount:A}=a,g=A==null?Ad:xn(A),c=[{type:"address",value:s},{type:"uint256",value:g}];return this.buildRawTransaction(o,"approve(address,uint256)",c,"0",d)}getContract(a){return this.tronWeb.contract(yi.abi,a)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}};var jt=class{constructor(i,a,o){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o}async getAllowance(i,a){let o=await this.getChainTokenService(i.token.chainSymbol,i.owner,a).getAllowance(i);return F(o,i.token.decimals).toFixed()}async checkAllowance(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),this.getChainTokenService(i.token.chainSymbol,i.owner,a).checkAllowance(this.prepareCheckAllowanceParams(i))}async approve(i,a){return a.amount&&(V(a.amount),H("amount",a.amount,a.token.decimals)),this.getChainTokenService(a.token.chainSymbol,a.owner,i).approve(this.prepareApproveParams(a))}async buildRawTransactionApprove(i,a){return i.amount&&(V(i.amount),H("amount",i.amount,i.token.decimals)),this.getChainTokenService(i.token.chainSymbol,i.owner,a).buildRawTransactionApprove(this.prepareApproveParams(i))}async getTokenBalance(i,a){let o=await this.getChainTokenService(i.token.chainSymbol,i.account,a).getTokenBalance(i);return i.token.decimals?F(o,i.token.decimals).toFixed():o}async getNativeTokenBalance(i,a){let o=await this.getChainTokenService(i.chainSymbol,i.account,a).getNativeTokenBalance(i);return{int:o,float:F(o,X.getChainDecimalsByType(X.getChainProperty(i.chainSymbol).chainType)).toFixed()}}getChainTokenService(i,a,o){switch(X.getChainProperty(i).chainType){case"EVM":{if(o)return new gn(o,this.api);{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i);return new gn(new ld(s),this.api)}}case"TRX":{if(o)return new cn(o,this.api);{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i),d=new cd({fullHost:s});return d.setAddress(a),new cn(d,this.api)}}case"SOLANA":{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i);return new vi(s,this.api)}case"SRB":return new Yi(this.nodeRpcUrlsConfig,this.params,this.api);case"SUI":return new Ri(this.nodeRpcUrlsConfig.getNodeRpcUrl(i),this.api);case"ALG":if(o){let s=o,d=xo.fromClients({algod:s});return new An(d,this.api)}else{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i),d=xo.fromConfig({algodConfig:{server:s}});return new An(d,this.api)}}}prepareCheckAllowanceParams(i){return{...i,amount:f(i.amount,i.token.decimals)}}prepareApproveParams(i){return{tokenAddress:i.token.tokenAddress,owner:i.owner,spender:i.spender,chainSymbol:i.token.chainSymbol,amount:i.amount==null?void 0:gd(i.amount).toFixed()}}};var Wi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a;let o=new St(a),s=new Mt(o),d=new Ht(s),A=new Pt(d);this.api=new Lt(A,a),this.tokenService=new jt(this.api,i,a)}api;tokenService;buildRawTransactionApprove(i,a){return this.tokenService.buildRawTransactionApprove(i,a)}checkAllowance(i,a){return this.tokenService.checkAllowance(i,a)}getAllowance(i,a){return this.tokenService.getAllowance(i,a)}};import{Connection as ud,PublicKey as md,TransactionMessage as pd}from"@solana/web3.js";var Bi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a}async addMemoToTx(i,a){if(a.length>28)throw new I("InvalidArgumentException memo cannot be more than 28 characters");let o=new ud(this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"),"confirmed"),s=await ct(i,o),d=pd.decompile(i.message,{addressLookupTableAccounts:s}),A=d.instructions[d.instructions.length-1];if(!A?.keys)throw new I("Last instruction or its keys are invalid.");A.keys.push({pubkey:new md(Buffer.from(a)),isSigner:!1,isWritable:!1}),i.message=d.compileToV0Message(s)}};import{Asset as bd,BASE_FEE as yd,contract as GW,Horizon as Oo,Operation as hd,Operation as vd,rpc as un,TimeoutInfinite as Yd,TransactionBuilder as ma,TransactionBuilder as Qo}from"@stellar/stellar-sdk";import{contract as e}from"@stellar/stellar-sdk";var Cd=e.Spec,Id=e.Client;var ln=class extends Id{constructor(a){super(new Cd(["AAAAAAAAAYlSZXR1cm5zIHRoZSBhbGxvd2FuY2UgZm9yIGBzcGVuZGVyYCB0byB0cmFuc2ZlciBmcm9tIGBmcm9tYC4KClRoZSBhbW91bnQgcmV0dXJuZWQgaXMgdGhlIGFtb3VudCB0aGF0IHNwZW5kZXIgaXMgYWxsb3dlZCB0byB0cmFuc2ZlcgpvdXQgb2YgZnJvbSdzIGJhbGFuY2UuIFdoZW4gdGhlIHNwZW5kZXIgdHJhbnNmZXJzIGFtb3VudHMsIHRoZSBhbGxvd2FuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQgdHJhbnNmZXJlZC4KCiMgQXJndW1lbnRzCgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHRvIGJlIGRyYXduIGZyb20uCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3Mgc3BlbmRpbmcgdGhlIHRva2VucyBoZWxkIGJ5IGBmcm9tYC4AAAAAAAAJYWxsb3dhbmNlAAAAAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAEAAAAL","AAAAAAAAAIlSZXR1cm5zIHRydWUgaWYgYGlkYCBpcyBhdXRob3JpemVkIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBmb3Igd2hpY2ggdG9rZW4gYXV0aG9yaXphdGlvbiBpcyBiZWluZyBjaGVja2VkLgAAAAAAAAphdXRob3JpemVkAAAAAAABAAAAAAAAAAJpZAAAAAAAEwAAAAEAAAAB","AAAAAAAAA55TZXQgdGhlIGFsbG93YW5jZSBieSBgYW1vdW50YCBmb3IgYHNwZW5kZXJgIHRvIHRyYW5zZmVyL2J1cm4gZnJvbQpgZnJvbWAuCgpUaGUgYW1vdW50IHNldCBpcyB0aGUgYW1vdW50IHRoYXQgc3BlbmRlciBpcyBhcHByb3ZlZCB0byB0cmFuc2ZlciBvdXQgb2YKZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byB0cmFuc2ZlciBhbW91bnRzLCBhbmQKd2hlbiBhbiBhbW91bnQgaXMgdHJhbnNmZXJyZWQgdGhlIGFsbG93YW5jZSB3aWxsIGJlIHJlZHVjZWQgYnkgdGhlCmFtb3VudCB0cmFuc2ZlcmVkLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgdG8gYmUgZHJhd24gZnJvbS4KKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBiZWluZyBhdXRob3JpemVkIHRvIHNwZW5kIHRoZSB0b2tlbnMgaGVsZCBieQpgZnJvbWAuCiogYGFtb3VudGAgLSBUaGUgdG9rZW5zIHRvIGJlIG1hZGUgYXZhaWxhYmxlIHRvIGBzcGVuZGVyYC4KKiBgZXhwaXJhdGlvbl9sZWRnZXJgIC0gVGhlIGxlZGdlciBudW1iZXIgd2hlcmUgdGhpcyBhbGxvd2FuY2UgZXhwaXJlcy4gQ2Fubm90CmJlIGxlc3MgdGhhbiB0aGUgY3VycmVudCBsZWRnZXIgbnVtYmVyIHVubGVzcyB0aGUgYW1vdW50IGlzIGJlaW5nIHNldCB0byAwLgpBbiBleHBpcmVkIGVudHJ5ICh3aGVyZSBleHBpcmF0aW9uX2xlZGdlciA8IHRoZSBjdXJyZW50IGxlZGdlciBudW1iZXIpCnNob3VsZCBiZSB0cmVhdGVkIGFzIGEgMCBhbW91bnQgYWxsb3dhbmNlLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImFwcHJvdmUiLCBmcm9tOiBBZGRyZXNzLApzcGVuZGVyOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6IGkxMjgsIGV4cGlyYXRpb25fbGVkZ2VyOiB1MzJdYAAAAAAAB2FwcHJvdmUAAAAABAAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAABFleHBpcmF0aW9uX2xlZGdlcgAAAAAAAAQAAAAA","AAAAAAAAAJhSZXR1cm5zIHRoZSBiYWxhbmNlIG9mIGBpZGAuCgojIEFyZ3VtZW50cwoKKiBgaWRgIC0gVGhlIGFkZHJlc3MgZm9yIHdoaWNoIGEgYmFsYW5jZSBpcyBiZWluZyBxdWVyaWVkLiBJZiB0aGUKYWRkcmVzcyBoYXMgbm8gZXhpc3RpbmcgYmFsYW5jZSwgcmV0dXJucyAwLgAAAAdiYWxhbmNlAAAAAAEAAAAAAAAAAmlkAAAAAAATAAAAAQAAAAs=","AAAAAAAAAWRCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLgoKUmVkdWNlcyBmcm9tJ3MgYmFsYW5jZSBieSB0aGUgYW1vdW50LCB3aXRob3V0IHRyYW5zZmVycmluZyB0aGUgYmFsYW5jZQp0byBhbm90aGVyIGhvbGRlcidzIGJhbGFuY2UuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIG9mIHRva2VucyB3aGljaCB3aWxsIGJlCmJ1cm5lZCBmcm9tLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgYnVybmVkLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImJ1cm4iLCBmcm9tOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6CmkxMjhdYAAAAARidXJuAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAtxCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSBvZiBgc3BlbmRlcmAuCgpSZWR1Y2VzIGZyb20ncyBiYWxhbmNlIGJ5IHRoZSBhbW91bnQsIHdpdGhvdXQgdHJhbnNmZXJyaW5nIHRoZSBiYWxhbmNlCnRvIGFub3RoZXIgaG9sZGVyJ3MgYmFsYW5jZS4KClRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byBidXJuIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZSwgaWYKdGhlIGFtb3VudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFsbG93YW5jZSB0aGF0IHRoZSBzcGVuZGVyIGhhcwpvbiB0aGUgZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyJ3MgYWxsb3dhbmNlIG9uIGZyb20ncyBiYWxhbmNlIHdpbGwgYmUKcmVkdWNlZCBieSB0aGUgYW1vdW50LgoKIyBBcmd1bWVudHMKCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3MgYXV0aG9yaXppbmcgdGhlIGJ1cm4sIGFuZCBoYXZpbmcgaXRzIGFsbG93YW5jZQpjb25zdW1lZCBkdXJpbmcgdGhlIGJ1cm4uCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQpidXJuZWQgZnJvbS4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIGJ1cm5lZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJidXJuIiwgZnJvbTogQWRkcmVzc10sIGRhdGEgPSBbYW1vdW50OgppMTI4XWAAAAAJYnVybl9mcm9tAAAAAAAAAwAAAAAAAAAHc3BlbmRlcgAAAAATAAAAAAAAAARmcm9tAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==","AAAAAAAAAVNDbGF3YmFjayBgYW1vdW50YCBmcm9tIGBmcm9tYCBhY2NvdW50LiBgYW1vdW50YCBpcyBidXJuZWQgaW4gdGhlCmNsYXdiYWNrIHByb2Nlc3MuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIGZyb20gd2hpY2ggdGhlIGNsYXdiYWNrIHdpbGwKdGFrZSB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSBjbGF3ZWQgYmFjay4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJjbGF3YmFjayIsIGFkbWluOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAACGNsYXdiYWNrAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAIBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgdXNlZCB0byByZXByZXNlbnQgYW1vdW50cyBvZiB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAhkZWNpbWFscwAAAAAAAAABAAAABA==","AAAAAAAAAPVNaW50cyBgYW1vdW50YCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgbWludGVkIHRva2Vucy4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIG1pbnRlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJtaW50IiwgYWRtaW46IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwgZGF0YQo9IFthbW91bnQ6IGkxMjhdYAAAAAAAAARtaW50AAAAAgAAAAAAAAACdG8AAAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAFlSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAAAAARuYW1lAAAAAAAAAAEAAAAQ","AAAAAAAAAQxTZXRzIHRoZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBgbmV3X2FkbWluYC4KCiMgQXJndW1lbnRzCgoqIGBuZXdfYWRtaW5gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCBoZW5jZWZvcnRoIGJlIHRoZSBhZG1pbmlzdHJhdG9yCm9mIHRoaXMgdG9rZW4gY29udHJhY3QuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2FkbWluIiwgYWRtaW46IEFkZHJlc3NdLCBkYXRhID0KW25ld19hZG1pbjogQWRkcmVzc11gAAAACXNldF9hZG1pbgAAAAAAAAEAAAAAAAAACW5ld19hZG1pbgAAAAAAABMAAAAA","AAAAAAAAAEZSZXR1cm5zIHRoZSBhZG1pbiBvZiB0aGUgY29udHJhY3QuCgojIFBhbmljcwoKSWYgdGhlIGFkbWluIGlzIG5vdCBzZXQuAAAAAAAFYWRtaW4AAAAAAAAAAAAAAQAAABM=","AAAAAAAAAVBTZXRzIHdoZXRoZXIgdGhlIGFjY291bnQgaXMgYXV0aG9yaXplZCB0byB1c2UgaXRzIGJhbGFuY2UuIElmCmBhdXRob3JpemVkYCBpcyB0cnVlLCBgaWRgIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBiZWluZyAoZGUtKWF1dGhvcml6ZWQuCiogYGF1dGhvcml6ZWAgLSBXaGV0aGVyIG9yIG5vdCBgaWRgIGNhbiB1c2UgaXRzIGJhbGFuY2UuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2F1dGhvcml6ZWQiLCBpZDogQWRkcmVzc10sIGRhdGEgPQpbYXV0aG9yaXplOiBib29sXWAAAAAOc2V0X2F1dGhvcml6ZWQAAAAAAAIAAAAAAAAAAmlkAAAAAAATAAAAAAAAAAlhdXRob3JpemUAAAAAAAABAAAAAA==","AAAAAAAAAFtSZXR1cm5zIHRoZSBzeW1ib2wgZm9yIHRoaXMgdG9rZW4uCgojIFBhbmljcwoKSWYgdGhlIGNvbnRyYWN0IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuAAAAAAZzeW1ib2wAAAAAAAAAAAABAAAAEA==","AAAAAAAAAWRUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQp3aXRoZHJhd24gZnJvbS4KKiBgdG9gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSB0cmFuc2ZlcnJlZCB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSB0cmFuc2ZlcnJlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJ0cmFuc2ZlciIsIGZyb206IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwKZGF0YSA9IFthbW91bnQ6IGkxMjhdYAAAAAh0cmFuc2ZlcgAAAAMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==","AAAAAAAAAzNUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSB0aGF0CmBzcGVuZGVyYCBoYXMgb24gYGZyb21gJ3MgYmFsYW5jZS4gQXV0aG9yaXplZCBieSBzcGVuZGVyCihgc3BlbmRlci5yZXF1aXJlX2F1dGgoKWApLgoKVGhlIHNwZW5kZXIgd2lsbCBiZSBhbGxvd2VkIHRvIHRyYW5zZmVyIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZQppZiB0aGUgYW1vdW50IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYWxsb3dhbmNlIHRoYXQgdGhlIHNwZW5kZXIKaGFzIG9uIHRoZSBmcm9tJ3MgYmFsYW5jZS4gVGhlIHNwZW5kZXIncyBhbGxvd2FuY2Ugb24gZnJvbSdzIGJhbGFuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQuCgojIEFyZ3VtZW50cwoKKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBhdXRob3JpemluZyB0aGUgdHJhbnNmZXIsIGFuZCBoYXZpbmcgaXRzCmFsbG93YW5jZSBjb25zdW1lZCBkdXJpbmcgdGhlIHRyYW5zZmVyLgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHdoaWNoIHdpbGwgYmUKd2l0aGRyYXduIGZyb20uCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgdHJhbnNmZXJyZWQgdG9rZW5zLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgdHJhbnNmZXJyZWQuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsidHJhbnNmZXIiLCBmcm9tOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAADXRyYW5zZmVyX2Zyb20AAAAAAAAEAAAAAAAAAAdzcGVuZGVyAAAAABMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA=="]),a);this.options=a}fromJSON={allowance:this.txFromJSON,authorized:this.txFromJSON,approve:this.txFromJSON,balance:this.txFromJSON,burn:this.txFromJSON,burn_from:this.txFromJSON,clawback:this.txFromJSON,decimals:this.txFromJSON,mint:this.txFromJSON,name:this.txFromJSON,set_admin:this.txFromJSON,admin:this.txFromJSON,set_authorized:this.txFromJSON,symbol:this.txFromJSON,transfer:this.txFromJSON,transfer_from:this.txFromJSON}};var Rd=100,Wd=180,Zi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a}async buildChangeTrustLineXdrTx(i){let o=await new Oo.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")).loadAccount(i.sender),d=await this.getContract(ln,i.tokenAddress).name();if(Nt(d))throw new I;let A=ft(d);if(!A)throw new I;let[g,c]=A.split(":");if(g===void 0||c===void 0)throw new I("Invalid token name format. Expected format 'symbol:srbTokenAddress'");let l=new bd(g,c),u=vd.changeTrust({asset:l,limit:i.limit});return new Qo(o,{fee:Rd.toString(10),networkPassphrase:this.params.sorobanNetworkPassphrase}).addOperation(u).setTimeout(Wd).build().toXDR()}async getBalanceLine(i,a){let s=await this.getContract(ln,a).name();if(Nt(s))throw new I;let d=ft(s);if(!d)throw new I;let[A,g]=d.split(":"),c=this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR");return(await new Oo.Server(c).loadAccount(i)).balances.find(p=>(p.asset_type==="credit_alphanum4"||p.asset_type==="credit_alphanum12")&&p.asset_code==A&&p.asset_issuer==g)}async submitTransactionStellar(i){let a=new Oo.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),o=Qo.fromXDR(i,this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR"));return await a.submitTransaction(o)}async simulateAndCheckRestoreTxRequiredSoroban(i,a){let o=new un.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),s=await o.getAccount(a),d=ma.fromXDR(i,this.params.sorobanNetworkPassphrase),A=await o.simulateTransaction(d);if(un.Api.isSimulationRestore(A))return new ma(s,{fee:(+yd+ +A.restorePreamble.minResourceFee).toString(),networkPassphrase:this.params.sorobanNetworkPassphrase}).setSorobanData(A.restorePreamble.transactionData.build()).addOperation(hd.restoreFootprint({})).setTimeout(Yd).build().toXDR()}async sendTransactionSoroban(i){let a=new un.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),o=ma.fromXDR(i,this.params.sorobanNetworkPassphrase);return a.sendTransaction(o)}async confirmTx(i,a=15){let o=new un.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),s=await Ia(()=>o.getTransaction(i),A=>A.status===un.Api.GetTransactionStatus.NOT_FOUND,a);if(s.length===0)throw new I("No transaction responses found.");let d=s[s.length-1];if(!d)throw new I("Unexpected error: last response is undefined.");return d}getContract(i,a){let o={contractId:a,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new i(o)}};var Gi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.api=a}_suiBridgeService;async buildSendTxFromCustomTx(i,a,o){return this.suiBridgeService.buildRawTransactionSendFromCustomTx(i,a,o)}get suiBridgeService(){return this._suiBridgeService||(this._suiBridgeService=new Gt(this.nodeRpcUrlsConfig,this.api)),this._suiBridgeService}};var Fi=class{constructor(i){this.service=i;this.srb=new Zi(i.nodeRpcUrlsConfig,i.params),this.sol=new Bi(i.nodeRpcUrlsConfig,i.params),this.sui=new Gi(i.nodeRpcUrlsConfig,i.api),this.evm=new Wi(i.nodeRpcUrlsConfig,i.params),this.alg=new Ii(i.nodeRpcUrlsConfig)}srb;sol;sui;evm;alg};var $e=(a=>(a.WITH_NATIVE_CURRENCY="native",a.WITH_STABLECOIN="stablecoin",a))($e||{}),fn=(a=>(a.INT="int",a.FLOAT="float",a))(fn||{});import{Big as ee}from"big.js";var mn=class{constructor(i){this.nodeRpcUrls=i}getNodeRpcUrl(i){let a=this.nodeRpcUrls[i];if(a!==void 0)return a;throw new hn(i)}},fi=class{constructor(i,a=Cn){this.nodeRpcUrlsConfig=i;X.addChainsProperties(a.additionalChainsProperties);let o=new St(a),s=new Mt(o),d=new Ht(s),A=new Pt(d);this.api=new Lt(A,a),this.tokenService=new jt(this.api,i,a),this.bridge=new Qn(this.api,i,a,this.tokenService),this.pool=new li(this.api,i,a,this.tokenService),this.yield=new Ci(this.api,i,a,this.tokenService),this.params=a}api;tokenService;params;bridge;pool;yield;async chainDetailsMap(i){return this.api.getChainDetailsMap(i)}async tokens(i){return this.api.tokens(i)}async tokensByChain(i,a){let s=(await this.api.getChainDetailsMap(a))[i];return s?s.tokens:[]}async getTransferStatus(i,a){return this.api.getTransferStatus(i,a)}async getGasBalance(i,a){return this.api.getGasBalance(i,a)}async checkAddress(){return new Promise(i=>{i({status:"OK",gasBalance:null})})}async getPendingStatusInfo(i,a,o,s){V(i);let d;a=="float"?(H("amount",i,o.decimals),d=f(i,o.decimals).toFixed()):d=i;let A=je(d,o,await $(this.api,o)),g=await $(this.api,s),c=this.getAmountFromVUsdFormatted(A,s,g),l,u=await this.api.getPendingInfo();for(let m in u[s.chainSymbol]){let p=u[s.chainSymbol];if(!p)throw new I("Cannot find pending info for "+s.chainSymbol);l=p[m]}if(l){let m=ba(l.totalSentAmount,g),p=this.getAmountFromVUsdFormatted(A,s,m),b;return ee(p.int).gt(c.int)?b={min:c,max:p}:b={min:p,max:c},{pendingTxs:l.pendingTxs,pendingAmount:{int:Re(l.totalSentAmount,3,s.decimals).toFixed(0),float:F(l.totalSentAmount,3).toFixed()},estimatedAmount:b}}return{pendingTxs:0,pendingAmount:{int:"0",float:"0"},estimatedAmount:{min:c,max:c}}}async getTokenBalance(i,a){return this.tokenService.getTokenBalance(i,a)}async getNativeTokenBalance(i,a){return this.tokenService.getNativeTokenBalance(i,a)}async calculateFeePercentOnSourceChain(i,a){V(i),H("amountFloat",i,a.decimals);let o=f(i,a.decimals);if(o.eq(0))return 0;let s=je(o,a,await $(this.api,a)),d=be(s,a.decimals);return Si(o,d)}async calculateFeePercentOnDestinationChain(i,a,o){V(i),H("amountFloat",i,a.decimals);let s=f(i,a.decimals);if(s.eq(0))return 0;let d=je(s,a,await $(this.api,a)),A=Ot(d,o,await $(this.api,o)),g=be(d,o.decimals);return Si(g,A)}async getAmountToBeReceivedAndGasFeeOptions(i,a,o,s){return V(i),H("amountToSendFloat",i,a.decimals),{amountToSendFloat:ee(i).toFixed(),amountToBeReceivedFloat:await this.getAmountToBeReceived(i,a,o,s),gasFeeOptions:await this.getGasFeeOptions(a,o,s)}}async getAmountToSendAndGasFeeOptions(i,a,o,s){return V(i),H("amountToBeReceivedFloat",i,o.decimals),{amountToSendFloat:await this.getAmountToSend(i,a,o,s),amountToBeReceivedFloat:ee(i).toFixed(),gasFeeOptions:await this.getGasFeeOptions(a,o,s)}}async getAmountToBeReceived(i,a,o,s){return this.getAmountToBeReceivedCompute(i,a,o,s,async()=>await $(this.api,a),async()=>await $(this.api,o))}async getAmountToBeReceivedFromChain(i,a,o,s,d,A){return this.getAmountToBeReceivedCompute(i,a,o,s,async()=>await this.pool.getPoolInfoFromChain(a,d),async()=>await this.pool.getPoolInfoFromChain(o,A))}async getAmountToBeReceivedCompute(i,a,o,s=1,d,A){switch(s){case 1:case 2:return this.getAmountToBeReceivedComputeWithPools(i,a,o,await d(),await A());case 3:case 4:return this.getAmountToBeReceivedComputeCctp(i,a,o,s);case 5:return this.getAmountToBeReceivedComputeOft(i,a,o)}}getAmountToBeReceivedComputeWithPools(i,a,o,s,d){V(i),H("amountToSendFloat",i,a.decimals);let A=f(i,a.decimals),g=je(A,a,s);return this.getAmountFromVUsdFormatted(g,o,d).float}getAmountToBeReceivedComputeCctp(i,a,o,s){V(i),H("amountToSendFloat",i,a.decimals);let d=f(i,a.decimals);switch(s){case 3:{if(!a.cctpAddress||!o.cctpAddress||!a.cctpFeeShare)throw new se("Such route does not support CCTP protocol");let A=d.mul(ee(1).minus(a.cctpFeeShare)).round(0,ee.roundUp),g=Re(A,a.decimals,o.decimals).round(0);return F(g,o.decimals).toFixed()}case 4:{if(!a.cctpV2Address||!o.cctpV2Address||!a.cctpV2FeeShare)throw new se("Such route does not support CCTP V2 protocol");let A=d.mul(ee(1).minus(a.cctpV2FeeShare)).round(0,ee.roundUp),g=Re(A,a.decimals,o.decimals).round(0);return F(g,o.decimals).toFixed()}}}async getAmountToBeReceivedComputeOft(i,a,o){V(i),H("amountToSendFloat",i,a.decimals);let s=f(i,a.decimals);if(!a.oftBridgeAddress||!o.oftBridgeAddress||a.oftId!==o.oftId)throw new de("Such route does not support OFT protocol");let{adminFeeShareWithExtras:d}=await this.api.getReceiveTransactionCost({sourceChainId:a.allbridgeChainId,destinationChainId:o.allbridgeChainId,messenger:5,sourceToken:a.tokenAddress});if(!d)throw new de("Such route does not support OFT protocol");let A=s.mul(ee(1).minus(d)).round(0,ee.roundUp),g=Re(A,a.decimals,o.decimals).round(0);return F(g,o.decimals).toFixed()}async getAmountToSend(i,a,o,s){return this.getAmountToSendCompute(i,a,o,s,()=>$(this.api,a),()=>$(this.api,o))}async getAmountToSendFromChain(i,a,o,s,d,A){return this.getAmountToSendCompute(i,a,o,s,()=>this.pool.getPoolInfoFromChain(a,d),()=>this.pool.getPoolInfoFromChain(o,A))}async getAmountToSendCompute(i,a,o,s=1,d,A){switch(s){case 1:case 2:return this.getAmountToSendComputeWithPools(i,a,o,await d(),await A());case 3:case 4:return this.getAmountToSendComputeCctp(i,a,o,s);case 5:return this.getAmountToSendComputeOft(i,a,o)}}getAmountToSendComputeWithPools(i,a,o,s,d){V(i),H("amountToBeReceivedFloat",i,o.decimals);let A=f(i,o.decimals),g=ha(A,o,d),c=ya(g,a,s);if(ee(c).lte(0))throw new Ke;return F(c,a.decimals).toFixed()}getAmountToSendComputeCctp(i,a,o,s){V(i),H("amountToBeReceivedFloat",i,o.decimals);let d=f(i,o.decimals);switch(s){case 3:{if(!a.cctpAddress||!o.cctpAddress||!a.cctpFeeShare)throw new se("Such route does not support CCTP protocol");let A=d.div(ee(1).minus(a.cctpFeeShare)).round(0,ee.roundDown),g=Re(A,o.decimals,a.decimals).round(0);return F(g,a.decimals).toFixed()}case 4:{if(!a.cctpV2Address||!o.cctpV2Address||!a.cctpV2FeeShare)throw new se("Such route does not support CCTP V2 protocol");let A=d.div(ee(1).minus(a.cctpV2FeeShare)).round(0,ee.roundDown),g=Re(A,o.decimals,a.decimals).round(0);return F(g,a.decimals).toFixed()}}}async getAmountToSendComputeOft(i,a,o){V(i),H("amountToBeReceivedFloat",i,o.decimals);let s=f(i,o.decimals);if(!a.oftId||!o.oftId||!a.oftBridgeAddress||a.oftId!==o.oftId)throw new de("Such route does not support OFT protocol");let{adminFeeShareWithExtras:d}=await this.api.getReceiveTransactionCost({sourceChainId:a.allbridgeChainId,destinationChainId:o.allbridgeChainId,messenger:5,sourceToken:a.tokenAddress});if(!d)throw new de("Such route does not support OFT protocol");let A=s.div(ee(1).minus(d)).round(0,ee.roundDown),g=Re(A,o.decimals,a.decimals).round(0);return F(g,a.decimals).toFixed()}async getGasFeeOptions(i,a,o){return Mi(i,a.allbridgeChainId,o,this.api)}getAverageTransferTime(i,a,o){return i.transferTime?.[a.chainSymbol]?.[o]??null}async getPoolInfoByToken(i){return await this.api.getPoolInfoByKey({chainSymbol:i.chainSymbol,poolAddress:i.poolAddress})}async refreshPoolInfo(i){if(i){let o=(i instanceof Array?i:[i]).map(s=>({chainSymbol:s.chainSymbol,poolAddress:s.poolAddress}));return this.api.refreshPoolInfo(o)}return this.api.refreshPoolInfo()}aprInPercents(i){return Ya(i)}async getExtraGasMaxLimits(i,a,o){return await Hi(i,a,o,this.api)}async getVUsdFromAmount(i,a,o){V(i);let s;a=="float"?(H("amount",i,o.decimals),s=f(i,o.decimals).toFixed()):s=i;let d=je(s,o,await $(this.api,o));return{int:d,float:F(d,3).toFixed()}}async getAmountFromVUsd(i,a){return this.getAmountFromVUsdFormatted(i,a,await $(this.api,a))}getAmountFromVUsdFormatted(i,a,o){V(i);let s=Ot(i,a,o);if(ee(s).lt(0))throw new Ke;return{int:s,float:F(s,a.decimals).toFixed()}}async swapAndBridgeFeeCalculation(i,a,o){return Xo(i,{decimals:a.decimals,feeShare:a.feeShare,poolInfo:await $(this.api,a)},{decimals:o.decimals,feeShare:o.feeShare,poolInfo:await $(this.api,o)})}async swapAndBridgeFeeCalculationReverse(i,a,o){let s=Vo(i,{decimals:a.decimals,feeShare:a.feeShare,poolInfo:await $(this.api,a)},{decimals:o.decimals,feeShare:o.feeShare,poolInfo:await $(this.api,o)}),d=s.swapFromVUsdCalcResult.amountIncludingCommissionInTokenPrecision;if(ee(d).lt(0))throw new Ke;return s}async getSendAmountDetails(i,a,o,s){V(i);let d;return a=="float"?(H("amount",i,o.decimals),d=f(i,o.decimals).toFixed()):d=i,So(d,o,await $(this.api,o),s,await $(this.api,s))}};function Bd(r){return"solanaRpcUrl"in r}var Ko=class{params;bridge;pool;yield;utils;service;constructor(i,a=Cn){let o;Bd(i)?o=new mn({SOL:i.solanaRpcUrl,TRX:i.tronRpcUrl}):o=new mn(i),this.service=new fi(o,a),this.bridge=this.service.bridge,this.pool=this.service.pool,this.yield=this.service.yield,this.utils=new Fi(this.service),this.params=a}async chainDetailsMap(i="swap"){return this.service.chainDetailsMap(i)}async tokens(i="swap"){return this.service.tokens(i)}async tokensByChain(i,a="swap"){return this.service.tokensByChain(i,a)}async getTransferStatus(i,a){return this.service.getTransferStatus(i,a)}async getGasBalance(i,a){return this.service.getGasBalance(i,a)}async checkAddress(i,a,o){return await this.service.checkAddress()}async getPendingStatusInfo(i,a,o,s){return this.service.getPendingStatusInfo(i,a,o,s)}async getTokenBalance(i,a){return this.service.getTokenBalance(i,a)}async getNativeTokenBalance(i,a){return this.service.getNativeTokenBalance(i,a)}async calculateFeePercentOnSourceChain(i,a){return this.service.calculateFeePercentOnSourceChain(i,a)}async calculateFeePercentOnDestinationChain(i,a,o){return this.service.calculateFeePercentOnDestinationChain(i,a,o)}async getAmountToBeReceivedAndGasFeeOptions(i,a,o,s){return this.service.getAmountToBeReceivedAndGasFeeOptions(i,a,o,s)}async getAmountToSendAndGasFeeOptions(i,a,o,s){return this.service.getAmountToSendAndGasFeeOptions(i,a,o,s)}async getAmountToBeReceived(i,a,o,s=1){return this.service.getAmountToBeReceived(i,a,o,s)}async getAmountToBeReceivedFromChain(i,a,o,s=1,d,A){return this.service.getAmountToBeReceivedFromChain(i,a,o,s,d,A)}getAmountToBeReceivedFromPools(i,a,o,s,d,A=1){switch(A){case 1:case 2:return this.service.getAmountToBeReceivedComputeWithPools(i,a,o,s,d);case 3:case 4:return this.service.getAmountToBeReceivedComputeCctp(i,a,o,A)}}async getAmountToSend(i,a,o,s=1){return this.service.getAmountToSend(i,a,o,s)}async getAmountToSendFromChain(i,a,o,s=1,d,A){return this.service.getAmountToSendFromChain(i,a,o,s,d,A)}getAmountToSendFromPools(i,a,o,s,d,A=1){switch(A){case 1:case 2:return this.service.getAmountToSendComputeWithPools(i,a,o,s,d);case 3:case 4:return this.service.getAmountToSendComputeCctp(i,a,o,A)}}async getGasFeeOptions(i,a,o){return this.service.getGasFeeOptions(i,a,o)}getAverageTransferTime(i,a,o){return this.service.getAverageTransferTime(i,a,o)}async getPoolInfoByToken(i){return this.service.getPoolInfoByToken(i)}async refreshPoolInfo(i){return this.service.refreshPoolInfo(i)}aprInPercents(i){return this.service.aprInPercents(i)}async getExtraGasMaxLimits(i,a,o=1){return this.service.getExtraGasMaxLimits(i,a,o)}async getVUsdFromAmount(i,a,o){return this.service.getVUsdFromAmount(i,a,o)}async getAmountFromVUsd(i,a){return this.service.getAmountFromVUsd(i,a)}async swapAndBridgeFeeCalculation(i,a,o){return this.service.swapAndBridgeFeeCalculation(i,a,o)}async swapAndBridgeFeeCalculationReverse(i,a,o){return this.service.swapAndBridgeFeeCalculationReverse(i,a,o)}async getSendAmountDetails(i,a,o,s){return this.service.getSendAmountDetails(i,a,o,s)}};export{Ti as AddressStatus,Ko as AllbridgeCoreSdk,fn as AmountFormat,It as AmountNotEnoughError,yn as ArgumentInvalidDecimalsError,se as CCTPDoesNotSupportedError,Ie as ChainSymbol,z as ChainType,nr as ErrorCode,bn as ExtraGasMaxLimitExceededError,$e as FeePaymentMethod,Ke as InsufficientPoolLiquidityError,Qe as InvalidAmountError,Jt as InvalidGasFeePaymentOptionError,In as InvalidMessengerOptionError,bt as InvalidTxError,ie as JupiterError,Ye as Messenger,k as MethodNotSupportedError,hn as NodeRpcUrlNotInitializedError,de as OFTDoesNotSupportedError,I as SdkError,K as SdkRootError,Ji as SolanaAutoTxFee,zt as TimeoutError,Yn as TxTooLargeError,kt as VerifyTxError,vn as YieldDoesNotSupportedError,Vs as assertYieldIsSupported,pi as isYieldSupported,Cn as mainnet,Fd as nodeRpcUrlsDefault,Gd as nodeUrlsDefault};
6
+ Y - is value of virtual usd`,networks:{},state:{schema:{global:{ints:15,bytes:4},local:{ints:2,bytes:0}},keys:{global:{feeShareBP:{keyType:"AVMString",valueType:"AVMUint64",key:"ZmVlU2hhcmVCUA=="},router:{keyType:"AVMString",valueType:"address",key:"cm91dGVy"},tokenBalance:{keyType:"AVMString",valueType:"AVMUint64",key:"dG9rZW5CYWxhbmNl"},vUsdBalance:{keyType:"AVMString",valueType:"AVMUint64",key:"dlVzZEJhbGFuY2U="},balanceRatioMinBP:{keyType:"AVMString",valueType:"AVMUint64",key:"YmFsYW5jZVJhdGlvTWluQlA="},reserves:{keyType:"AVMString",valueType:"AVMUint64",key:"cmVzZXJ2ZXM="},a:{keyType:"AVMString",valueType:"AVMUint64",key:"YQ=="},d:{keyType:"AVMString",valueType:"AVMUint64",key:"ZA=="},tokenAmountReduce:{keyType:"AVMString",valueType:"AVMUint64",key:"dG9rZW5BbW91bnRSZWR1Y2U="},tokenAmountIncrease:{keyType:"AVMString",valueType:"AVMUint64",key:"dG9rZW5BbW91bnRJbmNyZWFzZQ=="},stopAuthority:{keyType:"AVMString",valueType:"address",key:"c3RvcEF1dGhvcml0eQ=="},canDeposit:{keyType:"AVMString",valueType:"AVMUint64",key:"Y2FuRGVwb3NpdA=="},canWithdraw:{keyType:"AVMString",valueType:"AVMUint64",key:"Y2FuV2l0aGRyYXc="},asset:{keyType:"AVMString",valueType:"AVMUint64",key:"YXNzZXQ="},adminFeeShareBP:{keyType:"AVMString",valueType:"AVMUint64",key:"YWRtaW5GZWVTaGFyZUJQ"},totalSupply:{keyType:"AVMString",valueType:"AVMUint64",key:"dG90YWxTdXBwbHk="},accRewardPerShareP:{keyType:"AVMString",valueType:"AVMBytes",key:"YWNjUmV3YXJkUGVyU2hhcmVQ"},adminFeeAmount:{keyType:"AVMString",valueType:"AVMUint64",key:"YWRtaW5GZWVBbW91bnQ="},owner:{keyType:"AVMString",valueType:"address",key:"b3duZXI="}},local:{balance:{keyType:"AVMString",valueType:"AVMUint64",key:"YmFsYW5jZQ=="},userRewardDebt:{keyType:"AVMString",valueType:"AVMUint64",key:"dXNlclJld2FyZERlYnQ="}},box:{}},maps:{global:{},local:{},box:{}}},bareActions:{create:[],call:[]},sourceInfo:{approval:{sourceInfo:[{pc:[1446],errorMessage:'"Pool: withdraw prohibited'},{pc:[1249],errorMessage:"Asset must go to app"},{pc:[1232],errorMessage:"Asset txn missing"},{pc:[1270],errorMessage:"CloseTo not allowed"},{pc:[514,529,553,577,589,605,617,632,647,659,671,683,695,711,723,739,773,803,819,831,840,865],errorMessage:"OnCompletion is not NoOp"},{pc:[853],errorMessage:"OnCompletion is not OptIn"},{pc:[3306],errorMessage:"Only owner"},{pc:[1216],errorMessage:"Pool: deposit prohibited"},{pc:[1141],errorMessage:"Pool: is not stopAuthority"},{pc:[1206],errorMessage:"Pool: low token balance"},{pc:[1182],errorMessage:"Pool: low vUSD balance"},{pc:[1131],errorMessage:"Pool: only router"},{pc:[1701,1983],errorMessage:"Pool: reserves"},{pc:[2027],errorMessage:"Pool: slippage"},{pc:[2116,2175],errorMessage:"Pool: too large"},{pc:[1280],errorMessage:"Pool: too little"},{pc:[1369],errorMessage:"Pool: too much"},{pc:[1723],errorMessage:"Pool: zero D changes"},{pc:[1693],errorMessage:"Pool: zero changes"},{pc:[1263],errorMessage:"Rekey not allowed"},{pc:[1468],errorMessage:"RewardManager: not enough amount"},{pc:[2994],errorMessage:"RewardManager: too high"},{pc:[1256],errorMessage:"Wrong asset"},{pc:[984],errorMessage:"asset exists"},{pc:[869],errorMessage:"can only call when creating"},{pc:[517,532,556,580,592,608,620,635,650,662,674,686,698,714,726,742,776,806,822,834,843,856],errorMessage:"can only call when not creating"},{pc:[977,1080,1129,1139,1153,1163,1180,1204,1215,1225,1229,1284,1298,1308,1326,1336,1350,1360,1374,1412,1445,1451,1476,1531,1563,1614,1618,1624,1660,1686,1690,1697,1705,1719,1728,1775,1805,1815,1823,1833,1841,1870,1929,1939,1955,1976,1987,2002,2032,2066,2137,2148,2251,2260,2408,2413,2421,2529,2537,2578,2586,2917,2954,3015,3023,3028,3064,3092,3100,3118,3138,3152,3216,3250,3304],errorMessage:"check GlobalState exists"},{pc:[1463,1500,1516,2906,2934,3058,3078,3164,3186,3201],errorMessage:"check LocalState exists"},{pc:[2626],errorMessage:"n must be non-negative"},{pc:[1395,1426,1642,1674],errorMessage:"overflow"},{pc:[1242],errorMessage:"transaction type is axfer"}],pcOffsetMethod:"none"},clear:{sourceInfo:[],pcOffsetMethod:"none"}},source:{approval:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNCAxMDAwMAogICAgYnl0ZWNibG9jayAidG9rZW5CYWxhbmNlIiAidlVzZEJhbGFuY2UiICJhc3NldCIgInJlc2VydmVzIiAiYmFsYW5jZSIgInVzZXJSZXdhcmREZWJ0IiAiZCIgInRvdGFsU3VwcGx5IiAiYWNjUmV3YXJkUGVyU2hhcmVQIiAweDAxMDAwMDAwMDAwMDAwIDB4MDEgImFkbWluRmVlQW1vdW50IiAiY2FuRGVwb3NpdCIgImNhbldpdGhkcmF3IiAib3duZXIiICJmZWVTaGFyZUJQIiAiYmFsYW5jZVJhdGlvTWluQlAiIDB4MDIgImFkbWluRmVlU2hhcmVCUCIgMHgxNTFmN2M3NSAiYSIgInJvdXRlciIgInN0b3BBdXRob3JpdHkiICJ0b2tlbkFtb3VudFJlZHVjZSIgInRva2VuQW1vdW50SW5jcmVhc2UiIDB4YmE4MTgwNzYgMHgwMyAweDAxMDAwMDAwMDAwMDAwMDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI4CiAgICAvLyBhZG1pbkZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBCUCAvIDUgfSk7IC8vIERlZmF1bHQgYWRtaW4gZmVlIGlzIDIwJQogICAgYnl0ZWMgMTggLy8gImFkbWluRmVlU2hhcmVCUCIKICAgIHB1c2hpbnQgMjAwMCAvLyAyMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIHJlc2VydmVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NgogICAgLy8gZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA2IC8vICJkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY2FuRGVwb3NpdCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEyIC8vICJjYW5EZXBvc2l0IgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDMxCiAgICBwdXNoYnl0ZXNzIDB4NTE2ZDM0N2IgMHgwMWEzYTNmZiAweDc2MTBhNDYwIDB4ZTgzYTg3YWIgMHg5MmUwM2IxYyAweDIxZjFkZGZmIDB4ZDk3OGFkMTQgMHgwZDFiNGMwNiAweDc1YmY5YTI4IDB4ZjQ5M2Q3ZWQgMHg4ZDVjYjZkZiAweGZlMDRhNWNlIDB4MDI4ZTA4NTkgMHg0MWZjOTY2ZSAweGFiZjIwMDE0IDB4MDRiMTYxZjEgMHg2NjU5MWNjZiAweGE1YWU2YmQxIDB4YTA0YzViYzQgMHgzNjFiNjE1OSAweDMyYmJiMDExIDB4Yjg3NzllZTcgMHhlMTdiYWZiNCAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Ub0FwcGxpY2F0aW9uKCl2b2lkIiwgbWV0aG9kICJvcHRJbkFzc2V0KCl2b2lkIiwgbWV0aG9kICJub29wKCl2b2lkIiwgbWV0aG9kICJkZXBvc2l0KCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhdyh1aW50NjQpdm9pZCIsIG1ldGhvZCAic3dhcFRvVlVzZChhZGRyZXNzLHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAic3dhcEZyb21WVXNkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0RmVlU2hhcmUodWludDY0KXZvaWQiLCBtZXRob2QgImFkanVzdFRvdGFsTHBBbW91bnQoKXZvaWQiLCBtZXRob2QgInNldEJhbGFuY2VSYXRpb01pbkJQKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzdG9wRGVwb3NpdCgpdm9pZCIsIG1ldGhvZCAic3RhcnREZXBvc2l0KCl2b2lkIiwgbWV0aG9kICJzdG9wV2l0aGRyYXcoKXZvaWQiLCBtZXRob2QgInN0YXJ0V2l0aGRyYXcoKXZvaWQiLCBtZXRob2QgInNldFN0b3BBdXRob3JpdHkoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJzZXRSb3V0ZXIoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJjbGFpbVJld2FyZHMoKXZvaWQiLCBtZXRob2QgInNldEFkbWluRmVlU2hhcmUodWludDY0KXZvaWQiLCBtZXRob2QgImNsYWltQWRtaW5GZWUoKXZvaWQiLCBtZXRob2QgInBlbmRpbmdSZXdhcmQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgImRlY2ltYWxzKCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyT3duZXJzaGlwKGFkZHJlc3Mpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlQXBwbGljYXRpb25fcm91dGVANSBtYWluX29wdEluVG9BcHBsaWNhdGlvbl9yb3V0ZUA2IG1haW5fb3B0SW5Bc3NldF9yb3V0ZUA3IG1haW5fbm9vcF9yb3V0ZUA4IG1haW5fZGVwb3NpdF9yb3V0ZUA5IG1haW5fd2l0aGRyYXdfcm91dGVAMTAgbWFpbl9zd2FwVG9WVXNkX3JvdXRlQDExIG1haW5fc3dhcEZyb21WVXNkX3JvdXRlQDEyIG1haW5fc2V0RmVlU2hhcmVfcm91dGVAMTMgbWFpbl9hZGp1c3RUb3RhbExwQW1vdW50X3JvdXRlQDE0IG1haW5fc2V0QmFsYW5jZVJhdGlvTWluQlBfcm91dGVAMTUgbWFpbl9zdG9wRGVwb3NpdF9yb3V0ZUAxNiBtYWluX3N0YXJ0RGVwb3NpdF9yb3V0ZUAxNyBtYWluX3N0b3BXaXRoZHJhd19yb3V0ZUAxOCBtYWluX3N0YXJ0V2l0aGRyYXdfcm91dGVAMTkgbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDIwIG1haW5fc2V0Um91dGVyX3JvdXRlQDIxIG1haW5fY2xhaW1SZXdhcmRzX3JvdXRlQDIyIG1haW5fc2V0QWRtaW5GZWVTaGFyZV9yb3V0ZUAyMyBtYWluX2NsYWltQWRtaW5GZWVfcm91dGVAMjQgbWFpbl9wZW5kaW5nUmV3YXJkX3JvdXRlQDI1IG1haW5fZGVjaW1hbHNfcm91dGVAMjYgbWFpbl90cmFuc2Zlck93bmVyc2hpcF9yb3V0ZUAyNwoKbWFpbl9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl90cmFuc2Zlck93bmVyc2hpcF9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiB0cmFuc2Zlck93bmVyc2hpcAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9kZWNpbWFsc19yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo5MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwMDAwMDAwMDAwMDAwMwogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BlbmRpbmdSZXdhcmRfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgcGVuZGluZ1Jld2FyZAogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1BZG1pbkZlZV9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xhaW1BZG1pbkZlZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRBZG1pbkZlZVNoYXJlX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0QWRtaW5GZWVTaGFyZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbGFpbVJld2FyZHNfcm91dGVAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsYWltUmV3YXJkcwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRSb3V0ZXJfcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIHNldFJvdXRlcihyb3V0ZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU3CiAgICAvLyBzZXRSb3V0ZXIocm91dGVyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBjYWxsc3ViIHNldFJvdXRlcgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBzZXRTdG9wQXV0aG9yaXR5KHN0b3BBdXRob3JpdHk6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBzZXRTdG9wQXV0aG9yaXR5KHN0b3BBdXRob3JpdHk6IEFkZHJlc3MpOiB2b2lkIHsKICAgIGNhbGxzdWIgc2V0U3RvcEF1dGhvcml0eQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFydFdpdGhkcmF3X3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQ3CiAgICAvLyBzdGFydFdpdGhkcmF3KCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0YXJ0V2l0aGRyYXcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3RvcFdpdGhkcmF3X3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQyCiAgICAvLyBzdG9wV2l0aGRyYXcoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RvcFdpdGhkcmF3CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0YXJ0RGVwb3NpdF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gc3RhcnREZXBvc2l0KCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0YXJ0RGVwb3NpdAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdG9wRGVwb3NpdF9yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzMgogICAgLy8gc3RvcERlcG9zaXQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RvcERlcG9zaXQKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0QmFsYW5jZVJhdGlvTWluQlBfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjYKICAgIC8vIHNldEJhbGFuY2VSYXRpb01pbkJQKGJhbGFuY2VSYXRpb01pbkJQOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBzZXRCYWxhbmNlUmF0aW9NaW5CUChiYWxhbmNlUmF0aW9NaW5CUDogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIHNldEJhbGFuY2VSYXRpb01pbkJQCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FkanVzdFRvdGFsTHBBbW91bnRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIGFkanVzdFRvdGFsTHBBbW91bnQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYWRqdXN0VG90YWxMcEFtb3VudAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRGZWVTaGFyZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIHNldEZlZVNoYXJlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N3YXBGcm9tVlVzZF9yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI1OS0yNjQKICAgIC8vIHN3YXBGcm9tVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICAgemVyb0ZlZTogYm9vbGVhbiwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI1OS0yNjQKICAgIC8vIHN3YXBGcm9tVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICAgemVyb0ZlZTogYm9vbGVhbiwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBjYWxsc3ViIHN3YXBGcm9tVlVzZAogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcFRvVlVzZF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIxMy0yMTcKICAgIC8vIHN3YXBUb1ZVc2QoCiAgICAvLyAgIHVzZXI6IEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICB6ZXJvRmVlOiBib29sZWFuLAogICAgLy8gKTogdWludDY0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjEzLTIxNwogICAgLy8gc3dhcFRvVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgY2FsbHN1YiBzd2FwVG9WVXNkCiAgICBpdG9iCiAgICBieXRlYyAxOSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl93aXRoZHJhd19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHdpdGhkcmF3CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2RlcG9zaXRfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVwb3NpdAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9ub29wX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo5MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3B0SW5Bc3NldF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NzcKICAgIC8vIG9wdEluQXNzZXQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0SW5Bc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcHRJblRvQXBwbGljYXRpb25fcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBvcHRJblRvQXBwbGljYXRpb24oKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzEgLy8gT3B0SW4KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG9wdEluVG9BcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVBcHBsaWNhdGlvbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTUKICAgIC8vIGNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBBZGRyZXNzLCByb3V0ZXI6IEFkZHJlc3MsIGE6IHVpbnQ2NCwgYXNzZXRJZDogdWludDY0LCBmZWVTaGFyZUJQOiB1aW50NjQsIGJhbGFuY2VSYXRpb01pbkJQOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY3JlYXRlQXBwbGljYXRpb24ob3duZXI6IEFkZHJlc3MsIHJvdXRlcjogQWRkcmVzcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6YmlndWludFRvVWludDY0TW9kdWxvKHY6IGJ5dGVzKSAtPiB1aW50NjQ6CmJpZ3VpbnRUb1VpbnQ2NE1vZHVsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyh2OiBiaWd1aW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjI4CiAgICAvLyBjb25zdCBsZW4gPSBvcC5sZW4oYik7CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MjkKICAgIC8vIGNvbnN0IHN0YXJ0OiB1aW50NjQgPSBsZW4gPiA4ID8gKGxlbiAtIDgpIDogMDsKICAgIGludGNfMiAvLyA4CiAgICA+CiAgICBieiBiaWd1aW50VG9VaW50NjRNb2R1bG9fdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18yIC8vIDgKICAgIC0KCmJpZ3VpbnRUb1VpbnQ2NE1vZHVsb190ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzAKICAgIC8vIGNvbnN0IGxhc3Q4ID0gYi5zbGljZShzdGFydCk7ICAgICAgICAgICAvLyBrZWVwIGxlYXN0LXNpZ25pZmljYW50IDggYnl0ZXMKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgPj0KICAgIGRpZyAyCiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzEKICAgIC8vIHJldHVybiBvcC5idG9pKGxhc3Q4KTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHJldHN1YgoKYmlndWludFRvVWludDY0TW9kdWxvX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czoyOQogICAgLy8gY29uc3Qgc3RhcnQ6IHVpbnQ2NCA9IGxlbiA+IDggPyAobGVuIC0gOCkgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGIgYmlndWludFRvVWludDY0TW9kdWxvX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBieXRlcywgcm91dGVyOiBieXRlcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY3JlYXRlQXBwbGljYXRpb24ob3duZXI6IEFkZHJlc3MsIHJvdXRlcjogQWRkcmVzcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gNiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWMgMTQgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6OQogICAgLy8gdGhpcy5vd25lci52YWx1ZSA9IG93bmVyOwogICAgZnJhbWVfZGlnIC02CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzgKICAgIC8vIHRoaXMuYXNzZXQudmFsdWUgPSBBc3NldChhc3NldElkKTsKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyBhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMjAgLy8gImEiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gdGhpcy5hLnZhbHVlID0gYTsKICAgIGZyYW1lX2RpZyAtNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwCiAgICAvLyByb3V0ZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDIxIC8vICJyb3V0ZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1OAogICAgLy8gdGhpcy5yb3V0ZXIudmFsdWUgPSByb3V0ZXI7CiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MQogICAgLy8gcHJpdmF0ZSBzdG9wQXV0aG9yaXR5ID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBieXRlYyAyMiAvLyAic3RvcEF1dGhvcml0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUgPSBvd25lcjsKICAgIGZyYW1lX2RpZyAtNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyBmZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMTUgLy8gImZlZVNoYXJlQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2MAogICAgLy8gdGhpcy5mZWVTaGFyZUJQLnZhbHVlID0gZmVlU2hhcmVCUDsKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE2IC8vICJiYWxhbmNlUmF0aW9NaW5CUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjYxCiAgICAvLyB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlID0gYmFsYW5jZVJhdGlvTWluQlA7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIGNvbnN0IGRlY2ltYWxzID0gdGhpcy5hc3NldC52YWx1ZS5kZWNpbWFsczsKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBTWVNURU1fUFJFQ0lTSU9OOiB1aW50NjQgPSAzOwogICAgcHVzaGludCAzIC8vIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY0CiAgICAvLyB0aGlzLnRva2VuQW1vdW50UmVkdWNlLnZhbHVlID0gZGVjaW1hbHMgPiBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKGRlY2ltYWxzIC0gU1lTVEVNX1BSRUNJU0lPTikgOiAwOwogICAgPgogICAgYnogY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFNZU1RFTV9QUkVDSVNJT046IHVpbnQ2NCA9IDM7CiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjQKICAgIC8vIHRoaXMudG9rZW5BbW91bnRSZWR1Y2UudmFsdWUgPSBkZWNpbWFscyA+IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoZGVjaW1hbHMgLSBTWVNURU1fUFJFQ0lTSU9OKSA6IDA7CiAgICAtCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBzd2FwCiAgICBleHAKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50UmVkdWNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMjMgLy8gInRva2VuQW1vdW50UmVkdWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjQKICAgIC8vIHRoaXMudG9rZW5BbW91bnRSZWR1Y2UudmFsdWUgPSBkZWNpbWFscyA+IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoZGVjaW1hbHMgLSBTWVNURU1fUFJFQ0lTSU9OKSA6IDA7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHRoaXMudG9rZW5BbW91bnRJbmNyZWFzZS52YWx1ZSA9IGRlY2ltYWxzIDwgU1lTVEVNX1BSRUNJU0lPTiA/IDEwICoqIChTWVNURU1fUFJFQ0lTSU9OIC0gZGVjaW1hbHMpIDogMDsKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMAogICAgLy8gY29uc3QgU1lTVEVNX1BSRUNJU0lPTjogdWludDY0ID0gMzsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdGhpcy50b2tlbkFtb3VudEluY3JlYXNlLnZhbHVlID0gZGVjaW1hbHMgPCBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKFNZU1RFTV9QUkVDSVNJT04gLSBkZWNpbWFscykgOiAwOwogICAgPAogICAgYnogY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMAogICAgLy8gY29uc3QgU1lTVEVNX1BSRUNJU0lPTjogdWludDY0ID0gMzsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdGhpcy50b2tlbkFtb3VudEluY3JlYXNlLnZhbHVlID0gZGVjaW1hbHMgPCBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKFNZU1RFTV9QUkVDSVNJT04gLSBkZWNpbWFscykgOiAwOwogICAgZnJhbWVfZGlnIDAKICAgIC0KICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHN3YXAKICAgIGV4cAoKY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgdG9rZW5BbW91bnRJbmNyZWFzZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDI0IC8vICJ0b2tlbkFtb3VudEluY3JlYXNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHRoaXMudG9rZW5BbW91bnRJbmNyZWFzZS52YWx1ZSA9IGRlY2ltYWxzIDwgU1lTVEVNX1BSRUNJU0lPTiA/IDEwICoqIChTWVNURU1fUFJFQ0lTSU9OIC0gZGVjaW1hbHMpIDogMDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfZmFsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY1CiAgICAvLyB0aGlzLnRva2VuQW1vdW50SW5jcmVhc2UudmFsdWUgPSBkZWNpbWFscyA8IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoU1lTVEVNX1BSRUNJU0lPTiAtIGRlY2ltYWxzKSA6IDA7CiAgICBpbnRjXzAgLy8gMAogICAgYiBjcmVhdGVBcHBsaWNhdGlvbl90ZXJuYXJ5X21lcmdlQDYKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY0CiAgICAvLyB0aGlzLnRva2VuQW1vdW50UmVkdWNlLnZhbHVlID0gZGVjaW1hbHMgPiBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKGRlY2ltYWxzIC0gU1lTVEVNX1BSRUNJU0lPTikgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wub3B0SW5Ub0FwcGxpY2F0aW9uKCkgLT4gdm9pZDoKb3B0SW5Ub0FwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjgKICAgIC8vIG9wdEluVG9BcHBsaWNhdGlvbigpOiB2b2lkIHsKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIHN1cGVyLm9wdEluVG9BcHBsaWNhdGlvbihUeG4uc2VuZGVyKTsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQyCiAgICAvLyBpZiAoIXRoaXMuYmFsYW5jZSh0bykuaGFzVmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDIKICAgIC8vIGlmICghdGhpcy5iYWxhbmNlKHRvKS5oYXNWYWx1ZSkgewogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICBibnogb3B0SW5Ub0FwcGxpY2F0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQzCiAgICAvLyB0aGlzLmJhbGFuY2UodG8pLnZhbHVlID0gMDsKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDMKICAgIC8vIHRoaXMuYmFsYW5jZSh0bykudmFsdWUgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKCm9wdEluVG9BcHBsaWNhdGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDUKICAgIC8vIGlmICghdGhpcy51c2VyUmV3YXJkRGVidCh0bykuaGFzVmFsdWUpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDUKICAgIC8vIGlmICghdGhpcy51c2VyUmV3YXJkRGVidCh0bykuaGFzVmFsdWUpIHsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYm56IG9wdEluVG9BcHBsaWNhdGlvbl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo0NgogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSAwOwogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQ2CiAgICAvLyB0aGlzLnVzZXJSZXdhcmREZWJ0KHRvKS52YWx1ZSA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAoKb3B0SW5Ub0FwcGxpY2F0aW9uX2FmdGVyX2lmX2Vsc2VANToKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9wdEluQXNzZXQoKSAtPiB2b2lkOgpvcHRJbkFzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NzgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6ODEtODcKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjg1CiAgICAvLyBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6ODEtODYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjgxLTg3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo4OQogICAgLy8gbG9nKCdQb29sOiBvcHQtaW4gY29tcGxldGVkJyk7CiAgICBwdXNoYnl0ZXMgIlBvb2w6IG9wdC1pbiBjb21wbGV0ZWQiCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9ubHlSb3V0ZXIoKSAtPiB2b2lkOgpvbmx5Um91dGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OTcKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnJvdXRlci52YWx1ZS5ieXRlcywgJ1Bvb2w6IG9ubHkgcm91dGVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MAogICAgLy8gcm91dGVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInJvdXRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo5NwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMucm91dGVyLnZhbHVlLmJ5dGVzLCAnUG9vbDogb25seSByb3V0ZXInKTsKICAgID09CiAgICBhc3NlcnQgLy8gUG9vbDogb25seSByb3V0ZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9ubHlTdG9wQXV0aG9yaXR5KCkgLT4gdm9pZDoKb25seVN0b3BBdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMDEKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUuYnl0ZXMsICdQb29sOiBpcyBub3Qgc3RvcEF1dGhvcml0eScpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJzdG9wQXV0aG9yaXR5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEwMQogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZS5ieXRlcywgJ1Bvb2w6IGlzIG5vdCBzdG9wQXV0aG9yaXR5Jyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIFBvb2w6IGlzIG5vdCBzdG9wQXV0aG9yaXR5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC52YWxpZGF0ZUJhbGFuY2VSYXRpbygpIC0+IHZvaWQ6CnZhbGlkYXRlQmFsYW5jZVJhdGlvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBwcml2YXRlIHZhbGlkYXRlQmFsYW5jZVJhdGlvKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTAKICAgIC8vIGlmICh0b2tlbkJhbGFuY2UgPiB2VXNkQmFsYW5jZSkgewogICAgPgogICAgYnogdmFsaWRhdGVCYWxhbmNlUmF0aW9fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gYXNzZXJ0KCh2VXNkQmFsYW5jZSAqIEJQKSAvIHRva2VuQmFsYW5jZSA+PSB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlLCAnUG9vbDogbG93IHZVU0QgYmFsYW5jZScpOwogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNvbnN0IEJQOiB1aW50NjQgPSAxMF8wMDA7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gYXNzZXJ0KCh2VXNkQmFsYW5jZSAqIEJQKSAvIHRva2VuQmFsYW5jZSA+PSB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlLCAnUG9vbDogbG93IHZVU0QgYmFsYW5jZScpOwogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTExCiAgICAvLyBhc3NlcnQoKHZVc2RCYWxhbmNlICogQlApIC8gdG9rZW5CYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdlVTRCBiYWxhbmNlJyk7CiAgICA+PQogICAgYXNzZXJ0IC8vIFBvb2w6IGxvdyB2VVNEIGJhbGFuY2UKCnZhbGlkYXRlQmFsYW5jZVJhdGlvX2FmdGVyX2lmX2Vsc2VANToKICAgIHJldHN1YgoKdmFsaWRhdGVCYWxhbmNlUmF0aW9fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIH0gZWxzZSBpZiAodG9rZW5CYWxhbmNlIDwgdlVzZEJhbGFuY2UpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogdmFsaWRhdGVCYWxhbmNlUmF0aW9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIGFzc2VydCgodG9rZW5CYWxhbmNlICogQlApIC8gdlVzZEJhbGFuY2UgPj0gdGhpcy5iYWxhbmNlUmF0aW9NaW5CUC52YWx1ZSwgJ1Bvb2w6IGxvdyB0b2tlbiBiYWxhbmNlJyk7CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBhc3NlcnQoKHRva2VuQmFsYW5jZSAqIEJQKSAvIHZVc2RCYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdG9rZW4gYmFsYW5jZScpOwogICAgKgogICAgZnJhbWVfZGlnIDEKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBhc3NlcnQoKHRva2VuQmFsYW5jZSAqIEJQKSAvIHZVc2RCYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdG9rZW4gYmFsYW5jZScpOwogICAgPj0KICAgIGFzc2VydCAvLyBQb29sOiBsb3cgdG9rZW4gYmFsYW5jZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuZGVwb3NpdCgpIC0+IHZvaWQ6CmRlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMjktMTMwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlcG9zaXQoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjYW5EZXBvc2l0ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7Ly8gaXMgZGVwb3NpdCBvcGVyYXRpb24gYWxsb3dlZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjYW5EZXBvc2l0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gYXNzZXJ0KHRoaXMuY2FuRGVwb3NpdC52YWx1ZSwgJ1Bvb2w6IGRlcG9zaXQgcHJvaGliaXRlZCcpOwogICAgYXNzZXJ0IC8vIFBvb2w6IGRlcG9zaXQgcHJvaGliaXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzYKICAgIC8vIGFzc2VydChUeG4uZ3JvdXBJbmRleCA+IDAsIGBBc3NldCB0eG4gbWlzc2luZ2ApOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGFzc2VydCAvLyBBc3NldCB0eG4gbWlzc2luZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjM5CiAgICAvLyBjb25zdCBwcmV2SWR4OiB1aW50NjQgPSBUeG4uZ3JvdXBJbmRleCAtIDE7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0MQogICAgLy8gY29uc3QgcGF5ID0gZ3R4bi5Bc3NldFRyYW5zZmVyVHhuKHByZXZJZHgpOwogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0NAogICAgLy8gYXNzZXJ0KHBheS5hc3NldFJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgYEFzc2V0IG11c3QgZ28gdG8gYXBwYCk7CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEFzc2V0IG11c3QgZ28gdG8gYXBwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDUKICAgIC8vIGFzc2VydChwYXkueGZlckFzc2V0LmlkID09PSBhc3NldElkLCBgV3JvbmcgYXNzZXRgKTsKICAgIGR1cAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0OAogICAgLy8gYXNzZXJ0KHBheS5yZWtleVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsIGBSZWtleSBub3QgYWxsb3dlZGApOwogICAgZHVwCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gUmVrZXkgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0OQogICAgLy8gYXNzZXJ0KHBheS5hc3NldENsb3NlVG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgYENsb3NlVG8gbm90IGFsbG93ZWRgKTsKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRDbG9zZVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gQ2xvc2VUbyBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjUwCiAgICAvLyByZXR1cm4gcGF5LmFzc2V0QW1vdW50OwogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEzNgogICAgLy8gY29uc3QgYW1vdW50U1AgPSB0aGlzLnRvU3lzdGVtUHJlY2lzaW9uKGFtb3VudCk7CiAgICBjYWxsc3ViIHRvU3lzdGVtUHJlY2lzaW9uCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEzNwogICAgLy8gYXNzZXJ0KGFtb3VudFNQID4gMCwgJ1Bvb2w6IHRvbyBsaXR0bGUnKTsKICAgIGR1cAogICAgYXNzZXJ0IC8vIFBvb2w6IHRvbyBsaXR0bGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQwCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlICs9IGFtb3VudFNQOwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIHJlc2VydmVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQwCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlICs9IGFtb3VudFNQOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIGNvbnN0IG9sZEJhbGFuY2U6IHVpbnQ2NCA9ICh0b2tlbkJhbGFuY2UgKyB2VXNkQmFsYW5jZSk7CiAgICArCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIGlmIChvbGREID09PSAwIHx8IG9sZEJhbGFuY2UgPT09IDApIHsKICAgIGJ6IGRlcG9zaXRfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgNAogICAgYm56IGRlcG9zaXRfZWxzZV9ib2R5QDMKCmRlcG9zaXRfaWZfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBoYWxmQW1vdW50OiB1aW50NjQgPSBhbW91bnRTUCA+PiAxOwogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBzaHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGhhbGZBbW91bnQ7CiAgICBkaWcgMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGhhbGZBbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHZVc2RCYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgKz0gaGFsZkFtb3VudDsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBoYWxmQW1vdW50OwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmRlcG9zaXRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyB0aGlzLnVwZGF0ZUQoKTsKICAgIGNhbGxzdWIgdXBkYXRlRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTU4CiAgICAvLyB0aGlzLmRlcG9zaXRMcChUeG4uc2VuZGVyLCB0aGlzLmQudmFsdWUgLSBvbGREKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1OAogICAgLy8gdGhpcy5kZXBvc2l0THAoVHhuLnNlbmRlciwgdGhpcy5kLnZhbHVlIC0gb2xkRCk7CiAgICBmcmFtZV9kaWcgMAogICAgLQogICAgY2FsbHN1YiBkZXBvc2l0THAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMQogICAgLy8gY29uc3QgTUFYX1RPS0VOX0JBTEFOQ0U6IHVpbnQ2NCA9IDIgKiogNDA7IC8vIE1heCBwb3NzaWJsZSB0b2tlbiBiYWxhbmNlCiAgICBwdXNoaW50IDEwOTk1MTE2Mjc3NzYgLy8gMTA5OTUxMTYyNzc3NgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyBhc3NlcnQodGhpcy50b2tlbkJhbGFuY2UudmFsdWUgPCBNQVhfVE9LRU5fQkFMQU5DRSwgJ1Bvb2w6IHRvbyBtdWNoJyk7CiAgICA8CiAgICBhc3NlcnQgLy8gUG9vbDogdG9vIG11Y2gKICAgIHJldHN1YgoKZGVwb3NpdF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IG5ldyBVaW50TjY0KChCaWdVaW50KGFtb3VudFNQKSAqIEJpZ1VpbnQodG9rZW5CYWxhbmNlKSkgLyBCaWdVaW50KG9sZEJhbGFuY2UpKS5uYXRpdmU7CiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIGRpZyAxCiAgICBiKgogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gOAogICAgYnplcm8KICAgIHN3YXAKICAgIGRpZyAxCiAgICBifAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1MwogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgKz0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50U1ApICogQmlnVWludCh0b2tlbkJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBuZXcgVWludE42NCgoQmlnVWludChhbW91bnRTUCkgKiBCaWdVaW50KHZVc2RCYWxhbmNlKSkgLyBCaWdVaW50KG9sZEJhbGFuY2UpKS5uYXRpdmU7CiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgdW5jb3ZlciA0CiAgICBiKgogICAgdW5jb3ZlciAzCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBidG9pCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTQKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgKz0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50U1ApICogQmlnVWludCh2VXNkQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZGVwb3NpdF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC53aXRoZHJhdyhhbW91bnRMcDogdWludDY0KSAtPiB2b2lkOgp3aXRoZHJhdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OC0xNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gd2l0aGRyYXcoYW1vdW50THA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAiY2FuV2l0aGRyYXciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTIyCiAgICAvLyBhc3NlcnQodGhpcy5jYW5XaXRoZHJhdy52YWx1ZSwgJyJQb29sOiB3aXRoZHJhdyBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gIlBvb2w6IHdpdGhkcmF3IHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE3MwogICAgLy8gdGhpcy53aXRoZHJhd0xwKFR4bi5zZW5kZXIsIGFtb3VudExwKTsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyNgogICAgLy8gbGV0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTI2CiAgICAvLyBsZXQgdXNlckxwQW1vdW50ID0gdGhpcy5iYWxhbmNlKGZyb20pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyNwogICAgLy8gYXNzZXJ0KHVzZXJMcEFtb3VudCA+PSBscEFtb3VudCwgJ1Jld2FyZE1hbmFnZXI6IG5vdCBlbm91Z2ggYW1vdW50Jyk7CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgPj0KICAgIGFzc2VydCAvLyBSZXdhcmRNYW5hZ2VyOiBub3QgZW5vdWdoIGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMjkKICAgIC8vIGxldCBwZW5kaW5nOiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzAKICAgIC8vIGlmICh1c2VyTHBBbW91bnQgPiAwKSB7CiAgICBieiB3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzEKICAgIC8vIHBlbmRpbmcgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWU7CiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgZnJhbWVfZGlnIDMKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzEKICAgIC8vIHBlbmRpbmcgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTMxCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KGZyb20pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBmcmFtZV9idXJ5IDQKCndpdGhkcmF3X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzMKICAgIC8vIHVzZXJMcEFtb3VudCAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzQKICAgIC8vIHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZSAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM0CiAgICAvLyB0aGlzLmJhbGFuY2UoZnJvbSkudmFsdWUgLT0gbHBBbW91bnQ7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMwogICAgLy8gYmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAiYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzQKICAgIC8vIHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZSAtPSBscEFtb3VudDsKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEzNQogICAgLy8gdGhpcy50b3RhbFN1cHBseS52YWx1ZSAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzUKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgLT0gbHBBbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEzNgogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidChmcm9tKS52YWx1ZSA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAzCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM2CiAgICAvLyB0aGlzLnVzZXJSZXdhcmREZWJ0KGZyb20pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpOwogICAgYi8KICAgIGNhbGxzdWIgYmlndWludFRvVWludDY0TW9kdWxvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzQKICAgIC8vIHVzZXJSZXdhcmREZWJ0ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA1IC8vICJ1c2VyUmV3YXJkRGVidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzYKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogYWNjUmV3YXJkUGVyU2hhcmVQIC8gUF9TQ0FMRSk7CiAgICBzd2FwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM3CiAgICAvLyBpZiAocGVuZGluZyA+IDApIHsKICAgIGZyYW1lX2RpZyA0CiAgICBieiB3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzgKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiBmcm9tIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzgKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiBmcm9tIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzkKICAgIC8vIGVtaXQ8UmV3YXJkc0NsYWltZWQ+KHsgdXNlcjogbmV3IEFkZHJlc3MoZnJvbSksIHBlbmRpbmcgfSk7CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDI1IC8vIG1ldGhvZCAiUmV3YXJkc0NsYWltZWQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKCndpdGhkcmF3X2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxNDEKICAgIC8vIGVtaXQ8V2l0aGRyYXc+KHsgZnJvbTogbmV3IEFkZHJlc3MoZnJvbSksIGxwQW1vdW50IH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4ZDNhZmE0ZjEgLy8gbWV0aG9kICJXaXRoZHJhdyhhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgxCiAgICAvLyBjb25zdCBvbGRCYWxhbmNlOiB1aW50NjQgPSAodG9rZW5CYWxhbmNlICsgdlVzZEJhbGFuY2UpOwogICAgZHVwMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE4MgogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgLT0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50THApICogQmlnVWludCh0b2tlbkJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZGlnIDQKICAgIGIqCiAgICBkaWcgMgogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGIvCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA4CiAgICBiemVybwogICAgc3dhcAogICAgZGlnIDEKICAgIGJ8CiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyB0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSAtPSBuZXcgVWludE42NCgoQmlnVWludChhbW91bnRMcCkgKiBCaWdVaW50KHRva2VuQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgzCiAgICAvLyB0aGlzLnZVc2RCYWxhbmNlLnZhbHVlIC09IG5ldyBVaW50TjY0KChCaWdVaW50KGFtb3VudExwKSAqIEJpZ1VpbnQodlVzZEJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgdW5jb3ZlciA1CiAgICBiKgogICAgdW5jb3ZlciAzCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBidG9pCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxODMKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgLT0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50THApICogQmlnVWludCh2VXNkQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gYXNzZXJ0KHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICsgdGhpcy52VXNkQmFsYW5jZS52YWx1ZSA8IG9sZEJhbGFuY2UsICdQb29sOiB6ZXJvIGNoYW5nZXMnKTsKICAgICsKICAgID4KICAgIGFzc2VydCAvLyBQb29sOiB6ZXJvIGNoYW5nZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTg4CiAgICAvLyBhc3NlcnQoYW1vdW50THAgPD0gdGhpcy5yZXNlcnZlcy52YWx1ZSwgJ1Bvb2w6IHJlc2VydmVzJyk7CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICBhc3NlcnQgLy8gUG9vbDogcmVzZXJ2ZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTkxCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlIC09IGFtb3VudExwOwogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTEKICAgIC8vIHRoaXMucmVzZXJ2ZXMudmFsdWUgLT0gYW1vdW50THA7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLnVwZGF0ZUQoKTsKICAgIGNhbGxzdWIgdXBkYXRlRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyBhc3NlcnQodGhpcy5kLnZhbHVlIDwgb2xkRCwgJ1Bvb2w6IHplcm8gRCBjaGFuZ2VzJyk7CiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYXNzZXJ0IC8vIFBvb2w6IHplcm8gRCBjaGFuZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTctMjAxCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50THApLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk5CiAgICAvLyBhc3NldEFtb3VudDogdGhpcy5mcm9tU3lzdGVtUHJlY2lzaW9uKGFtb3VudExwKSwKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBmcm9tU3lzdGVtUHJlY2lzaW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMDAKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTctMjAxCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50THApLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3dhcFRvVlVzZCh1c2VyOiBieXRlcywgYW1vdW50OiB1aW50NjQsIHplcm9GZWU6IHVpbnQ2NCkgLT4gdWludDY0Ogpzd2FwVG9WVXNkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjEzLTIxNwogICAgLy8gc3dhcFRvVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIxOAogICAgLy8gdGhpcy5vbmx5Um91dGVyKCk7CiAgICBjYWxsc3ViIG9ubHlSb3V0ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyMAogICAgLy8gbGV0IHJlc3VsdDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjIwLTIyMQogICAgLy8gbGV0IHJlc3VsdDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICAvLyBsZXQgZmVlOiB1aW50NjQgPSAwOwogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjIKICAgIC8vIGlmIChhbW91bnQgPiAwKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6IHN3YXBUb1ZVc2RfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIGlmICghemVyb0ZlZSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogc3dhcFRvVlVzZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyBmZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJmZWVTaGFyZUJQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyNAogICAgLy8gZmVlID0gKGFtb3VudCAqIHRoaXMuZmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjI0CiAgICAvLyBmZWUgPSAoYW1vdW50ICogdGhpcy5mZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgLwogICAgZnJhbWVfYnVyeSAyCgpzd2FwVG9WVXNkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gY29uc3QgYW1vdW50SW4gPSB0aGlzLnRvU3lzdGVtUHJlY2lzaW9uKGFtb3VudCAtIGZlZSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICAtCiAgICBjYWxsc3ViIHRvU3lzdGVtUHJlY2lzaW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjgKICAgIC8vIGZlZSA9IGFtb3VudCAtIHRoaXMuZnJvbVN5c3RlbVByZWNpc2lvbihhbW91bnRJbik7CiAgICBkdXAKICAgIGNhbGxzdWIgZnJvbVN5c3RlbVByZWNpc2lvbgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMzEKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGFtb3VudEluOwogICAgZGlnIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjMxCiAgICAvLyB0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSArPSBhbW91bnRJbjsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSArPSBhbW91bnRJbjsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18zIC8vICJyZXNlcnZlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSArPSBhbW91bnRJbjsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyBjb25zdCB2VXNkTmV3QW1vdW50ID0gdGhpcy5nZXRZKHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlKTsKICAgIGNhbGxzdWIgZ2V0WQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBpZiAodGhpcy52VXNkQmFsYW5jZS52YWx1ZSA+IHZVc2ROZXdBbW91bnQpIHsKICAgIDwKICAgIGJ6IHN3YXBUb1ZVc2RfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gcmVzdWx0ID0gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSAtIHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgLQogICAgZnJhbWVfYnVyeSAxCgpzd2FwVG9WVXNkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSA9IHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5hZGRSZXdhcmRzKGZlZSk7CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIGFkZFJld2FyZHMKICAgIGZyYW1lX2J1cnkgMwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgNAoKc3dhcFRvVlVzZF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIGVtaXQ8U3dhcHBlZFRvVlVzZD4oeyBzZW5kZXI6IHVzZXIsIHRva2VuSWQ6IHRoaXMuYXNzZXQudmFsdWUuaWQsIGFtb3VudCwgdlVzZEFtb3VudDogcmVzdWx0LCBmZWUgfSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgyYmJiZWNhMyAvLyBtZXRob2QgIlN3YXBwZWRUb1ZVc2QoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gdGhpcy52YWxpZGF0ZUJhbGFuY2VSYXRpbygpOwogICAgY2FsbHN1YiB2YWxpZGF0ZUJhbGFuY2VSYXRpbwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjQ1CiAgICAvLyByZXR1cm4gcmVzdWx0OwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zd2FwRnJvbVZVc2QodXNlcjogYnl0ZXMsIGFtb3VudDogdWludDY0LCByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsIHplcm9GZWU6IHVpbnQ2NCkgLT4gdWludDY0Ogpzd2FwRnJvbVZVc2Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNTktMjY0CiAgICAvLyBzd2FwRnJvbVZVc2QoCiAgICAvLyAgIHVzZXI6IEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gNCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjY1CiAgICAvLyB0aGlzLm9ubHlSb3V0ZXIoKTsKICAgIGNhbGxzdWIgb25seVJvdXRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjY3CiAgICAvLyBsZXQgcmVzdWx0U1A6IHVpbnQ2NCA9IDA7IC8vIDAgYnkgZGVmYXVsdAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI2OC0yNjkKICAgIC8vIGxldCByZXN1bHQ6IHVpbnQ2NCA9IDA7IC8vIDAgYnkgZGVmYXVsdAogICAgLy8gbGV0IGZlZTogdWludDY0ID0gMDsKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjcwCiAgICAvLyBpZiAoYW1vdW50ID4gMCkgewogICAgZnJhbWVfZGlnIC0zCiAgICBieiBzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBhbW91bnQ7CiAgICBmcmFtZV9kaWcgLTMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBhbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHZVc2RCYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzIKICAgIC8vIGNvbnN0IG5ld0Ftb3VudCA9IHRoaXMuZ2V0WSh0aGlzLnZVc2RCYWxhbmNlLnZhbHVlKTsKICAgIGNhbGxzdWIgZ2V0WQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBpZiAodG9rZW5CYWxhbmNlID4gbmV3QW1vdW50KSB7CiAgICA8CiAgICBieiBzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIHJlc3VsdFNQID0gdG9rZW5CYWxhbmNlIC0gbmV3QW1vdW50OwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyByZXN1bHQgPSB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24ocmVzdWx0U1ApOwogICAgY2FsbHN1YiBmcm9tU3lzdGVtUHJlY2lzaW9uCiAgICBmcmFtZV9idXJ5IDMKCnN3YXBGcm9tVlVzZF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gYXNzZXJ0KHJlc3VsdFNQIDw9IHRoaXMucmVzZXJ2ZXMudmFsdWUsICdQb29sOiByZXNlcnZlcycpOwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA8PQogICAgYXNzZXJ0IC8vIFBvb2w6IHJlc2VydmVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSAtPSByZXN1bHRTUDsKICAgIHN3YXAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18zIC8vICJyZXNlcnZlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSAtPSByZXN1bHRTUDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyODMKICAgIC8vIGlmICghemVyb0ZlZSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzkKICAgIC8vIGZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gImZlZVNoYXJlQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyBmZWUgPSAocmVzdWx0ICogdGhpcy5mZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgZnJhbWVfZGlnIDMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNvbnN0IEJQOiB1aW50NjQgPSAxMF8wMDA7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4NAogICAgLy8gZmVlID0gKHJlc3VsdCAqIHRoaXMuZmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIC8KICAgIGZyYW1lX2J1cnkgNAoKc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4NwogICAgLy8gcmVzdWx0IC09IGZlZTsKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4OQogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgPSBuZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5MAogICAgLy8gYXNzZXJ0KHJlc3VsdCA+PSByZWNlaXZlQW1vdW50TWluLCAnUG9vbDogc2xpcHBhZ2UnKTsKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICA+PQogICAgYXNzZXJ0IC8vIFBvb2w6IHNsaXBwYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyOTEtMjk1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiByZXN1bHQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHVzZXIubmF0aXZlLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjkxLTI5NQogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLAogICAgLy8gICBhc3NldEFtb3VudDogcmVzdWx0LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB1c2VyLm5hdGl2ZSwKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gdGhpcy5hZGRSZXdhcmRzKGZlZSk7CiAgICBkaWcgMQogICAgY2FsbHN1YiBhZGRSZXdhcmRzCiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2J1cnkgNQoKc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANzoKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5OAogICAgLy8gZW1pdDxTd2FwcGVkRnJvbVZVc2Q+KHsgcmVjaXBpZW50OiB1c2VyLCB0b2tlbklkOiB0aGlzLmFzc2V0LnZhbHVlLmlkLCB2VXNkQW1vdW50OiBhbW91bnQsIGFtb3VudDogcmVzdWx0LCBmZWUgfSk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhkM2YxZDU0MiAvLyBtZXRob2QgIlN3YXBwZWRGcm9tVlVzZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzAwCiAgICAvLyB0aGlzLnZhbGlkYXRlQmFsYW5jZVJhdGlvKCk7CiAgICBjYWxsc3ViIHZhbGlkYXRlQmFsYW5jZVJhdGlvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDEKICAgIC8vIHJldHVybiByZXN1bHQ7CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldEZlZVNoYXJlKGZlZVNoYXJlQlA6IHVpbnQ2NCkgLT4gdm9pZDoKc2V0RmVlU2hhcmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIHNldEZlZVNoYXJlKGZlZVNoYXJlQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzA5CiAgICAvLyBhc3NlcnQoZmVlU2hhcmVCUCA8PSBCUCwgJ1Bvb2w6IHRvbyBsYXJnZScpOwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTkKICAgIC8vIGV4cG9ydCBjb25zdCBCUDogdWludDY0ID0gMTBfMDAwOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDkKICAgIC8vIGFzc2VydChmZWVTaGFyZUJQIDw9IEJQLCAnUG9vbDogdG9vIGxhcmdlJyk7CiAgICA8PQogICAgYXNzZXJ0IC8vIFBvb2w6IHRvbyBsYXJnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzkKICAgIC8vIGZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyAxNSAvLyAiZmVlU2hhcmVCUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMxMAogICAgLy8gdGhpcy5mZWVTaGFyZUJQLnZhbHVlID0gZmVlU2hhcmVCUDsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmFkanVzdFRvdGFsTHBBbW91bnQoKSAtPiB2b2lkOgphZGp1c3RUb3RhbExwQW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzEzCiAgICAvLyBhZGp1c3RUb3RhbExwQW1vdW50KCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsU3VwcGx5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyBpZiAoZCA+IHRvdGFsU3VwcGx5KSB7CiAgICA+CiAgICBieiBhZGp1c3RUb3RhbExwQW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzE5CiAgICAvLyB0aGlzLmRlcG9zaXRMcChUeG4uc2VuZGVyLCBkIC0gdG90YWxTdXBwbHkpOwogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICBjYWxsc3ViIGRlcG9zaXRMcAoKYWRqdXN0VG90YWxMcEFtb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zZXRCYWxhbmNlUmF0aW9NaW5CUChiYWxhbmNlUmF0aW9NaW5CUDogdWludDY0KSAtPiB2b2lkOgpzZXRCYWxhbmNlUmF0aW9NaW5CUDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gc2V0QmFsYW5jZVJhdGlvTWluQlAoYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI4CiAgICAvLyBhc3NlcnQoYmFsYW5jZVJhdGlvTWluQlAgPD0gQlAsICdQb29sOiB0b28gbGFyZ2UnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI4CiAgICAvLyBhc3NlcnQoYmFsYW5jZVJhdGlvTWluQlAgPD0gQlAsICdQb29sOiB0b28gbGFyZ2UnKTsKICAgIDw9CiAgICBhc3NlcnQgLy8gUG9vbDogdG9vIGxhcmdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MwogICAgLy8gYmFsYW5jZVJhdGlvTWluQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUgPSBiYWxhbmNlUmF0aW9NaW5CUDsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnN0b3BEZXBvc2l0KCkgLT4gdm9pZDoKc3RvcERlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIHRoaXMub25seVN0b3BBdXRob3JpdHkoKTsKICAgIGNhbGxzdWIgb25seVN0b3BBdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjYW5EZXBvc2l0ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7Ly8gaXMgZGVwb3NpdCBvcGVyYXRpb24gYWxsb3dlZAogICAgYnl0ZWMgMTIgLy8gImNhbkRlcG9zaXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIHRoaXMuY2FuRGVwb3NpdC52YWx1ZSA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zdGFydERlcG9zaXQoKSAtPiB2b2lkOgpzdGFydERlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNhbkRlcG9zaXQgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBieXRlYyAxMiAvLyAiY2FuRGVwb3NpdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzOQogICAgLy8gdGhpcy5jYW5EZXBvc2l0LnZhbHVlID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3RvcFdpdGhkcmF3KCkgLT4gdm9pZDoKc3RvcFdpdGhkcmF3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyB0aGlzLm9ubHlTdG9wQXV0aG9yaXR5KCk7CiAgICBjYWxsc3ViIG9ubHlTdG9wQXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0NAogICAgLy8gdGhpcy5jYW5XaXRoZHJhdy52YWx1ZSA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zdGFydFdpdGhkcmF3KCkgLT4gdm9pZDoKc3RhcnRXaXRoZHJhdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0OQogICAgLy8gdGhpcy5jYW5XaXRoZHJhdy52YWx1ZSA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogYnl0ZXMpIC0+IHZvaWQ6CnNldFN0b3BBdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTIKICAgIC8vIHNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTMKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgYnl0ZWMgMjIgLy8gInN0b3BBdXRob3JpdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTQKICAgIC8vIHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZSA9IHN0b3BBdXRob3JpdHk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zZXRSb3V0ZXIocm91dGVyOiBieXRlcykgLT4gdm9pZDoKc2V0Um91dGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU3CiAgICAvLyBzZXRSb3V0ZXIocm91dGVyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MAogICAgLy8gcm91dGVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBieXRlYyAyMSAvLyAicm91dGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU5CiAgICAvLyB0aGlzLnJvdXRlci52YWx1ZSA9IHJvdXRlcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmdldFkoeDogdWludDY0KSAtPiB1aW50NjQ6CmdldFk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjUKICAgIC8vIHByaXZhdGUgZ2V0WSh4OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjYKICAgIC8vIGNvbnN0IHhfID0gQmlnVWludCh4KTsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NgogICAgLy8gZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjcKICAgIC8vIGNvbnN0IGRfID0gQmlnVWludCh0aGlzLmQudmFsdWUpOwogICAgaXRvYgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NQogICAgLy8gYSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGNvbnN0IGE0ID0gQmlnVWludCh0aGlzLmEudmFsdWUgPDwgMik7CiAgICBwdXNoaW50IDIgLy8gMgogICAgc2hsCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2OQogICAgLy8gY29uc3QgYTggPSBCaWdVaW50KGE0ICogMm4pOwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgYioKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3MQogICAgLy8gY29uc3QgZE1pbnVzWElzUG9zaXRpdmUgPSBkXyA+PSB4XzsKICAgIGI8PQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIGNvbnN0IGRNaW51c1hBYnM6IGJpZ3VpbnQgPSBkTWludXNYSXNQb3NpdGl2ZSA/IChkXyAtIHhfKSA6ICh4XyAtIGRfKTsKICAgIGJ6IGdldFlfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIGItCgpnZXRZX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3NAogICAgLy8gY29uc3QgYTRCeURNaW51c1hBYnM6IGJpZ3VpbnQgPSBhNCAqIGRNaW51c1hBYnM7CiAgICBmcmFtZV9kaWcgNAogICAgYioKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzc5CiAgICAvLyBpZiAoZE1pbnVzWElzUG9zaXRpdmUpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBieiBnZXRZX2Vsc2VfYm9keUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODAKICAgIC8vIGlmIChhNEJ5RE1pbnVzWEFicyA+PSBkXykgewogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBiPj0KICAgIGJ6IGdldFlfZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gcGFydDFBYnMgPSBhNEJ5RE1pbnVzWEFicyAtIGRfOwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBiLQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODIKICAgIC8vIHBhcnQxSXNQb3NpdGl2ZSA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQoKZ2V0WV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTMKICAgIC8vIGNvbnN0IHBhcnQyOiBiaWd1aW50ID0gQmlnVWludCh4KSAqIChhNCAqIGRfICogZF8gKiBkXyArIHhfICogKHBhcnQxQWJzICogcGFydDFBYnMpKTsKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiKgogICAgZGlnIDEKICAgIGIqCiAgICBiKgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYioKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYioKICAgIHVuY292ZXIgMgogICAgYisKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTQKICAgIC8vIGxldCBudW1lcmF0b3I6IGJpZ3VpbnQgPSB0aGlzLnNxcnQocGFydDIpOwogICAgY2FsbHN1YiBzcXJ0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTcKICAgIC8vIGlmIChwYXJ0MUlzUG9zaXRpdmUpIHsKICAgIGJ6IGdldFlfZWxzZV9ib2R5QDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTgKICAgIC8vIG51bWVyYXRvciArPSB4XyAqIHBhcnQxQWJzOwogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICBiKgogICAgYisKCmdldFlfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwNAogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhudW1lcmF0b3IgLyAoYTggKiB4XykgKyAxbik7IC8vICsxIHRvIG9mZnNldCByb3VuZGluZyBlcnJvcnMKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgMgogICAgYioKICAgIGIvCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiKwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRZX2Vsc2VfYm9keUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gbnVtZXJhdG9yIC09IHhfICogcGFydDFBYnM7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIGIqCiAgICBiLQogICAgYiBnZXRZX2FmdGVyX2lmX2Vsc2VAMTIKCmdldFlfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODQKICAgIC8vIHBhcnQxQWJzID0gZF8gLSBhNEJ5RE1pbnVzWEFiczsKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgYi0KICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyBwYXJ0MUlzUG9zaXRpdmUgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBiIGdldFlfYWZ0ZXJfaWZfZWxzZUA5CgpnZXRZX2Vsc2VfYm9keUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzg4CiAgICAvLyBwYXJ0MUFicyA9IGE0QnlETWludXNYQWJzICsgZF87CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDMKICAgIGIrCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gcGFydDFJc1Bvc2l0aXZlID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRZX2FmdGVyX2lmX2Vsc2VAOQoKZ2V0WV90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIGNvbnN0IGRNaW51c1hBYnM6IGJpZ3VpbnQgPSBkTWludXNYSXNQb3NpdGl2ZSA/IChkXyAtIHhfKSA6ICh4XyAtIGRfKTsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMwogICAgYi0KICAgIGIgZ2V0WV90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC51cGRhdGVEKCkgLT4gdm9pZDoKdXBkYXRlRDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwNwogICAgLy8gcHJpdmF0ZSB1cGRhdGVEKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDA4CiAgICAvLyBjb25zdCB4ID0gQmlnVWludCh0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSk7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwOQogICAgLy8gY29uc3QgeSA9IEJpZ1VpbnQodGhpcy52VXNkQmFsYW5jZS52YWx1ZSk7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MTQKICAgIC8vIGNvbnN0IHh5OiBiaWd1aW50ID0geCAqIHk7CiAgICBkdXAyCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDUKICAgIC8vIGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDE1CiAgICAvLyBjb25zdCBhXyA9IEJpZ1VpbnQodGhpcy5hLnZhbHVlKTsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gY29uc3QgcDE6IGJpZ3VpbnQgPSBhXyAqIHh5ICogKHggKyB5KTsKICAgIGR1cAogICAgZGlnIDIKICAgIGIqCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgYisKICAgIGIqCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxOQogICAgLy8gY29uc3QgcDI6IGJpZ3VpbnQgPSAoeHkgKiAoKGFfICogNG4pIC0gMW4pKSAvIDNuOwogICAgcHVzaGJ5dGVzIDB4MDQKICAgIGIqCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiLQogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWMgMjYgLy8gMHgwMwogICAgYi8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyMQogICAgLy8gY29uc3QgcDM6IGJpZ3VpbnQgPSB0aGlzLnNxcnQoKHAxICogcDEpICsgKHAyICogcDIgKiBwMikpOwogICAgZGlnIDEKICAgIGRpZyAyCiAgICBiKgogICAgZGlnIDEKICAgIGRpZyAyCiAgICBiKgogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYisKICAgIGNhbGxzdWIgc3FydAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjIKICAgIC8vIGxldCBkXyA9IHRoaXMuY2JydChwMSArIHAzKTsKICAgIGR1cDIKICAgIGIrCiAgICBjYWxsc3ViIGNicnQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gaWYgKHAzID4gcDEpIHsKICAgIGI8CiAgICBieiB1cGRhdGVEX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjQKICAgIC8vIGRfIC09IHRoaXMuY2JydChwMyAtIHAxKTsKICAgIGZyYW1lX2RpZyAwCiAgICBiLQogICAgY2FsbHN1YiBjYnJ0CiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgLQogICAgZnJhbWVfYnVyeSAxCgp1cGRhdGVEX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyOAogICAgLy8gdGhpcy5kLnZhbHVlID0gKGRfIDw8IDEpOwogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBzaGwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDYgLy8gImQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjgKICAgIC8vIHRoaXMuZC52YWx1ZSA9IChkXyA8PCAxKTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnVwZGF0ZURfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjYKICAgIC8vIGRfICs9IHRoaXMuY2JydChwMSAtIHAzKTsKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBiLQogICAgY2FsbHN1YiBjYnJ0CiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHVwZGF0ZURfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wudG9TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9TeXN0ZW1QcmVjaXNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIHByaXZhdGUgdG9TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OAogICAgLy8gcHJpdmF0ZSB0b2tlbkFtb3VudFJlZHVjZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAidG9rZW5BbW91bnRSZWR1Y2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50SW5jcmVhc2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInRva2VuQW1vdW50SW5jcmVhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDM1CiAgICAvLyBpZiAodG9rZW5BbW91bnRSZWR1Y2UgPiAwKSB7CiAgICBieiB0b1N5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDM2CiAgICAvLyByZXR1cm4gYW1vdW50IC8gdG9rZW5BbW91bnRSZWR1Y2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9TeXN0ZW1QcmVjaXNpb25fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzcKICAgIC8vIH0gZWxzZSBpZiAodG9rZW5BbW91bnRJbmNyZWFzZSA+IDApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBieiB0b1N5c3RlbVByZWNpc2lvbl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzOAogICAgLy8gcmV0dXJuIGFtb3VudCAqIHRva2VuQW1vdW50SW5jcmVhc2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAxCiAgICAqCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyByZXR1cm4gYW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKZnJvbVN5c3RlbVByZWNpc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0MwogICAgLy8gcHJpdmF0ZSBmcm9tU3lzdGVtUHJlY2lzaW9uKGFtb3VudDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgKICAgIC8vIHByaXZhdGUgdG9rZW5BbW91bnRSZWR1Y2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gInRva2VuQW1vdW50UmVkdWNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OQogICAgLy8gcHJpdmF0ZSB0b2tlbkFtb3VudEluY3JlYXNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJ0b2tlbkFtb3VudEluY3JlYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0NwogICAgLy8gaWYgKHRva2VuQW1vdW50UmVkdWNlID4gMCkgewogICAgYnogZnJvbVN5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQ4CiAgICAvLyByZXR1cm4gYW1vdW50ICogdG9rZW5BbW91bnRSZWR1Y2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAwCiAgICAqCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZnJvbVN5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0OQogICAgLy8gfSBlbHNlIGlmICh0b2tlbkFtb3VudEluY3JlYXNlID4gMCkgewogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGZyb21TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTAKICAgIC8vIHJldHVybiBhbW91bnQgLyB0b2tlbkFtb3VudEluY3JlYXNlOwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMQogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmZyb21TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDUyCiAgICAvLyByZXR1cm4gYW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNxcnQobjogYnl0ZXMpIC0+IGJ5dGVzOgpzcXJ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDU1CiAgICAvLyBwcml2YXRlIHNxcnQobjogYmlndWludCk6IGJpZ3VpbnQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTYKICAgIC8vIGFzc2VydChuID4gMG4sICduIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hieXRlcyAweAogICAgYj4KICAgIGFzc2VydCAvLyBuIG11c3QgYmUgbm9uLW5lZ2F0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTcKICAgIC8vIGlmIChuID09PSAwbikgcmV0dXJuIDBuOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYnogc3FydF9hZnRlcl9pZl9lbHNlQDIKICAgIHB1c2hieXRlcyAweAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnNxcnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDU4CiAgICAvLyBpZiAobiA8PSAzbikgcmV0dXJuIDFuOwogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlYyAyNiAvLyAweDAzCiAgICBiPD0KICAgIGJ6IHNxcnRfYWZ0ZXJfaWZfZWxzZUA0CiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc3FydF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjEKICAgIC8vIGNvbnN0IGJsID0gYml0TGVuZ3RoKEJ5dGVzKG4pKTsKICAgIGZyYW1lX2RpZyAtMQogICAgYml0bGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjIKICAgIC8vIGxldCB3aWRlID0gZXhwdygyLCAoYmwgKyAxKSAvIDIpOwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAvCiAgICBwdXNoaW50IDIgLy8gMgogICAgc3dhcAogICAgZXhwdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBjb25zdCBoaSA9IEJpZ1VpbnQod2lkZVswXSk7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjQKICAgIC8vIGNvbnN0IGxvID0gQmlnVWludCh3aWRlWzFdKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2NQogICAgLy8gbGV0IHg6IGJpZ3VpbnQgPSBoaSAqIFNISUZUNjQgKyBsbzsKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBjb25zdCBTSElGVDY0OiBiaWd1aW50ID0gMTg0NDY3NDQwNzM3MDk1NTE2MTZuOyAvLyAyXjY0CiAgICBieXRlYyAyNyAvLyAweDAxMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyBsZXQgeDogYmlndWludCA9IGhpICogU0hJRlQ2NCArIGxvOwogICAgYioKICAgIGIrCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY4CiAgICAvLyBsZXQgeTogYmlndWludCA9ICh4ICsgbiAvIHgpIC8gMm47CiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAxCiAgICBiLwogICAgYisKICAgIGJ5dGVjIDE3IC8vIDB4MDIKICAgIGIvCiAgICBmcmFtZV9idXJ5IDEKCnNxcnRfd2hpbGVfdG9wQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjkKICAgIC8vIHdoaWxlICh5IDwgeCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICBiPAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY5LTQ3MgogICAgLy8gd2hpbGUgKHkgPCB4KSB7CiAgICAvLyAgIHggPSB5OwogICAgLy8gICB5ID0gKHggKyBuIC8geCkgLyAybjsKICAgIC8vIH0KICAgIGJ6IHNxcnRfYWZ0ZXJfd2hpbGVANwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDcxCiAgICAvLyB5ID0gKHggKyBuIC8geCkgLyAybjsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYi8KICAgIGRpZyAxCiAgICBiKwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgYi8KICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICBiIHNxcnRfd2hpbGVfdG9wQDUKCnNxcnRfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ3MwogICAgLy8gcmV0dXJuIHg7CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5jYnJ0KG46IGJ5dGVzKSAtPiB1aW50NjQ6CmNicnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzYKICAgIC8vIHByaXZhdGUgY2JydChuOiBiaWd1aW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDc3CiAgICAvLyBpZiAobiA9PT0gMG4pIHJldHVybiAwOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYnogY2JydF9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2JydF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzgKICAgIC8vIGlmIChuIDwgOG4pIHJldHVybiAxOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgwOAogICAgYjwKICAgIGJ6IGNicnRfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNicnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgxCiAgICAvLyBjb25zdCBibCA9IGJpdExlbmd0aChCeXRlcyhuKSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJpdGxlbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgyCiAgICAvLyBsZXQgd2lkZSA9IGV4cHcoMiwgKGJsICsgMikgLyAzKTsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBwdXNoaW50IDMgLy8gMwogICAgLwogICAgcHVzaGludCAyIC8vIDIKICAgIHN3YXAKICAgIGV4cHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4MwogICAgLy8gY29uc3QgaGkgPSBCaWdVaW50KHdpZGVbMF0pOwogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyBjb25zdCBsbyA9IEJpZ1VpbnQod2lkZVsxXSk7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODUKICAgIC8vIGxldCB4OiBiaWd1aW50ID0gaGkgKiBTSElGVDY0ICsgbG87CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMgogICAgLy8gY29uc3QgU0hJRlQ2NDogYmlndWludCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE2bjsgLy8gMl42NAogICAgYnl0ZWMgMjcgLy8gMHgwMTAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gbGV0IHg6IGJpZ3VpbnQgPSBoaSAqIFNISUZUNjQgKyBsbzsKICAgIGIqCiAgICBiKwogICAgZnJhbWVfYnVyeSAxCgpjYnJ0X3doaWxlX3RvcEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDg5CiAgICAvLyBjb25zdCB4MjogYmlndWludCA9IHggKiB4OwogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYioKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTAKICAgIC8vIGlmICh4MiA9PT0gMG4pIGJyZWFrOyAvLyBzaG91bGQgbm90IGhhcHBlbiBmb3IgeD4wCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYm56IGNicnRfd2hpbGVfdG9wQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTEKICAgIC8vIGNvbnN0IG5leHQ6IGJpZ3VpbnQgPSAoMm4gKiB4ICsgbiAvIHgyKSAvIDNuOwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYioKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDMKICAgIGIvCiAgICBiKwogICAgYnl0ZWMgMjYgLy8gMHgwMwogICAgYi8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTIKICAgIC8vIGlmIChuZXh0ID09PSB4IHx8IG5leHQgPT09IHggLSAxbikgewogICAgYj09CiAgICBibnogY2JydF9pZl9ib2R5QDEwCiAgICBmcmFtZV9kaWcgMQogICAgYnl0ZWMgMTAgLy8gMHgwMQogICAgYi0KICAgIGZyYW1lX2RpZyAwCiAgICBiPT0KICAgIGJ6IGNicnRfYWZ0ZXJfaWZfZWxzZUAxMQoKY2JydF9pZl9ib2R5QDEwOgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMQoKY2JydF93aGlsZV90b3BAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MDAKICAgIC8vIHdoaWxlICgoeCArIDFuKSAqICh4ICsgMW4pICogKHggKyAxbikgPD0gbikgeCArPSAxbjsKICAgIGZyYW1lX2RpZyAxCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgZGlnIDEKICAgIGIqCiAgICBiKgogICAgZnJhbWVfZGlnIC0xCiAgICBiPD0KICAgIGJ6IGNicnRfd2hpbGVfdG9wQDE3CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNicnRfd2hpbGVfdG9wQDE0CgpjYnJ0X3doaWxlX3RvcEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUwMQogICAgLy8gd2hpbGUgKHggKiB4ICogeCA+IG4pIHggLT0gMW47CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBkaWcgMQogICAgYioKICAgIGIqCiAgICBmcmFtZV9kaWcgLTEKICAgIGI+CiAgICBieiBjYnJ0X2FmdGVyX3doaWxlQDE5CiAgICBmcmFtZV9kaWcgMQogICAgYnl0ZWMgMTAgLy8gMHgwMQogICAgYi0KICAgIGZyYW1lX2J1cnkgMQogICAgYiBjYnJ0X3doaWxlX3RvcEAxNwoKY2JydF9hZnRlcl93aGlsZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUwMgogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyh4KTsKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNicnRfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgY2JydF93aGlsZV90b3BANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5jbGFpbVJld2FyZHMoKSAtPiB2b2lkOgpjbGFpbVJld2FyZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTAtNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gY2xhaW1SZXdhcmRzKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUyCiAgICAvLyBjb25zdCB1c2VyID0gVHhuLnNlbmRlcjsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUzCiAgICAvLyBjb25zdCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodXNlcikudmFsdWU7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUzCiAgICAvLyBjb25zdCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodXNlcikudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTQKICAgIC8vIGlmICh1c2VyTHBBbW91bnQgPiAwKSB7CiAgICBieiBjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IHJld2FyZHMgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgLyBQX1NDQUxFKTsKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU1CiAgICAvLyBjb25zdCByZXdhcmRzID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlIC8gUF9TQ0FMRSk7CiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IHJld2FyZHMgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgLyBQX1NDQUxFKTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NgogICAgLy8gY29uc3QgcGVuZGluZzogdWludDY0ID0gcmV3YXJkcyAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU2CiAgICAvLyBjb25zdCBwZW5kaW5nOiB1aW50NjQgPSByZXdhcmRzIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NwogICAgLy8gaWYgKHBlbmRpbmcgPiAwKSB7CiAgICBieiBjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTgKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWUgPSByZXdhcmRzOwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTgKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWUgPSByZXdhcmRzOwogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHVzZXIgfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHVzZXIgfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjYwCiAgICAvLyBlbWl0PFJld2FyZHNDbGFpbWVkPih7IHVzZXI6IG5ldyBBZGRyZXNzKHVzZXIpLCBwZW5kaW5nIH0pOwogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlYyAyNSAvLyBtZXRob2QgIlJld2FyZHNDbGFpbWVkKGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCgpjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLnNldEFkbWluRmVlU2hhcmUoYWRtaW5GZWVTaGFyZUJQOiB1aW50NjQpIC0+IHZvaWQ6CnNldEFkbWluRmVlU2hhcmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjUtNjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0QWRtaW5GZWVTaGFyZShhZG1pbkZlZVNoYXJlQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjcKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY4CiAgICAvLyBhc3NlcnQoYWRtaW5GZWVTaGFyZUJQIDw9IEJQLCAnUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY4CiAgICAvLyBhc3NlcnQoYWRtaW5GZWVTaGFyZUJQIDw9IEJQLCAnUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gnKTsKICAgIDw9CiAgICBhc3NlcnQgLy8gUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOAogICAgLy8gYWRtaW5GZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogQlAgLyA1IH0pOyAvLyBEZWZhdWx0IGFkbWluIGZlZSBpcyAyMCUKICAgIGJ5dGVjIDE4IC8vICJhZG1pbkZlZVNoYXJlQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjkKICAgIC8vIHRoaXMuYWRtaW5GZWVTaGFyZUJQLnZhbHVlID0gYWRtaW5GZWVTaGFyZUJQOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmNsYWltQWRtaW5GZWUoKSAtPiB2b2lkOgpjbGFpbUFkbWluRmVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjcyLTczCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGNsYWltQWRtaW5GZWUoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3NAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3NgogICAgLy8gaWYgKGFkbWluRmVlQW1vdW50ID4gMCkgewogICAgYnogY2xhaW1BZG1pbkZlZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3Ny04MQogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFkbWluRmVlQW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAib3duZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3Ny04MQogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFkbWluRmVlQW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMxCiAgICAvLyBhZG1pbkZlZUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODIKICAgIC8vIHRoaXMuYWRtaW5GZWVBbW91bnQudmFsdWUgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbUFkbWluRmVlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5wZW5kaW5nUmV3YXJkKHVzZXI6IGJ5dGVzKSAtPiB1aW50NjQ6CnBlbmRpbmdSZXdhcmQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODYtODcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gcGVuZGluZ1Jld2FyZCh1c2VyOiBBY2NvdW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODgKICAgIC8vIHJldHVybiBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodGhpcy5iYWxhbmNlKHVzZXIpLnZhbHVlKSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlKSAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo4OAogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbygoQmlnVWludCh0aGlzLmJhbGFuY2UodXNlcikudmFsdWUpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUpIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KHVzZXIpLnZhbHVlOwogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyMAogICAgLy8gY29uc3QgUF9TQ0FMRTogYmlndWludCA9IEJpZ1VpbnQoMSA8PCBQKTsKICAgIGJ5dGVjIDkgLy8gMHgwMTAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5hZGRSZXdhcmRzKHJld2FyZEFtb3VudDogdWludDY0KSAtPiB2b2lkOgphZGRSZXdhcmRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk2CiAgICAvLyBwcm90ZWN0ZWQgYWRkUmV3YXJkcyhyZXdhcmRBbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjkKICAgIC8vIHRvdGFsU3VwcGx5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk4CiAgICAvLyBpZiAodG90YWxTdXBwbHkgPiAwKSB7CiAgICBieiBhZGRSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI4CiAgICAvLyBhZG1pbkZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBCUCAvIDUgfSk7IC8vIERlZmF1bHQgYWRtaW4gZmVlIGlzIDIwJQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJhZG1pbkZlZVNoYXJlQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk5CiAgICAvLyBjb25zdCBhZG1pbkZlZVJld2FyZHM6IHVpbnQ2NCA9IChyZXdhcmRBbW91bnQgKiB0aGlzLmFkbWluRmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk5CiAgICAvLyBjb25zdCBhZG1pbkZlZVJld2FyZHM6IHVpbnQ2NCA9IChyZXdhcmRBbW91bnQgKiB0aGlzLmFkbWluRmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDAKICAgIC8vIHJld2FyZEFtb3VudCAtPSBhZG1pbkZlZVJld2FyZHM7CiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAxCiAgICAtCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMQogICAgLy8gdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgKz0gQmlnVWludChyZXdhcmRBbW91bnQpICogUF9TQ0FMRSAvIEJpZ1VpbnQodG90YWxTdXBwbHkpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDEKICAgIC8vIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlICs9IEJpZ1VpbnQocmV3YXJkQW1vdW50KSAqIFBfU0NBTEUgLyBCaWdVaW50KHRvdGFsU3VwcGx5KTsKICAgIGIqCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgYi8KICAgIGIrCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGJ5dGVjIDggLy8gImFjY1Jld2FyZFBlclNoYXJlUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDEKICAgIC8vIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlICs9IEJpZ1VpbnQocmV3YXJkQW1vdW50KSAqIFBfU0NBTEUgLyBCaWdVaW50KHRvdGFsU3VwcGx5KTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMgogICAgLy8gdGhpcy5hZG1pbkZlZUFtb3VudC52YWx1ZSArPSBhZG1pbkZlZVJld2FyZHM7CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDIKICAgIC8vIHRoaXMuYWRtaW5GZWVBbW91bnQudmFsdWUgKz0gYWRtaW5GZWVSZXdhcmRzOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFkZFJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmRlcG9zaXRMcCh0bzogYnl0ZXMsIGxwQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmRlcG9zaXRMcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDYKICAgIC8vIHByb3RlY3RlZCBkZXBvc2l0THAodG86IEFjY291bnQsIGxwQW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDgKICAgIC8vIGxldCBwZW5kaW5nOiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDkKICAgIC8vIGxldCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodG8pLnZhbHVlOwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwOQogICAgLy8gbGV0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZSh0bykudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTEwCiAgICAvLyBpZiAodXNlckxwQW1vdW50ID4gMCkgewogICAgYnogZGVwb3NpdExwX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExMQogICAgLy8gcGVuZGluZyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlOwogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTExCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExMQogICAgLy8gcGVuZGluZyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBmcmFtZV9idXJ5IDEKCmRlcG9zaXRMcF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTEzCiAgICAvLyB1c2VyTHBBbW91bnQgKz0gbHBBbW91bnQ7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE0CiAgICAvLyB0aGlzLmJhbGFuY2UodG8pLnZhbHVlICs9IGxwQW1vdW50OwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNAogICAgLy8gdGhpcy5iYWxhbmNlKHRvKS52YWx1ZSArPSBscEFtb3VudDsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9kaWcgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMwogICAgLy8gYmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAiYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTQKICAgIC8vIHRoaXMuYmFsYW5jZSh0bykudmFsdWUgKz0gbHBBbW91bnQ7CiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsU3VwcGx5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTUKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgKz0gbHBBbW91bnQ7CiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE1CiAgICAvLyB0aGlzLnRvdGFsU3VwcGx5LnZhbHVlICs9IGxwQW1vdW50OwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTcKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSk7CiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMAogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyMAogICAgLy8gY29uc3QgUF9TQ0FMRTogYmlndWludCA9IEJpZ1VpbnQoMSA8PCBQKTsKICAgIGJ5dGVjIDkgLy8gMHgwMTAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNwogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzQKICAgIC8vIHVzZXJSZXdhcmREZWJ0ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA1IC8vICJ1c2VyUmV3YXJkRGVidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTcKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSk7CiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTgKICAgIC8vIGlmIChwZW5kaW5nID4gMCkgewogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGRlcG9zaXRMcF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTkKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiB0byB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTkKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiB0byB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTIwCiAgICAvLyBlbWl0PFJld2FyZHNDbGFpbWVkPih7IHVzZXI6IG5ldyBBZGRyZXNzKHRvKSwgcGVuZGluZyB9KTsKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAyNSAvLyBtZXRob2QgIlJld2FyZHNDbGFpbWVkKGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCgpkZXBvc2l0THBfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyMgogICAgLy8gZW1pdDxEZXBvc2l0Pih7IHRvOiBuZXcgQWRkcmVzcyh0byksIGxwQW1vdW50IH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4Y2ZhYjg3MjMgLy8gbWV0aG9kICJEZXBvc2l0KGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo6T3duYWJsZS5vbmx5T3duZXIoKSAtPiB2b2lkOgpvbmx5T3duZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgb3duZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjpPd25hYmxlLnRyYW5zZmVyT3duZXJzaGlwKG5ld093bmVyOiBieXRlcykgLT4gdm9pZDoKdHJhbnNmZXJPd25lcnNoaXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNi0xNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGJ5dGVjIDE0IC8vICJvd25lciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE5CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gbmV3T3duZXI7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK",clear:"I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg=="},byteCode:{approval:"CiAFAAEIBJBOJhwMdG9rZW5CYWxhbmNlC3ZVc2RCYWxhbmNlBWFzc2V0CHJlc2VydmVzB2JhbGFuY2UOdXNlclJld2FyZERlYnQBZAt0b3RhbFN1cHBseRJhY2NSZXdhcmRQZXJTaGFyZVAHAQAAAAAAAAEBDmFkbWluRmVlQW1vdW50CmNhbkRlcG9zaXQLY2FuV2l0aGRyYXcFb3duZXIKZmVlU2hhcmVCUBFiYWxhbmNlUmF0aW9NaW5CUAECD2FkbWluRmVlU2hhcmVCUAQVH3x1AWEGcm91dGVyDXN0b3BBdXRob3JpdHkRdG9rZW5BbW91bnRSZWR1Y2UTdG9rZW5BbW91bnRJbmNyZWFzZQS6gYB2AQMJAQAAAAAAAAAAMRhAACgnEoHQD2cnByJnJwiAAGcnCyJnKCJnKSJnKyJnJwYiZycMI2cnDSNnMRtBAKiCFwRRbTR7BAGjo/8EdhCkYAToOoerBJLgOxwEIfHd/wTZeK0UBA0bTAYEdb+aKAT0k9ftBI1ctt8E/gSlzgQCjghZBEH8lm4Eq/IAFAQEsWHxBGZZHM8Epa5r0QSgTFvEBDYbYVkEMruwEQS4d57nBOF7r7Q2GgCOFwFhAVQBSAE/ATMBIwEFAOMA0wDHALcAqwCfAJMAhwB4AGkAXQBNAEEAKQARAAIiQzEZFEQxGEQ2GgGICuAjQzEZFEQxGESADBUffHUAAAAAAAAAA7AjQzEZFEQxGEQ2GgEXwByICbMWJxNMULAjQzEZFEQxGESICXEjQzEZFEQxGEQ2GgEXiAlPI0MxGRREMRhEiAjlI0MxGRREMRhENhoBiAY/I0MxGRREMRhENhoBiAYkI0MxGRREMRhEiAYQI0MxGRREMRhEiAX8I0MxGRREMRhEiAXoI0MxGRREMRhEiAXUI0MxGRREMRhENhoBF4gFsiNDMRkURDEYRIgFfSNDMRkURDEYRDYaAReIBVsjQzEZFEQxGEQ2GgE2GgIXNhoDFzYaBCJTiAR7FicTTFCwI0MxGRREMRhENhoBNhoCFzYaAyJTiAO+FicTTFCwI0MxGRREMRhENhoBF4gCcCNDMRkURDEYRIgBfiNDMRkURDEYRCNDMRkURDEYRIgA4iNDMRkjEkQxGESIAK4jQzEZFEQxGBRENhoBNhoCNhoDFzYaBBc2GgUXNhoGF4gAKiNDigEBi/8VSSQNQQAYiwAkCUmLAElOAw9LAkxNi/9MTwJSF0yJIkL/6IoGACcOi/pnKov9ZycUi/xnJxWL+2cnFov6ZycPi/5nJxCL/2ciKmVEcQFMSU8CRIEDDUEAJ4sAgQMJgQpMlCcXTGeLAIEDDEEADoEDiwAJgQpMlCcYTGeJIkL/9yJC/96KAAAxAEkiJwRjRQFAAAaLACcEImaLACInBWNFAUAABosAJwUiZomICK6xIiplRDIKshQishKyESWyECKyAbOAFlBvb2w6IG9wdC1pbiBjb21wbGV0ZWSwiTEAIicVZUQSRIkxACInFmVEEkSJigAAIihlTElPAkQiKWVMSU4CTgNEDUEAEIsBIQQLiwAKIicQZUQPRImLAIsBDEH/94sAIQQLiwEKIicQZUQPRImKAAAiJwxlREQiJwZlTElPAkQiKmVEMRZEMRYjCUk4ECUSREk4FDIKEkRJOBFPAhJESTggMgMSREk4FTIDEkQ4EogE2klOAklEIitlRAgrTGciKGVMSU4CTgNEIillTElOAk4ERAhMQQAFiwRAADSLASORIihlREsBCChMZyIpZUQIKUxniAQiMQAiJwZlRIsACYgG/CIoZUSBgICAgIAgDESJIihlRIsBFosCFksBo4sEFkxLAaJJFSQORCSvTEsBqxdPBAgoTGciKWVEiwMWTwSjTwOiSRUkDkRPAqsXCClMZ0L/n4oBACInDWVERCInBmVEMQBJIicEY0xJTwJESYv/D0QiJwhlTE4CRCJMQQAWiwIWiwOjJwmiiP2riwEiJwVjRAmMBIsCi/8JiwFJIicEY0SL/wlLAScETwJmIicHZUSL/wknB0xnTBaLA6MnCaKI/XMnBUxmiwRBACOxIiplRIsBSU4CshSLBElOArISshElshAisgGzFlAnGUxQsIv/FosBSwFQgATTr6TxTFCwIihlRCIpZURKCCIoZURPAxZLBKNLAhZMSwGiSRUkDkQkr0xLAasXTwNMCShMZyIpZURPBBZPBaNPA6JJFSQORE8CqxcJKUxnIihlRCIpZUQIDUQiK2VEi/8PRCIrZUSL/wkrTGeIAq8iJwZlRIsADESxIiplRIv/iANBMQCyFLISshElshAisgGziYoDAYAAiP2FIkcDi/5BAGGL/0AADSInD2VEi/4LIQQKjAKL/osCCYgC1kmIAwOL/kwJjAIiKGVESwEIKExnIitlRAgrTGciKGVEiAGbSYwAIillRAxBAAkiKWVEiwAJjAEpiwBniwJJiATIjAOLAYwEiwOLBCIqZUQWi/4WSwIWTwQWi/1PBFBPA1BPAlBMUIAEK7vso0xQsIj9BYwAiYoEAYAASYj85SJHBIv9QQCFIillRIv9CClMZyIpZUSIASdJjAAiKGVMSU4CjAFEDEEADYsBiwAJSYwCiAJUjAMiK2VEiwJJTwIORCIrZURMCStMZ4v/QAANIicPZUSLAwshBAqMBIsDiwRJTgIJKIsAZ0mL/g9EsSIqZUSL/LIUSwGyErIRJbIQIrIBs0sBiAQCjAaMBYsFiwYiKmVEFov9FksCFk8EFov8TwRQTwNQTwJQTFCABNPx1UJMULCI/EGMAImKAQCIBKOL/yEEDkQnD4v/Z4mKAACIBJEiJwZlTElPAkQiJwdlTElOAk4DRA1BAAoxAIsAiwEJiAPWiYoBAIgEaIv/IQQORCcQi/9niYj75CcMImeJiARRJwwjZ4mI+9QnDSJniYgEQScNI2eJigEAiAQ2JxaL/2eJigEAiAQqJxWL/2eJigEBIkmL/xZJIicGZUQWSU4CIicUZUSBApAWSU4DJxGjTgKmSUEAdIsDiwKhiwSjjACLBkEAWosAiwOnQQBHiwCLA6GMASOLBIsDSU4Co0sBo6OLAUmjiwJJTwKjTwKgo4gBFkxBABWLAosBo6CLBYsCo6InCqCI+kmMAImLAosBo6FC/+iLA4sAoYwBIkL/tosAiwOgjAEiQv+riwKLA6FC/4mKAAAiKGVEFiIpZUQWSqMiJxRlRBZJSwKjTwRPBKCjSU4CTgOAAQSjJwqhTwKjJxqiSwFLAqNLAUsCo08Co6CIAJRJTgJKoIgA8k4DpEEAFYsAoYgA5osBTAmMAYsBI5AnBkxniYsATKGIANCLAQiMAUL/6IoBASInF2VMSU8CRCInGGVMTgJEQQAIi/+LAAqMAImLAUEACIv/iwELjACJi/+MAImKAQEiJxdlTElPAkQiJxhlTE4CREEACIv/iwALjACJiwFBAAiL/4sBCowAiYv/jACJigEBIkmL/4AApUSL/4AAqEEABYAAjACJi/8nGqZBAAUnCowAiYv/kyMIgQIKgQJMlUwWTBZMJxujoEmMAIv/SwGioCcRoowBiwGLAKRBABWL/4sBSU4CoksBoCcRoowBjABC/+OJigEBIkcDi/+AAKhBAAQijACJi/+AAQikQQAEI4wAiYv/k4ECCIEDCoECTJVMFkwWTCcbo6CMAYsBSaNJjAOAAKhAACcnEYsBSU4Co4v/iwOioCcaokmMAKhAAAuLAScKoYsAqEEAPYsAjAGLAScKoEmMAklLAaOji/+mQQAHiwKMAUL/5osBSUsBo6OL/6VBAAqLAScKoYwBQv/piwGI+EKMAImLAIwBQv+MigAAgABJMQBJIicEY0xJTwJEQQBIiwMWIicIZUSjJwmiiPgUSYwBiwIiJwVjRAlJjABBACiLAkknBYsBZrEiKmVESwGyFIsASU4CshKyESWyECKyAbMWUCcZTFCwiYoBAIgBNYv/IQQORCcSi/9niYoAAIgBIyInC2VMSU8CREEAHbEiKmVEIicOZUSyFIsAshKyESWyECKyAbMnCyJniYoBAYv/IicEY0QWIicIZUSjJwmiiPeBi/8iJwVjRAmJigEAIicHZUxJTwJEQQAwIicSZUSL/wshBAqL/0sBCYz/IicIZUSL/xYnCaOLABaioCcITGciJwtlRAgnC0xniYoCACInCGVEIov+IicEY0xJTwJEQQAWiwIWiwCjJwmiiPcVi/4iJwVjRAmMAYsCi/8Ii/4iJwRjRIv/CIv+JwRPAmYiJwdlRIv/CCcHTGcWiwCjJwmiiPbfi/4nBU8CZosBQQAjsSIqZUSL/rIUiwFJTgKyErIRJbIQIrIBsxaL/kxQJxlMULCL/xaL/kxQgATPq4cjTFCwiTEAIicOZUQSRImKAQCI//AnDov/Z4k=",clear:"CoEBQw=="},events:[{name:"RewardsClaimed",args:[{type:"address",name:"user"},{type:"uint64",name:"pending"}]},{name:"Deposit",args:[{type:"address",name:"to"},{type:"uint64",name:"lpAmount"}]},{name:"Withdraw",args:[{type:"address",name:"from"},{type:"uint64",name:"lpAmount"}]},{name:"SwappedToVUsd",args:[{type:"address",name:"sender"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"amount"},{type:"uint64",name:"vUsdAmount"},{type:"uint64",name:"fee"}]},{name:"SwappedFromVUsd",args:[{type:"address",name:"recipient"},{type:"uint64",name:"tokenId"},{type:"uint64",name:"vUsdAmount"},{type:"uint64",name:"amount"},{type:"uint64",name:"fee"}]}],templateVariables:{}},ei=class{constructor(i){this.value=i}asByteArray(){return this.value}asString(){return this.value!==void 0?Buffer.from(this.value).toString("utf-8"):void 0}},v=class r{static get create(){return{_resolveByMethod(i){switch(i.method){case"createApplication":case"createApplication(address,address,uint64,uint64,uint64,uint64)void":return r.create.createApplication(i)}throw new Error("Unknown ' + verb + ' method")},createApplication(i){return{...i,method:"createApplication(address,address,uint64,uint64,uint64,uint64)void",args:Array.isArray(i.args)?i.args:[i.args.owner,i.args.router,i.args.a,i.args.assetId,i.args.feeShareBp,i.args.balanceRatioMinBp]}}}}static get optIn(){return{optInToApplication(i){return{...i,method:"optInToApplication()void",args:Array.isArray(i.args)?i.args:[]}}}}static optInAsset(i){return{...i,method:"optInAsset()void",args:Array.isArray(i.args)?i.args:[]}}static noop(i){return{...i,method:"noop()void",args:Array.isArray(i.args)?i.args:[]}}static deposit(i){return{...i,method:"deposit()void",args:Array.isArray(i.args)?i.args:[]}}static withdraw(i){return{...i,method:"withdraw(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.amountLp]}}static swapToVUsd(i){return{...i,method:"swapToVUsd(address,uint64,bool)uint64",args:Array.isArray(i.args)?i.args:[i.args.user,i.args.amount,i.args.zeroFee]}}static swapFromVUsd(i){return{...i,method:"swapFromVUsd(address,uint64,uint64,bool)uint64",args:Array.isArray(i.args)?i.args:[i.args.user,i.args.amount,i.args.receiveAmountMin,i.args.zeroFee]}}static setFeeShare(i){return{...i,method:"setFeeShare(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.feeShareBp]}}static adjustTotalLpAmount(i){return{...i,method:"adjustTotalLpAmount()void",args:Array.isArray(i.args)?i.args:[]}}static setBalanceRatioMinBp(i){return{...i,method:"setBalanceRatioMinBP(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.balanceRatioMinBp]}}static stopDeposit(i){return{...i,method:"stopDeposit()void",args:Array.isArray(i.args)?i.args:[]}}static startDeposit(i){return{...i,method:"startDeposit()void",args:Array.isArray(i.args)?i.args:[]}}static stopWithdraw(i){return{...i,method:"stopWithdraw()void",args:Array.isArray(i.args)?i.args:[]}}static startWithdraw(i){return{...i,method:"startWithdraw()void",args:Array.isArray(i.args)?i.args:[]}}static setStopAuthority(i){return{...i,method:"setStopAuthority(address)void",args:Array.isArray(i.args)?i.args:[i.args.stopAuthority]}}static setRouter(i){return{...i,method:"setRouter(address)void",args:Array.isArray(i.args)?i.args:[i.args.router]}}static claimRewards(i){return{...i,method:"claimRewards()void",args:Array.isArray(i.args)?i.args:[]}}static setAdminFeeShare(i){return{...i,method:"setAdminFeeShare(uint64)void",args:Array.isArray(i.args)?i.args:[i.args.adminFeeShareBp]}}static claimAdminFee(i){return{...i,method:"claimAdminFee()void",args:Array.isArray(i.args)?i.args:[]}}static pendingReward(i){return{...i,method:"pendingReward(account)uint64",args:Array.isArray(i.args)?i.args:[i.args.user]}}static decimals(i){return{...i,method:"decimals()uint64",args:Array.isArray(i.args)?i.args:[]}}static transferOwnership(i){return{...i,method:"transferOwnership(address)void",args:Array.isArray(i.args)?i.args:[i.args.newOwner]}}};var ti=class r{appClient;constructor(i){this.appClient=i instanceof $n?i:new $n({...i,appSpec:qn})}decodeReturnValue(i,a){return a!==void 0?Xs(a,this.appClient.getABIMethod(i),qn.structs):void 0}static async fromCreatorAndName(i){return new r(await $n.fromCreatorAndName({...i,appSpec:qn}))}static async fromNetwork(i){return new r(await $n.fromNetwork({...i,appSpec:qn}))}get appId(){return this.appClient.appId}get appAddress(){return this.appClient.appAddress}get appName(){return this.appClient.appName}get appSpec(){return this.appClient.appSpec}get algorand(){return this.appClient.algorand}params={optIn:{optInToApplication:(i={args:[]})=>this.appClient.params.optIn(v.optIn.optInToApplication(i))},clearState:i=>this.appClient.params.bare.clearState(i),optInAsset:(i={args:[]})=>this.appClient.params.call(v.optInAsset(i)),noop:(i={args:[]})=>this.appClient.params.call(v.noop(i)),deposit:(i={args:[]})=>this.appClient.params.call(v.deposit(i)),withdraw:i=>this.appClient.params.call(v.withdraw(i)),swapToVUsd:i=>this.appClient.params.call(v.swapToVUsd(i)),swapFromVUsd:i=>this.appClient.params.call(v.swapFromVUsd(i)),setFeeShare:i=>this.appClient.params.call(v.setFeeShare(i)),adjustTotalLpAmount:(i={args:[]})=>this.appClient.params.call(v.adjustTotalLpAmount(i)),setBalanceRatioMinBp:i=>this.appClient.params.call(v.setBalanceRatioMinBp(i)),stopDeposit:(i={args:[]})=>this.appClient.params.call(v.stopDeposit(i)),startDeposit:(i={args:[]})=>this.appClient.params.call(v.startDeposit(i)),stopWithdraw:(i={args:[]})=>this.appClient.params.call(v.stopWithdraw(i)),startWithdraw:(i={args:[]})=>this.appClient.params.call(v.startWithdraw(i)),setStopAuthority:i=>this.appClient.params.call(v.setStopAuthority(i)),setRouter:i=>this.appClient.params.call(v.setRouter(i)),claimRewards:(i={args:[]})=>this.appClient.params.call(v.claimRewards(i)),setAdminFeeShare:i=>this.appClient.params.call(v.setAdminFeeShare(i)),claimAdminFee:(i={args:[]})=>this.appClient.params.call(v.claimAdminFee(i)),pendingReward:i=>this.appClient.params.call(v.pendingReward(i)),decimals:(i={args:[]})=>this.appClient.params.call(v.decimals(i)),transferOwnership:i=>this.appClient.params.call(v.transferOwnership(i))};createTransaction={optIn:{optInToApplication:(i={args:[]})=>this.appClient.createTransaction.optIn(v.optIn.optInToApplication(i))},clearState:i=>this.appClient.createTransaction.bare.clearState(i),optInAsset:(i={args:[]})=>this.appClient.createTransaction.call(v.optInAsset(i)),noop:(i={args:[]})=>this.appClient.createTransaction.call(v.noop(i)),deposit:(i={args:[]})=>this.appClient.createTransaction.call(v.deposit(i)),withdraw:i=>this.appClient.createTransaction.call(v.withdraw(i)),swapToVUsd:i=>this.appClient.createTransaction.call(v.swapToVUsd(i)),swapFromVUsd:i=>this.appClient.createTransaction.call(v.swapFromVUsd(i)),setFeeShare:i=>this.appClient.createTransaction.call(v.setFeeShare(i)),adjustTotalLpAmount:(i={args:[]})=>this.appClient.createTransaction.call(v.adjustTotalLpAmount(i)),setBalanceRatioMinBp:i=>this.appClient.createTransaction.call(v.setBalanceRatioMinBp(i)),stopDeposit:(i={args:[]})=>this.appClient.createTransaction.call(v.stopDeposit(i)),startDeposit:(i={args:[]})=>this.appClient.createTransaction.call(v.startDeposit(i)),stopWithdraw:(i={args:[]})=>this.appClient.createTransaction.call(v.stopWithdraw(i)),startWithdraw:(i={args:[]})=>this.appClient.createTransaction.call(v.startWithdraw(i)),setStopAuthority:i=>this.appClient.createTransaction.call(v.setStopAuthority(i)),setRouter:i=>this.appClient.createTransaction.call(v.setRouter(i)),claimRewards:(i={args:[]})=>this.appClient.createTransaction.call(v.claimRewards(i)),setAdminFeeShare:i=>this.appClient.createTransaction.call(v.setAdminFeeShare(i)),claimAdminFee:(i={args:[]})=>this.appClient.createTransaction.call(v.claimAdminFee(i)),pendingReward:i=>this.appClient.createTransaction.call(v.pendingReward(i)),decimals:(i={args:[]})=>this.appClient.createTransaction.call(v.decimals(i)),transferOwnership:i=>this.appClient.createTransaction.call(v.transferOwnership(i))};send={optIn:{optInToApplication:async(i={args:[]})=>{let a=await this.appClient.send.optIn(v.optIn.optInToApplication(i));return{...a,return:a.return}}},clearState:i=>this.appClient.send.bare.clearState(i),optInAsset:async(i={args:[]})=>{let a=await this.appClient.send.call(v.optInAsset(i));return{...a,return:a.return}},noop:async(i={args:[]})=>{let a=await this.appClient.send.call(v.noop(i));return{...a,return:a.return}},deposit:async(i={args:[]})=>{let a=await this.appClient.send.call(v.deposit(i));return{...a,return:a.return}},withdraw:async i=>{let a=await this.appClient.send.call(v.withdraw(i));return{...a,return:a.return}},swapToVUsd:async i=>{let a=await this.appClient.send.call(v.swapToVUsd(i));return{...a,return:a.return}},swapFromVUsd:async i=>{let a=await this.appClient.send.call(v.swapFromVUsd(i));return{...a,return:a.return}},setFeeShare:async i=>{let a=await this.appClient.send.call(v.setFeeShare(i));return{...a,return:a.return}},adjustTotalLpAmount:async(i={args:[]})=>{let a=await this.appClient.send.call(v.adjustTotalLpAmount(i));return{...a,return:a.return}},setBalanceRatioMinBp:async i=>{let a=await this.appClient.send.call(v.setBalanceRatioMinBp(i));return{...a,return:a.return}},stopDeposit:async(i={args:[]})=>{let a=await this.appClient.send.call(v.stopDeposit(i));return{...a,return:a.return}},startDeposit:async(i={args:[]})=>{let a=await this.appClient.send.call(v.startDeposit(i));return{...a,return:a.return}},stopWithdraw:async(i={args:[]})=>{let a=await this.appClient.send.call(v.stopWithdraw(i));return{...a,return:a.return}},startWithdraw:async(i={args:[]})=>{let a=await this.appClient.send.call(v.startWithdraw(i));return{...a,return:a.return}},setStopAuthority:async i=>{let a=await this.appClient.send.call(v.setStopAuthority(i));return{...a,return:a.return}},setRouter:async i=>{let a=await this.appClient.send.call(v.setRouter(i));return{...a,return:a.return}},claimRewards:async(i={args:[]})=>{let a=await this.appClient.send.call(v.claimRewards(i));return{...a,return:a.return}},setAdminFeeShare:async i=>{let a=await this.appClient.send.call(v.setAdminFeeShare(i));return{...a,return:a.return}},claimAdminFee:async(i={args:[]})=>{let a=await this.appClient.send.call(v.claimAdminFee(i));return{...a,return:a.return}},pendingReward:async i=>{let a=await this.appClient.send.call(v.pendingReward(i));return{...a,return:a.return}},decimals:async(i={args:[]})=>{let a=await this.appClient.send.call(v.decimals(i));return{...a,return:a.return}},transferOwnership:async i=>{let a=await this.appClient.send.call(v.transferOwnership(i));return{...a,return:a.return}}};clone(i){return new r(this.appClient.clone(i))}async pendingReward(i){return(await this.appClient.send.call(v.pendingReward(i))).return}async decimals(i={args:[]}){return(await this.appClient.send.call(v.decimals(i))).return}state={global:{getAll:async()=>{let i=await this.appClient.state.global.getAll();return{feeShareBp:i.feeShareBP,router:i.router,tokenBalance:i.tokenBalance,vUsdBalance:i.vUsdBalance,balanceRatioMinBp:i.balanceRatioMinBP,reserves:i.reserves,a:i.a,d:i.d,tokenAmountReduce:i.tokenAmountReduce,tokenAmountIncrease:i.tokenAmountIncrease,stopAuthority:i.stopAuthority,canDeposit:i.canDeposit,canWithdraw:i.canWithdraw,asset:i.asset,adminFeeShareBp:i.adminFeeShareBP,totalSupply:i.totalSupply,accRewardPerShareP:new ei(i.accRewardPerShareP),adminFeeAmount:i.adminFeeAmount,owner:i.owner}},feeShareBp:async()=>await this.appClient.state.global.getValue("feeShareBP"),router:async()=>await this.appClient.state.global.getValue("router"),tokenBalance:async()=>await this.appClient.state.global.getValue("tokenBalance"),vUsdBalance:async()=>await this.appClient.state.global.getValue("vUsdBalance"),balanceRatioMinBp:async()=>await this.appClient.state.global.getValue("balanceRatioMinBP"),reserves:async()=>await this.appClient.state.global.getValue("reserves"),a:async()=>await this.appClient.state.global.getValue("a"),d:async()=>await this.appClient.state.global.getValue("d"),tokenAmountReduce:async()=>await this.appClient.state.global.getValue("tokenAmountReduce"),tokenAmountIncrease:async()=>await this.appClient.state.global.getValue("tokenAmountIncrease"),stopAuthority:async()=>await this.appClient.state.global.getValue("stopAuthority"),canDeposit:async()=>await this.appClient.state.global.getValue("canDeposit"),canWithdraw:async()=>await this.appClient.state.global.getValue("canWithdraw"),asset:async()=>await this.appClient.state.global.getValue("asset"),adminFeeShareBp:async()=>await this.appClient.state.global.getValue("adminFeeShareBP"),totalSupply:async()=>await this.appClient.state.global.getValue("totalSupply"),accRewardPerShareP:async()=>new ei(await this.appClient.state.global.getValue("accRewardPerShareP")),adminFeeAmount:async()=>await this.appClient.state.global.getValue("adminFeeAmount"),owner:async()=>await this.appClient.state.global.getValue("owner")},local:i=>{let a=typeof i=="string"?i:Ss(i.publicKey);return{getAll:async()=>{let o=await this.appClient.state.local(a).getAll();return{balance:o.balance,userRewardDebt:o.userRewardDebt}},balance:async()=>await this.appClient.state.local(a).getValue("balance"),userRewardDebt:async()=>await this.appClient.state.local(a).getValue("userRewardDebt")}}};newGroup(){let i=this,a=this.algorand.newGroup(),o=Promise.resolve(),s=[];return{optInAsset(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.optInAsset(d))),s.push(void 0),this},noop(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.noop(d))),s.push(void 0),this},deposit(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.deposit(d))),s.push(void 0),this},withdraw(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.withdraw(d))),s.push(void 0),this},swapToVUsd(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swapToVUsd(d))),s.push(A=>i.decodeReturnValue("swapToVUsd(address,uint64,bool)uint64",A)),this},swapFromVUsd(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.swapFromVUsd(d))),s.push(A=>i.decodeReturnValue("swapFromVUsd(address,uint64,uint64,bool)uint64",A)),this},setFeeShare(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setFeeShare(d))),s.push(void 0),this},adjustTotalLpAmount(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.adjustTotalLpAmount(d))),s.push(void 0),this},setBalanceRatioMinBp(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setBalanceRatioMinBp(d))),s.push(void 0),this},stopDeposit(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.stopDeposit(d))),s.push(void 0),this},startDeposit(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.startDeposit(d))),s.push(void 0),this},stopWithdraw(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.stopWithdraw(d))),s.push(void 0),this},startWithdraw(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.startWithdraw(d))),s.push(void 0),this},setStopAuthority(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setStopAuthority(d))),s.push(void 0),this},setRouter(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setRouter(d))),s.push(void 0),this},claimRewards(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.claimRewards(d))),s.push(void 0),this},setAdminFeeShare(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.setAdminFeeShare(d))),s.push(void 0),this},claimAdminFee(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.claimAdminFee(d))),s.push(void 0),this},pendingReward(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.pendingReward(d))),s.push(A=>i.decodeReturnValue("pendingReward(account)uint64",A)),this},decimals(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.decimals(d))),s.push(A=>i.decodeReturnValue("decimals()uint64",A)),this},transferOwnership(d){return o=o.then(async()=>a.addAppCallMethodCall(await i.params.transferOwnership(d))),s.push(void 0),this},get optIn(){return{optInToApplication:d=>(o=o.then(async()=>a.addAppCallMethodCall(await i.params.optIn.optInToApplication(d))),s.push(void 0),this)}},clearState(d){return o=o.then(()=>a.addAppCall(i.params.clearState(d))),this},addTransaction(d,A){return o=o.then(()=>a.addTransaction(d,A)),this},async composer(){return await o,a},async simulate(d){await o;let A=await(d?a.simulate(d):a.simulate());return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}},async send(d){await o;let A=await a.send(d);return{...A,returns:A.returns?.map((g,c)=>s[c]!==void 0?s[c](g):g.returnValue)}}}}};var $=class{lpAmount;rewardDebt;constructor(i){this.lpAmount=i.lpAmount,this.rewardDebt=i.rewardDebt}get userLiquidity(){return F(this.lpAmount,3).toFixed()}earned(i,a){let o=Sa(this.lpAmount,this.rewardDebt,i.accRewardPerShareP,i.p);return a?F(o,a).toFixed():o}};var ae=class{};var on=class extends ae{constructor(a,o){super();this.algorand=a;this.api=o}chainType="ALG";P=48;async buildRawTransactionClaimRewards(a){let o=a.accountAddress,s=BigInt(a.token.tokenAddress),d=BigInt(a.token.poolAddress),A=this.getPool(d),g=this.algorand.newGroup();g.addAppCallMethodCall(await A.params.claimRewards({args:[],sender:o,extraFee:ct(1),assetReferences:[s]}));let{transactions:c}=await g.buildTransactions();return c=ma(c),et(...c)}async buildRawTransactionDeposit(a){let o=a.accountAddress,s=BigInt(a.amount),d=BigInt(a.token.tokenAddress),A=BigInt(a.token.poolAddress),g=this.getPool(A),c=await wn(A,o,this.algorand),l=this.algorand.newGroup();c||l.addAppCallMethodCall(await g.params.optIn.optInToApplication({args:[],sender:o})),l.addAssetTransfer({assetId:d,amount:s,sender:o,receiver:g.appAddress}),l.addAppCallMethodCall(await g.params.deposit({args:[],sender:o,extraFee:ct(1)})),Rt({composer:l,appId:A,sender:o,count:4});let{transactions:u}=await l.buildTransactions();return u=ma(u),et(...u)}async buildRawTransactionWithdraw(a){let o=a.accountAddress,s=BigInt(a.amount),d=BigInt(a.token.tokenAddress),A=BigInt(a.token.poolAddress),g=this.getPool(A),c=this.algorand.newGroup();c.addAppCallMethodCall(await g.params.withdraw({args:{amountLp:s},sender:o,extraFee:ct(2),assetReferences:[d]})),Rt({composer:c,appId:A,sender:o,count:4});let{transactions:l}=await c.buildTransactions();return l=ma(l),et(...l)}async getPoolInfoFromChain(a){let s=await this.getPool(BigInt(a.poolAddress)).state.global.getAll(),d=s.a?.toString(),A=s.d?.toString(),g=s.tokenBalance?.toString(),c=s.vUsdBalance?.toString(),l=s.totalSupply?.toString(),u=Vs(s.accRewardPerShareP?.asByteArray()??Uint8Array.from([])).toString();if(d&&A&&g&&c&&l&&u){let p=q({tokenBalance:g,vUsdBalance:c});return{aValue:d,dValue:A,tokenBalance:g,vUsdBalance:c,totalLpAmount:l,accRewardPerShareP:u,p:this.P,imbalance:p}}throw new I("Unable to pool info from chain")}async getUserBalanceInfo(a,o){let s=BigInt(o.poolAddress),d=this.getPool(s);try{let{balance:A,userRewardDebt:g}=await d.state.local(a).getAll();if(A!==void 0&&g!==void 0)return new $({lpAmount:A.toString(),rewardDebt:g.toString()})}catch{let c=(await this.algorand.account.getInformation(a)).appsLocalState;if(c&&!c.find(({id:u})=>u===s))return new $({lpAmount:"0",rewardDebt:"0"})}throw new I("Unable to get user balance")}getPool(a){return this.algorand.client.getTypedAppClientById(ti,{appId:a})}};import{Web3 as dt}from"web3";var Ms={abi:[{inputs:[{internalType:"address",name:"_router",type:"address"},{internalType:"uint256",name:"_a",type:"uint256"},{internalType:"contract ERC20",name:"_token",type:"address"},{internalType:"uint16",name:"_feeShareBP",type:"uint16"},{internalType:"uint256",name:"_balanceRatioMinBP",type:"uint256"},{internalType:"string",name:"lpName",type:"string"},{internalType:"string",name:"lpSymbol",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Deposit",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"RewardsClaimed",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"recipient",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"vUsdAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"fee",type:"uint256"}],name:"SwappedFromVUsd",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"sender",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"vUsdAmount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"fee",type:"uint256"}],name:"SwappedToVUsd",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdraw",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"a",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"accRewardPerShareP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"adjustTotalLpAmount",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"adminFeeAmount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"adminFeeShareBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"balanceRatioMinBP",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"canDeposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"canWithdraw",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"claimAdminFee",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"claimRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"d",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"}],name:"deposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"feeShareBP",outputs:[{internalType:"uint16",name:"",type:"uint16"}],stateMutability:"view",type:"function"},{inputs:[],name:"getPrice",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"x",type:"uint256"}],name:"getY",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"pendingReward",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"reserves",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"router",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"_adminFeeShareBP",type:"uint256"}],name:"setAdminFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"_balanceRatioMinBP",type:"uint256"}],name:"setBalanceRatioMinBP",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint16",name:"_feeShareBP",type:"uint16"}],name:"setFeeShare",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_router",type:"address"}],name:"setRouter",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"_stopAuthority",type:"address"}],name:"setStopAuthority",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startDeposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"startWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopDeposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"stopWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"receiveAmountMin",type:"uint256"},{internalType:"bool",name:"zeroFee",type:"bool"}],name:"swapFromVUsd",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"bool",name:"zeroFee",type:"bool"}],name:"swapToVUsd",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"token",outputs:[{internalType:"contract ERC20",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"tokenBalance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"}],name:"userRewardDebt",outputs:[{internalType:"uint256",name:"amount",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"vUsdBalance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"amountLp",type:"uint256"}],name:"withdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},rn=Ms;var sn=class extends ae{constructor(a,o){super();this.web3=a;this.api=o}chainType="EVM";P=52;async getUserBalanceInfo(a,o){let s;try{s=await Tn(this.getUserBalanceInfoByBatch(a,o),`Cannot get UserBalanceInfo for ${o.name} on ${o.chainSymbol}`,5e3)}catch{s=await Hi(()=>this.getUserBalanceInfoPerProperty(a,o),`Cannot get UserBalanceInfo for ${o.name} on ${o.chainSymbol}`,5,2e3)}return s}async getPoolInfoFromChain(a){let o;try{o=await Tn(this.getPoolInfoByBatch(a),`Cannot get PoolInfo for ${a.name} on ${a.chainSymbol}`,5e3)}catch{o=await Hi(()=>this.getPoolInfoPerProperty(a),`Cannot get PoolInfo for ${a.name} on ${a.chainSymbol}`,5,2e3)}return o}async getUserBalanceInfoByBatch(a,o){let s=new this.web3.eth.BatchRequest,d=this.getPoolContract(o.poolAddress),A=d.methods.userRewardDebt(a).encodeABI(),g=d.methods.balanceOf(a).encodeABI();s.add({method:"eth_call",params:[{to:o.poolAddress,data:A},"latest"]}),s.add({method:"eth_call",params:[{to:o.poolAddress,data:g},"latest"]});let[c,l]=await s.execute();if(c&&l&&!c.error&&!l.error)return new $({lpAmount:dt.utils.toBigInt(l.result).toString(),rewardDebt:dt.utils.toBigInt(c.result).toString()});throw new Error("Batched failed")}async getUserBalanceInfoPerProperty(a,o){let s=(await this.getPoolContract(o.poolAddress).methods.userRewardDebt(a).call()).toString(),d=(await this.getPoolContract(o.poolAddress).methods.balanceOf(a).call()).toString();return new $({lpAmount:d,rewardDebt:s})}async getPoolInfoByBatch(a){let o=new this.web3.eth.BatchRequest,s=this.getPoolContract(a.poolAddress),d=s.methods.a().encodeABI(),A=s.methods.d().encodeABI(),g=s.methods.tokenBalance().encodeABI(),c=s.methods.vUsdBalance().encodeABI(),l=s.methods.totalSupply().encodeABI(),u=s.methods.accRewardPerShareP().encodeABI();o.add({method:"eth_call",params:[{to:a.poolAddress,data:d},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:A},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:g},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:c},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:l},"latest"]}),o.add({method:"eth_call",params:[{to:a.poolAddress,data:u},"latest"]});let[p,m,y,Y,h,B]=await o.execute();if(p&&m&&y&&Y&&h&&B&&!p.error&&!m.error&&!y.error&&!Y.error&&!h.error&&!B.error){let W=dt.utils.toBigInt(y.result).toString(),C=dt.utils.toBigInt(Y.result).toString(),f=q({tokenBalance:W,vUsdBalance:C});return{aValue:dt.utils.toBigInt(p.result).toString(),dValue:dt.utils.toBigInt(m.result).toString(),tokenBalance:W,vUsdBalance:C,totalLpAmount:dt.utils.toBigInt(h.result).toString(),accRewardPerShareP:dt.utils.toBigInt(B.result).toString(),p:this.P,imbalance:f}}throw new Error("Batched failed")}async getPoolInfoPerProperty(a){let o=this.getPoolContract(a.poolAddress),s=(await o.methods.a().call()).toString(),d=(await o.methods.d().call()).toString(),A=(await o.methods.tokenBalance().call()).toString(),g=(await o.methods.vUsdBalance().call()).toString(),c=(await o.methods.totalSupply().call()).toString(),l=(await o.methods.accRewardPerShareP().call()).toString(),u=q({tokenBalance:A,vUsdBalance:g});return{aValue:s,dValue:d,tokenBalance:A,vUsdBalance:g,totalLpAmount:c,accRewardPerShareP:l,p:this.P,imbalance:u}}async buildRawTransactionDeposit(a){return Promise.resolve({...this.buildTxParams(a),data:this.getPoolContract(a.token.poolAddress).methods.deposit(a.amount).encodeABI()})}async buildRawTransactionWithdraw(a){return Promise.resolve({...this.buildTxParams(a),data:this.getPoolContract(a.token.poolAddress).methods.withdraw(a.amount).encodeABI()})}async buildRawTransactionClaimRewards(a){return Promise.resolve({...this.buildTxParams(a),data:this.getPoolContract(a.token.poolAddress).methods.claimRewards().encodeABI()})}buildTxParams(a){return{from:a.accountAddress,to:a.token.poolAddress,value:"0"}}getPoolContract(a){return new this.web3.eth.Contract(rn.abi,a)}};var ni=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s}async approve(i,a){if(a){let o=i,s=a;return this.tokenService.buildRawTransactionApprove({...s,spender:s.token.poolAddress},o)}else{let o=i;return this.tokenService.buildRawTransactionApprove({...o,spender:o.token.poolAddress})}}async deposit(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),i.amount=Z(i.amount,i.token.decimals).toFixed(),Nt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionDeposit(i)}async withdraw(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),i.amount=Z(i.amount,3).toFixed(),Nt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionWithdraw(i)}async claimRewards(i,a){return Nt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).buildRawTransactionClaimRewards(i)}};import{AnchorProvider as Ps,BN as zo,Program as Ls,Spl as Hs,web3 as js}from"@project-serum/anchor";import{Connection as Js,PublicKey as At}from"@solana/web3.js";var ii=class extends ae{constructor(a,o){super();this.solanaRpcUrl=a;this.api=o}chainType="SOLANA";P=48;async getUserBalanceInfo(a,o){let s=this.buildAnchorProvider(a),d=this.getBridge(o.bridgeAddress,s),A=new At(o.poolAddress),g=await d.account.pool.fetch(A);try{let c=await Ui(new At(a),g.mint,d.programId),{lpAmount:l,rewardDebt:u}=await d.account.userDeposit.fetch(c);return new $({lpAmount:l.toString(),rewardDebt:u.toString()})}catch{return new $({lpAmount:"0",rewardDebt:"0"})}}async getPoolInfoFromChain(a){let o=this.buildAnchorProvider(a.bridgeAddress),s=await this.getBridge(a.bridgeAddress,o).account.pool.fetch(a.poolAddress),d=s.vUsdBalance.toString(),A=s.tokenBalance.toString(),g=q({tokenBalance:A,vUsdBalance:d});return{dValue:s.d.toString(),aValue:s.a.toString(),totalLpAmount:s.totalLpAmount.toString(),vUsdBalance:d,tokenBalance:A,accRewardPerShareP:s.accRewardPerShareP.toString(),p:this.P,imbalance:g}}async buildRawTransactionDeposit(a){let{bridge:o,accounts:s,preInstructions:d}=await this.prepareDataForTransaction(a),A=await o.methods.deposit(new zo(a.amount)).accounts(s).preInstructions(d).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(a.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new At(a.accountAddress),await ft(A,a.txFeeParams,this.solanaRpcUrl),A}async buildRawTransactionWithdraw(a){let{bridge:o,accounts:s,preInstructions:d}=await this.prepareDataForTransaction(a),A=await o.methods.withdraw(new zo(a.amount)).accounts(s).preInstructions(d).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(a.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new At(a.accountAddress),await ft(A,a.txFeeParams,this.solanaRpcUrl),A}async buildRawTransactionClaimRewards(a){let{bridge:o,accounts:s,preInstructions:d}=await this.prepareDataForTransaction(a),A=await o.methods.claimRewards().accounts(s).preInstructions(d).transaction();return A.recentBlockhash=(await this.buildAnchorProvider(a.accountAddress).connection.getLatestBlockhash()).blockhash,A.feePayer=new At(a.accountAddress),await ft(A,a.txFeeParams,this.solanaRpcUrl),A}async prepareDataForTransaction(a){let o=this.buildAnchorProvider(a.accountAddress),s=this.getBridge(a.token.bridgeAddress,o),{accounts:d,preInstructions:A}=await this._getLPTransactionData(s,a.token.poolAddress,a.accountAddress,o);return{bridge:s,accounts:d,preInstructions:A}}getBridge(a,o){return new Ls(en,a,o)}buildAnchorProvider(a){let o=new Js(this.solanaRpcUrl,"confirmed"),s=new At(a);return new Ps(o,{publicKey:s},{preflightCommitment:"confirmed",commitment:"confirmed"})}async _getLPTransactionData(a,o,s,d){let A=new At(s),g=await nt(a.programId),c=await Yt(a.programId),l=new At(o),p=(await a.account.pool.fetch(l)).mint,m=await Se(A,p),y=await Bt(p,a.programId),Y=await Ui(A,p,a.programId),h=[js.ComputeBudgetProgram.setComputeUnitLimit({units:1e6})];try{await Wt(m,d)}catch{let f=await Hs.associatedToken(d).methods.create().accounts({mint:p,owner:A,associatedAccount:m}).instruction();h.push(f)}try{await a.account.userDeposit.fetch(Y)}catch{let C=await a.methods.initDepositAccount().accounts({mint:p,user:A,userDeposit:Y}).instruction();h.push(C)}return{accounts:{mint:p,user:A,config:g,pool:l,bridgeAuthority:c,userDeposit:Y,userToken:m,bridgeToken:y},preInstructions:h}}};import{contract as tf}from"@stellar/stellar-sdk";import{contract as t}from"@stellar/stellar-sdk";var ks=t.Spec,zs=t.Client;var ai=class extends zs{constructor(a){super(new ks(["AAAAAAAAAAAAAAAKaW5pdGlhbGl6ZQAAAAAABwAAAAAAAAAFYWRtaW4AAAAAAAATAAAAAAAAAAZicmlkZ2UAAAAAABMAAAAAAAAAAWEAAAAAAAAKAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAADGZlZV9zaGFyZV9icAAAAAoAAAAAAAAAFGJhbGFuY2VfcmF0aW9fbWluX2JwAAAACgAAAAAAAAASYWRtaW5fZmVlX3NoYXJlX2JwAAAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAHZGVwb3NpdAAAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABmFtb3VudAAAAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAId2l0aGRyYXcAAAACAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAACWFtb3VudF9scAAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc3dhcF90b192X3VzZAAAAAAAAAMAAAAAAAAABHVzZXIAAAATAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAAPc3dhcF9mcm9tX3ZfdXNkAAAAAAQAAAAAAAAABHVzZXIAAAATAAAAAAAAAAt2dXNkX2Ftb3VudAAAAAAKAAAAAAAAABJyZWNlaXZlX2Ftb3VudF9taW4AAAAAAAoAAAAAAAAACHplcm9fZmVlAAAAAQAAAAEAAAPpAAAACgAAAAM=","AAAAAAAAAAAAAAANY2xhaW1fcmV3YXJkcwAAAAAAAAEAAAAAAAAABnNlbmRlcgAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAdgYWRtaW5gAAAAAA1zZXRfZmVlX3NoYXJlAAAAAAAAAQAAAAAAAAAMZmVlX3NoYXJlX2JwAAAACgAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAWYWRqdXN0X3RvdGFsX2xwX2Ftb3VudAAAAAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAYc2V0X2JhbGFuY2VfcmF0aW9fbWluX2JwAAAAAQAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAMc3RvcF9kZXBvc2l0AAAAAAAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAANc3RhcnRfZGVwb3NpdAAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAANc3RvcF93aXRoZHJhdwAAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAOc3RhcnRfd2l0aGRyYXcAAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAASc2V0X3N0b3BfYXV0aG9yaXR5AAAAAAABAAAAAAAAAA5zdG9wX2F1dGhvcml0eQAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAAKc2V0X2JyaWRnZQAAAAAAAQAAAAAAAAAGYnJpZGdlAAAAAAATAAAAAQAAA+kAAAPtAAAAAAAAAAM=","AAAAAAAAAAAAAAAJc2V0X2FkbWluAAAAAAAAAQAAAAAAAAAJbmV3X2FkbWluAAAAAAAAEwAAAAEAAAPpAAAD7QAAAAAAAAAD","AAAAAAAAAAAAAAATc2V0X2FkbWluX2ZlZV9zaGFyZQAAAAABAAAAAAAAABJhZG1pbl9mZWVfc2hhcmVfYnAAAAAAAAoAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAAAAAAPY2xhaW1fYWRtaW5fZmVlAAAAAAAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAAAAAAZgdmlld2AAAAAAAA5wZW5kaW5nX3Jld2FyZAAAAAAAAQAAAAAAAAAEdXNlcgAAABMAAAABAAAD6QAAAAoAAAAD","AAAAAAAAAAAAAAAIZ2V0X3Bvb2wAAAAAAAAAAQAAA+kAAAfQAAAABFBvb2wAAAAD","AAAAAAAAAAAAAAAJZ2V0X2FkbWluAAAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAASZ2V0X3N0b3BfYXV0aG9yaXR5AAAAAAAAAAAAAQAAA+kAAAATAAAAAw==","AAAAAAAAAAAAAAAKZ2V0X2JyaWRnZQAAAAAAAAAAAAEAAAPpAAAAEwAAAAM=","AAAAAAAAAAAAAAAQZ2V0X3VzZXJfZGVwb3NpdAAAAAEAAAAAAAAABHVzZXIAAAATAAAAAQAAA+kAAAfQAAAAC1VzZXJEZXBvc2l0AAAAAAM=","AAAAAAAAAAAAAAAHdXBncmFkZQAAAAABAAAAAAAAAA1uZXdfd2FzbV9oYXNoAAAAAAAD7gAAACAAAAABAAAD6QAAA+0AAAAAAAAAAw==","AAAAAQAAAAAAAAAAAAAAD1N3YXBwZWRGcm9tVlVzZAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAlyZWNpcGllbnQAAAAAAAATAAAAAAAAAAV0b2tlbgAAAAAAABMAAAAAAAAAC3Z1c2RfYW1vdW50AAAAAAo=","AAAAAQAAAAAAAAAAAAAADVN3YXBwZWRUb1ZVc2QAAAAAAAAFAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAAA2ZlZQAAAAAKAAAAAAAAAAZzZW5kZXIAAAAAABMAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAALdnVzZF9hbW91bnQAAAAACg==","AAAAAQAAAAAAAAAAAAAAB0RlcG9zaXQAAAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==","AAAAAQAAAAAAAAAAAAAACFdpdGhkcmF3AAAAAgAAAAAAAAAGYW1vdW50AAAAAAAKAAAAAAAAAAR1c2VyAAAAEw==","AAAAAQAAAAAAAAAAAAAADlJld2FyZHNDbGFpbWVkAAAAAAACAAAAAAAAAAZhbW91bnQAAAAAAAoAAAAAAAAABHVzZXIAAAAT","AAAAAQAAAAAAAAAAAAAABkJyaWRnZQAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAgAAAAAAAAAAAAAAB0RhdGFLZXkAAAAAAQAAAAEAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAEAAAAT","AAAAAQAAAAAAAAAAAAAABFBvb2wAAAAPAAAAAAAAAAFhAAAAAAAACgAAAAAAAAAWYWNjX3Jld2FyZF9wZXJfc2hhcmVfcAAAAAAACgAAAAAAAAAQYWRtaW5fZmVlX2Ftb3VudAAAAAoAAAAAAAAAEmFkbWluX2ZlZV9zaGFyZV9icAAAAAAACgAAAAAAAAAUYmFsYW5jZV9yYXRpb19taW5fYnAAAAAKAAAAAAAAAAtjYW5fZGVwb3NpdAAAAAABAAAAAAAAAAxjYW5fd2l0aGRyYXcAAAABAAAAAAAAAAFkAAAAAAAACgAAAAAAAAAIZGVjaW1hbHMAAAAEAAAAAAAAAAxmZWVfc2hhcmVfYnAAAAAKAAAAAAAAAAhyZXNlcnZlcwAAAAoAAAAAAAAABXRva2VuAAAAAAAAEwAAAAAAAAANdG9rZW5fYmFsYW5jZQAAAAAAAAoAAAAAAAAAD3RvdGFsX2xwX2Ftb3VudAAAAAAKAAAAAAAAAA12X3VzZF9iYWxhbmNlAAAAAAAACg==","AAAAAQAAAAAAAAAAAAAAC1VzZXJEZXBvc2l0AAAAAAIAAAAAAAAACWxwX2Ftb3VudAAAAAAAAAoAAAAAAAAAC3Jld2FyZF9kZWJ0AAAAAAo=","AAAAAQAAAAAAAAAAAAAABUFkbWluAAAAAAAAAQAAAAAAAAABMAAAAAAAABM=","AAAAAQAAAAAAAAAAAAAAEEdhc09yYWNsZUFkZHJlc3MAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAAAQAAAAAAAAAAAAAACEdhc1VzYWdlAAAAAQAAAAAAAAABMAAAAAAAA+wAAAAEAAAACg==","AAAAAQAAAAAAAAAAAAAAC05hdGl2ZVRva2VuAAAAAAEAAAAAAAAAATAAAAAAAAAT","AAAAAQAAAAAAAAAAAAAADVN0b3BBdXRob3JpdHkAAAAAAAABAAAAAAAAAAEwAAAAAAAAEw==","AAAABAAAAAAAAAAAAAAABUVycm9yAAAAAAAAKAAAAAAAAAANVW5pbXBsZW1lbnRlZAAAAAAAAAAAAAAAAAAAC0luaXRpYWxpemVkAAAAAAEAAAAAAAAADVVuaW5pdGlhbGl6ZWQAAAAAAAACAAAAAAAAAAxVbmF1dGhvcml6ZWQAAAADAAAAAAAAAApJbnZhbGlkQXJnAAAAAAAEAAAAAAAAAA5JbnZhbGlkQ2hhaW5JZAAAAAAABQAAAAAAAAATSW52YWxpZE90aGVyQ2hhaW5JZAAAAAAGAAAAAAAAAA5HYXNVc2FnZU5vdFNldAAAAAAABwAAAAAAAAANQnJva2VuQWRkcmVzcwAAAAAAAAgAAAAAAAAACE5vdEZvdW5kAAAACQAAAAAAAAAYVG9rZW5JbnN1ZmZpY2llbnRCYWxhbmNlAAAACgAAAAAAAAAKQ2FzdEZhaWxlZAAAAAAACwAAAAAAAAAMVTI1Nk92ZXJmbG93AAAADAAAAAAAAAAKWmVyb0Ftb3VudAAAAAAAZwAAAAAAAAAMUG9vbE92ZXJmbG93AAAAaAAAAAAAAAALWmVyb0NoYW5nZXMAAAAAaQAAAAAAAAARUmVzZXJ2ZXNFeGhhdXN0ZWQAAAAAAABqAAAAAAAAABpJbnN1ZmZpY2llbnRSZWNlaXZlZEFtb3VudAAAAAAAawAAAAAAAAAUQmFsYW5jZVJhdGlvRXhjZWVkZWQAAABsAAAAAAAAAAlGb3JiaWRkZW4AAAAAAABtAAAAAAAAABlVbmF1dGhvcml6ZWRTdG9wQXV0aG9yaXR5AAAAAAAAywAAAAAAAAAOU3dhcFByb2hpYml0ZWQAAAAAAMwAAAAAAAAAEkFtb3VudFRvb0xvd0ZvckZlZQAAAAAAzQAAAAAAAAAWQnJpZGdlVG9UaGVaZXJvQWRkcmVzcwAAAAAAzgAAAAAAAAAORW1wdHlSZWNpcGllbnQAAAAAAM8AAAAAAAAAE1NvdXJjZU5vdFJlZ2lzdGVyZWQAAAAA0AAAAAAAAAAVV3JvbmdEZXN0aW5hdGlvbkNoYWluAAAAAAAA0QAAAAAAAAATVW5rbm93bkFub3RoZXJDaGFpbgAAAADSAAAAAAAAABFUb2tlbnNBbHJlYWR5U2VudAAAAAAAANMAAAAAAAAAEE1lc3NhZ2VQcm9jZXNzZWQAAADUAAAAAAAAAAxOb3RFbm91Z2hGZWUAAADWAAAAAAAAAAlOb01lc3NhZ2UAAAAAAADXAAAAAAAAAA1Ob1JlY2VpdmVQb29sAAAAAAAA2AAAAAAAAAAGTm9Qb29sAAAAAADZAAAAAAAAABNVbmtub3duQW5vdGhlclRva2VuAAAAANoAAAAAAAAAD1dyb25nQnl0ZUxlbmd0aAAAAAEsAAAAAAAAAApIYXNNZXNzYWdlAAAAAAEtAAAAAAAAABdJbnZhbGlkUHJpbWFyeVNpZ25hdHVyZQAAAAEuAAAAAAAAABlJbnZhbGlkU2Vjb25kYXJ5U2lnbmF0dXJlAAAAAAABLwAAAAAAAAARTm9HYXNEYXRhRm9yQ2hhaW4AAAAAAAGQ"]),a);this.options=a}fromJSON={initialize:this.txFromJSON,deposit:this.txFromJSON,withdraw:this.txFromJSON,swap_to_v_usd:this.txFromJSON,swap_from_v_usd:this.txFromJSON,claim_rewards:this.txFromJSON,set_fee_share:this.txFromJSON,adjust_total_lp_amount:this.txFromJSON,set_balance_ratio_min_bp:this.txFromJSON,stop_deposit:this.txFromJSON,start_deposit:this.txFromJSON,stop_withdraw:this.txFromJSON,start_withdraw:this.txFromJSON,set_stop_authority:this.txFromJSON,set_bridge:this.txFromJSON,set_admin:this.txFromJSON,set_admin_fee_share:this.txFromJSON,claim_admin_fee:this.txFromJSON,pending_reward:this.txFromJSON,get_pool:this.txFromJSON,get_admin:this.txFromJSON,get_stop_authority:this.txFromJSON,get_bridge:this.txFromJSON,get_user_deposit:this.txFromJSON,upgrade:this.txFromJSON}};import{contract as CC,rpc as xs}from"@stellar/stellar-sdk";var xo=xs.Api;function wt(r){let{simulation:i,options:a}=r;if(!i)throw new Error("Soroban assembled transaction does not have simulation");if(xo.isSimulationSuccess(i))return i.result==null?void 0:a.parseResultXdr(i.result.retval);throw new Error(i.error)}function Xt(r){let{simulation:i}=r;if(!i)throw new Error("Soroban assembled transaction does not have simulation");return xo.isSimulationError(i)}var oi=class extends ae{constructor(a,o,s){super();this.nodeRpcUrlsConfig=a;this.params=o;this.api=s}chainType="SRB";P=48;async getUserBalanceInfo(a,o){let d=await this.getContract(o.poolAddress).get_user_deposit({user:a});if(Xt(d))throw new I;let A=wt(d);if(!A)throw new I;let g=A.unwrap();return new $({lpAmount:g.lp_amount.toString(),rewardDebt:g.reward_debt.toString()})}async getPoolInfoFromChain(a){let s=await this.getContract(a.poolAddress).get_pool();if(Xt(s))throw new I;let d=wt(s);if(!d)throw new I;let A=d.unwrap();return{aValue:A.a.toString(),accRewardPerShareP:A.acc_reward_per_share_p.toString(),dValue:A.d.toString(),tokenBalance:A.token_balance.toString(),p:this.P,totalLpAmount:A.total_lp_amount.toString(),vUsdBalance:A.v_usd_balance.toString(),imbalance:q({tokenBalance:A.token_balance.toString(),vUsdBalance:A.v_usd_balance.toString()})}}async buildRawTransactionDeposit(a){return(await this.getContract(a.token.poolAddress,a.accountAddress).deposit({sender:a.accountAddress,amount:BigInt(a.amount)})).toXDR()}async buildRawTransactionWithdraw(a){return(await this.getContract(a.token.poolAddress,a.accountAddress).withdraw({sender:a.accountAddress,amount_lp:BigInt(a.amount)})).toXDR()}async buildRawTransactionClaimRewards(a){return(await this.getContract(a.token.poolAddress,a.accountAddress).claim_rewards({sender:a.accountAddress})).toXDR()}getContract(a,o){let s={publicKey:o,contractId:a,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new ai(s)}};import{ClarigenClient as Os,contractFactory as dn}from"@clarigen/core";import{makeRandomPrivKey as ba,makeUnsignedContractCall as Ca,PostConditionMode as ya,privateKeyToPublic as Ia}from"@stacks/transactions";import{Big as Qs}from"big.js";var ri=class extends ae{constructor(a,o){super();this.nodeRpcUrl=a;this.api=o;let s=Ft(this.nodeRpcUrl);this.client=new Os(s)}chainType="STX";P=48;A="20";client;async getUserBalanceInfo(a,o){let s=dn(Me.pool,o.poolAddress),d=await this.client.ro(s.getLpBalance({user:a})),A=await this.client.ro(s.getUserRewardDebt({user:a}));return new $({lpAmount:d.toString(),rewardDebt:A.toString()})}async getPoolInfoFromChain(a){let o=dn(Me.pool,a.poolAddress),[s,d,A,g,c]=await Promise.all([this.client.ro(o.getD()),this.client.ro(o.getTokenBalance()),this.client.ro(o.getVusdBalance()),this.client.ro(o.getLpTotalSupply()),this.client.ro(o.getAccRewardPerShareP())]),l=s.toString(),u=d.toString(),p=A.toString(),m=g.toString(),y=c.toString();if(l&&u&&p&&m&&y){let Y=q({tokenBalance:u,vUsdBalance:p});return{aValue:this.A,dValue:l,tokenBalance:u,vUsdBalance:p,totalLpAmount:m,accRewardPerShareP:y,p:this.P,imbalance:Y}}throw new I("Unable to pool info from chain")}async buildRawTransactionDeposit(a){let o=dn(Me.pool,a.token.poolAddress),{contractAddress:s,contractName:d,functionName:A,functionArgs:g}=o.deposit({amount:BigInt(a.amount),ftRef:a.token.tokenAddress}),c=ba(),l=Ia(c),u=_e(a.amount,"lte",a.accountAddress,a.token.tokenAddress,"example-token"),p=_e(0,"gte",a.token.poolAddress,a.token.tokenAddress,"example-token"),m={contractAddress:s,contractName:d,functionName:A,functionArgs:g,publicKey:l,validateWithAbi:!0,network:this.client.network,postConditions:[u,p],postConditionMode:ya.Deny};return(await Ca(m)).serialize()}async buildRawTransactionWithdraw(a){let o=dn(Me.pool,a.token.poolAddress),{contractAddress:s,contractName:d,functionName:A,functionArgs:g}=o.withdraw({amountLp:BigInt(a.amount),ftRef:a.token.tokenAddress}),c=ba(),l=Ia(c),u=_e(ue(a.amount,a.token.decimals).toFixed(0,Qs.roundDown),"gte",a.token.poolAddress,a.token.tokenAddress,"example-token"),p={contractAddress:s,contractName:d,functionName:A,functionArgs:g,publicKey:l,validateWithAbi:!0,network:this.client.network,postConditions:[u],postConditionMode:ya.Deny};return(await Ca(p)).serialize()}async buildRawTransactionClaimRewards(a){let o=dn(Me.pool,a.token.poolAddress),{contractAddress:s,contractName:d,functionName:A,functionArgs:g}=o.claimRewards({ftRef:a.token.tokenAddress}),c=ba(),l=Ia(c),u=_e(0,"gte",a.token.poolAddress,a.token.tokenAddress,"example-token"),p={contractAddress:s,contractName:d,functionName:A,functionArgs:g,publicKey:l,validateWithAbi:!0,network:this.client.network,postConditions:[u],postConditionMode:ya.Deny};return(await Ca(p)).serialize()}};import{SuiClient as qs}from"@mysten/sui/client";import{Transaction as mi}from"@mysten/sui/transactions";var Vt=we(ot());ie();ie();import{bcs as Oo}from"@mysten/sui/bcs";import{fromB64 as Ks}from"@mysten/sui/utils";function si(r){return r=T(r),r.startsWith(`${st}::balance::Balance<`)}var Ae=class r{__StructClass=!0;static get $typeName(){return`${st}::balance::Balance`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;value;constructor(i,a){this.$fullTypeName=k(r.$typeName,...i),this.$typeArgs=i,this.value=a.value}static reified(i){return{typeName:r.$typeName,fullTypeName:k(r.$typeName,N(i)),typeArgs:[N(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([N(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return Oo.struct("Balance",{value:Oo.u64()})}static fromFields(i,a){return r.reified(i).new({value:j("u64",a.value)})}static fromFieldsWithTypes(i,a){if(!si(a.type))throw new Error("not a Balance type");return xe(a,[i]),r.reified(i).new({value:M("u64",a.fields.value)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{value:this.value.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({value:P("u64",a.value)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Pe(k(r.$typeName,N(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!si(a.type))throw new Error(`object at ${a.fields.id} is not a Balance object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!si(a.bcs.type))throw new Error("object at is not a Balance object");let o=de(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=T(o[0]),d=T(N(i));if(s!==T(N(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,Ks(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching Balance object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!si(s.data.bcs.type))throw new Error(`object at id ${o} is not a Balance object`);return r.fromSuiObjectData(a,s.data)}};var Ra=we(ot());ie();var ha=we(ot());import{bcs as di}from"@mysten/sui/bcs";import{fromB64 as Us}from"@mysten/sui/utils";function Ai(r){return r=T(r),r.startsWith(`${ha.PKG_V1}::pool_rewards::PoolRewards<`)}var Ct=class r{__StructClass=!0;static get $typeName(){return`${ha.PKG_V1}::pool_rewards::PoolRewards`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;accRewardPerShareP;adminFeeShareBp;adminFee;rewards;lpSupply;constructor(i,a){this.$fullTypeName=k(r.$typeName,...i),this.$typeArgs=i,this.accRewardPerShareP=a.accRewardPerShareP,this.adminFeeShareBp=a.adminFeeShareBp,this.adminFee=a.adminFee,this.rewards=a.rewards,this.lpSupply=a.lpSupply}static reified(i){return{typeName:r.$typeName,fullTypeName:k(r.$typeName,N(i)),typeArgs:[N(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([N(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return di.struct("PoolRewards",{acc_reward_per_share_p:di.u128(),admin_fee_share_bp:di.u64(),admin_fee:Ae.bcs,rewards:Ae.bcs,lp_supply:di.u64()})}static fromFields(i,a){return r.reified(i).new({accRewardPerShareP:j("u128",a.acc_reward_per_share_p),adminFeeShareBp:j("u64",a.admin_fee_share_bp),adminFee:j(Ae.reified(i),a.admin_fee),rewards:j(Ae.reified(i),a.rewards),lpSupply:j("u64",a.lp_supply)})}static fromFieldsWithTypes(i,a){if(!Ai(a.type))throw new Error("not a PoolRewards type");return xe(a,[i]),r.reified(i).new({accRewardPerShareP:M("u128",a.fields.acc_reward_per_share_p),adminFeeShareBp:M("u64",a.fields.admin_fee_share_bp),adminFee:M(Ae.reified(i),a.fields.admin_fee),rewards:M(Ae.reified(i),a.fields.rewards),lpSupply:M("u64",a.fields.lp_supply)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{accRewardPerShareP:this.accRewardPerShareP.toString(),adminFeeShareBp:this.adminFeeShareBp.toString(),adminFee:this.adminFee.toJSONField(),rewards:this.rewards.toJSONField(),lpSupply:this.lpSupply.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({accRewardPerShareP:P("u128",a.accRewardPerShareP),adminFeeShareBp:P("u64",a.adminFeeShareBp),adminFee:P(Ae.reified(i),a.adminFee),rewards:P(Ae.reified(i),a.rewards),lpSupply:P("u64",a.lpSupply)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Pe(k(r.$typeName,N(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!Ai(a.type))throw new Error(`object at ${a.fields.id} is not a PoolRewards object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!Ai(a.bcs.type))throw new Error("object at is not a PoolRewards object");let o=de(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=T(o[0]),d=T(N(i));if(s!==T(N(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,Us(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching PoolRewards object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!Ai(s.data.bcs.type))throw new Error(`object at id ${o} is not a PoolRewards object`);return r.fromSuiObjectData(a,s.data)}};ie();var va=we(ot());import{bcs as St}from"@mysten/sui/bcs";import{fromB64 as Ds}from"@mysten/sui/utils";function gi(r){return r=T(r),r.startsWith(`${va.PKG_V1}::pool_state::PoolState<`)}var yt=class r{__StructClass=!0;static get $typeName(){return`${va.PKG_V1}::pool_state::PoolState`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;tokenBalance;vusdBalance;d;a;balanceRatioMinBp;constructor(i,a){this.$fullTypeName=k(r.$typeName,...i),this.$typeArgs=i,this.tokenBalance=a.tokenBalance,this.vusdBalance=a.vusdBalance,this.d=a.d,this.a=a.a,this.balanceRatioMinBp=a.balanceRatioMinBp}static reified(i){return{typeName:r.$typeName,fullTypeName:k(r.$typeName,N(i)),typeArgs:[N(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([N(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return St.struct("PoolState",{token_balance:St.u64(),vusd_balance:St.u64(),d:St.u64(),a:St.u64(),balance_ratio_min_bp:St.u64()})}static fromFields(i,a){return r.reified(i).new({tokenBalance:j("u64",a.token_balance),vusdBalance:j("u64",a.vusd_balance),d:j("u64",a.d),a:j("u64",a.a),balanceRatioMinBp:j("u64",a.balance_ratio_min_bp)})}static fromFieldsWithTypes(i,a){if(!gi(a.type))throw new Error("not a PoolState type");return xe(a,[i]),r.reified(i).new({tokenBalance:M("u64",a.fields.token_balance),vusdBalance:M("u64",a.fields.vusd_balance),d:M("u64",a.fields.d),a:M("u64",a.fields.a),balanceRatioMinBp:M("u64",a.fields.balance_ratio_min_bp)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{tokenBalance:this.tokenBalance.toString(),vusdBalance:this.vusdBalance.toString(),d:this.d.toString(),a:this.a.toString(),balanceRatioMinBp:this.balanceRatioMinBp.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({tokenBalance:P("u64",a.tokenBalance),vusdBalance:P("u64",a.vusdBalance),d:P("u64",a.d),a:P("u64",a.a),balanceRatioMinBp:P("u64",a.balanceRatioMinBp)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Pe(k(r.$typeName,N(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!gi(a.type))throw new Error(`object at ${a.fields.id} is not a PoolState object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!gi(a.bcs.type))throw new Error("object at is not a PoolState object");let o=de(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=T(o[0]),d=T(N(i));if(s!==T(N(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,Ds(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching PoolState object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!gi(s.data.bcs.type))throw new Error(`object at id ${o} is not a PoolState object`);return r.fromSuiObjectData(a,s.data)}};import{bcs as An}from"@mysten/sui/bcs";import{fromB64 as Es}from"@mysten/sui/utils";function ci(r){return r=T(r),r.startsWith(`${Ra.PKG_V1}::pool::Pool<`)}var li=class r{__StructClass=!0;static get $typeName(){return`${Ra.PKG_V1}::pool::Pool`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;id;state;rewards;feeShareBp;canDeposit;canWithdraw;decimals;balance;constructor(i,a){this.$fullTypeName=k(r.$typeName,...i),this.$typeArgs=i,this.id=a.id,this.state=a.state,this.rewards=a.rewards,this.feeShareBp=a.feeShareBp,this.canDeposit=a.canDeposit,this.canWithdraw=a.canWithdraw,this.decimals=a.decimals,this.balance=a.balance}static reified(i){return{typeName:r.$typeName,fullTypeName:k(r.$typeName,N(i)),typeArgs:[N(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([N(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return An.struct("Pool",{id:Te.bcs,state:yt.bcs,rewards:Ct.bcs,fee_share_bp:An.u64(),can_deposit:An.bool(),can_withdraw:An.bool(),decimals:An.u8(),balance:Ae.bcs})}static fromFields(i,a){return r.reified(i).new({id:j(Te.reified(),a.id),state:j(yt.reified(i),a.state),rewards:j(Ct.reified(i),a.rewards),feeShareBp:j("u64",a.fee_share_bp),canDeposit:j("bool",a.can_deposit),canWithdraw:j("bool",a.can_withdraw),decimals:j("u8",a.decimals),balance:j(Ae.reified(i),a.balance)})}static fromFieldsWithTypes(i,a){if(!ci(a.type))throw new Error("not a Pool type");return xe(a,[i]),r.reified(i).new({id:M(Te.reified(),a.fields.id),state:M(yt.reified(i),a.fields.state),rewards:M(Ct.reified(i),a.fields.rewards),feeShareBp:M("u64",a.fields.fee_share_bp),canDeposit:M("bool",a.fields.can_deposit),canWithdraw:M("bool",a.fields.can_withdraw),decimals:M("u8",a.fields.decimals),balance:M(Ae.reified(i),a.fields.balance)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{id:this.id,state:this.state.toJSONField(),rewards:this.rewards.toJSONField(),feeShareBp:this.feeShareBp.toString(),canDeposit:this.canDeposit,canWithdraw:this.canWithdraw,decimals:this.decimals,balance:this.balance.toJSONField()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({id:P(Te.reified(),a.id),state:P(yt.reified(i),a.state),rewards:P(Ct.reified(i),a.rewards),feeShareBp:P("u64",a.feeShareBp),canDeposit:P("bool",a.canDeposit),canWithdraw:P("bool",a.canWithdraw),decimals:P("u8",a.decimals),balance:P(Ae.reified(i),a.balance)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Pe(k(r.$typeName,N(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!ci(a.type))throw new Error(`object at ${a.fields.id} is not a Pool object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!ci(a.bcs.type))throw new Error("object at is not a Pool object");let o=de(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=T(o[0]),d=T(N(i));if(s!==T(N(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,Es(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching Pool object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!ci(s.data.bcs.type))throw new Error(`object at id ${o} is not a Pool object`);return r.fromSuiObjectData(a,s.data)}};ie();var Ba=we(ot());import{bcs as Ya}from"@mysten/sui/bcs";import{fromB64 as _s}from"@mysten/sui/utils";function ui(r){return r=T(r),r.startsWith(`${Ba.PKG_V1}::user_deposit::UserDeposit<`)}var pi=class r{__StructClass=!0;static get $typeName(){return`${Ba.PKG_V1}::user_deposit::UserDeposit`}static $numTypeParams=1;static $isPhantom=[!0];$typeName=r.$typeName;$fullTypeName;$typeArgs;$isPhantom=r.$isPhantom;id;lpAmount;rewardDebt;constructor(i,a){this.$fullTypeName=k(r.$typeName,...i),this.$typeArgs=i,this.id=a.id,this.lpAmount=a.lpAmount,this.rewardDebt=a.rewardDebt}static reified(i){return{typeName:r.$typeName,fullTypeName:k(r.$typeName,N(i)),typeArgs:[N(i)],isPhantom:r.$isPhantom,reifiedTypeArgs:[i],fromFields:a=>r.fromFields(i,a),fromFieldsWithTypes:a=>r.fromFieldsWithTypes(i,a),fromBcs:a=>r.fromBcs(i,a),bcs:r.bcs,fromJSONField:a=>r.fromJSONField(i,a),fromJSON:a=>r.fromJSON(i,a),fromSuiParsedData:a=>r.fromSuiParsedData(i,a),fromSuiObjectData:a=>r.fromSuiObjectData(i,a),fetch:async(a,o)=>r.fetch(a,i,o),new:a=>new r([N(i)],a),kind:"StructClassReified"}}static get r(){return r.reified}static phantom(i){return U(r.reified(i))}static get p(){return r.phantom}static get bcs(){return Ya.struct("UserDeposit",{id:Te.bcs,lp_amount:Ya.u64(),reward_debt:Ya.u64()})}static fromFields(i,a){return r.reified(i).new({id:j(Te.reified(),a.id),lpAmount:j("u64",a.lp_amount),rewardDebt:j("u64",a.reward_debt)})}static fromFieldsWithTypes(i,a){if(!ui(a.type))throw new Error("not a UserDeposit type");return xe(a,[i]),r.reified(i).new({id:M(Te.reified(),a.fields.id),lpAmount:M("u64",a.fields.lp_amount),rewardDebt:M("u64",a.fields.reward_debt)})}static fromBcs(i,a){return r.fromFields(i,r.bcs.parse(a))}toJSONField(){return{id:this.id,lpAmount:this.lpAmount.toString(),rewardDebt:this.rewardDebt.toString()}}toJSON(){return{$typeName:this.$typeName,$typeArgs:this.$typeArgs,...this.toJSONField()}}static fromJSONField(i,a){return r.reified(i).new({id:P(Te.reified(),a.id),lpAmount:P("u64",a.lpAmount),rewardDebt:P("u64",a.rewardDebt)})}static fromJSON(i,a){if(a.$typeName!==r.$typeName)throw new Error("not a WithTwoGenerics json object");return Pe(k(r.$typeName,N(i)),a.$typeArgs,[i]),r.fromJSONField(i,a)}static fromSuiParsedData(i,a){if(a.dataType!=="moveObject")throw new Error("not an object");if(!ui(a.type))throw new Error(`object at ${a.fields.id} is not a UserDeposit object`);return r.fromFieldsWithTypes(i,a)}static fromSuiObjectData(i,a){if(a.bcs){if(a.bcs.dataType!=="moveObject"||!ui(a.bcs.type))throw new Error("object at is not a UserDeposit object");let o=de(a.bcs.type).typeArgs;if(o.length!==1)throw new Error(`type argument mismatch: expected 1 type argument but got '${o.length}'`);let s=T(o[0]),d=T(N(i));if(s!==T(N(i)))throw new Error(`type argument mismatch: expected '${d}' but got '${s}'`);return r.fromBcs(i,_s(a.bcs.bcsBytes))}if(a.content)return r.fromSuiParsedData(i,a.content);throw new Error("Both `bcs` and `content` fields are missing from the data. Include `showBcs` or `showContent` in the request.")}static async fetch(i,a,o){let s=await i.getObject({id:o,options:{showBcs:!0}});if(s.error)throw new Error(`error fetching UserDeposit object at id ${o}: ${s.error.code}`);if(s.data?.bcs?.dataType!=="moveObject"||!ui(s.data.bcs.type))throw new Error(`object at id ${o} is not a UserDeposit object`);return r.fromSuiObjectData(a,s.data)}};function Ko(r,i,a){if(i.length===0||!i[0])return[];let o=i[0],s=r.reduce((g,c)=>g+BigInt(c),BigInt(0)),d=BigInt(o.balance),A=[];for(let g of i.slice(1)){if(d>s)return Qo(a,o,A,r);d+=BigInt(g.balance),A.push(g)}return d>=s?Qo(a,o,A,r):[]}function Qo(r,i,a,o){let s=o.map(d=>r.pure.u64(d));return a.length>0&&r.mergeCoins(i.coinObjectId,a.map(d=>d.coinObjectId)),r.splitCoins(i.coinObjectId,s)}var $s="0x0000000000000000000000000000000000000000000000000000000000000000";async function Uo(r,i,a){let o=await r.devInspectTransactionBlock({sender:$s,transactionBlock:i});if(o.effects.status.status!=="success")throw new Error(`inspectionResult failed. ${JSON.stringify(o,null,2)}`);let s=o.results?.pop()?.returnValues?.pop();if(!s)throw new Error(`Something with inspectionResult went wrong. ${JSON.stringify(o,null,2)}`);let[d,A]=s;return typeof a=="object"?a.fromBcs(Uint8Array.from(d)).toJSONField():nn(a).parse(Uint8Array.from(d))}var bi=class extends ae{constructor(a,o){super();this.suiRpcUrl=a;this.api=o;this.client=new qs({url:a})}chainType="SUI";client;async getUserBalanceInfo(a,o){if(!o.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=o.suiAddresses;if(!s)throw new I("SUI token must contain 'suiAddresses'");(0,Vt.setAddress)(s.bridgeAddress,s.bridgeAddressOrigin);let A=(await this.fetchDeposits(a,o.originTokenAddress)).reduce((g,c)=>{if(c.data)return g.lpAmount+=BigInt(c.data.content.fields.lp_amount),g.rewardDebt+=BigInt(c.data.content.fields.reward_debt),g;throw new I("Deposits fetch failed")},{lpAmount:BigInt(0),rewardDebt:BigInt(0)});return new $({lpAmount:A.lpAmount.toString(),rewardDebt:A.rewardDebt.toString()})}async fetchDeposits(a,o){return await Oe(s=>this.client.getOwnedObjects({owner:a,filter:{StructType:pi.phantom(U(o)).phantomType},options:{showContent:!0},cursor:s}))}async getPoolInfoFromChain(a){let o=a.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,Vt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=48,d=new mi;Fo(d,a.originTokenAddress,o.bridgeObjectAddress);let A=await Uo(this.client,d,li.reified(U(a.originTokenAddress))),g=A.state.tokenBalance,c=A.state.vusdBalance,l=q({tokenBalance:g,vUsdBalance:c});return{dValue:A.state.d,aValue:A.state.a,totalLpAmount:A.rewards.lpSupply,vUsdBalance:c,tokenBalance:g,accRewardPerShareP:A.rewards.accRewardPerShareP,p:s,imbalance:l}}async buildRawTransactionDeposit(a){let o=a.token.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,Vt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=await Oe(p=>this.client.getCoins({owner:a.accountAddress,coinType:a.token.originTokenAddress,cursor:p}));if(s.length===0||!s[0])throw new Ke("No coins to deposit");let d=s[0],A=new mi;A.setSender(a.accountAddress);let{depositObj:g,isNewDeposit:c}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,A),[l]=Ko([a.amount],s,A);if(!l)throw new Ke("No coins to deposit");if(!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let u=Wo(A,a.token.originTokenAddress,{bridge:o.bridgeObjectAddress,userDeposit:g,coin:l});return A.mergeCoins(d.coinObjectId,[u]),c&&A.transferObjects([g],a.accountAddress),await A.toJSON({client:this.client})}async getDepositObject(a,o,s){let d=await this.fetchDeposits(a,o);if(d.length===0||!d[0]){let A=U(o).phantomType;return{depositObj:Zo(s,A),isNewDeposit:!0}}else{if(d[0].data?.objectId)return{depositObj:d[0].data.objectId,isNewDeposit:!1};throw new I("Something went wrong while deposit")}}async buildRawTransactionWithdraw(a){let o=a.token.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,Vt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=U(a.token.originTokenAddress).phantomType,d=new mi;d.setSender(a.accountAddress);let{depositObj:A,isNewDeposit:g}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,d);if(g)throw new Ke("No deposit found");let c=fo(d,s,{bridge:o.bridgeObjectAddress,userDeposit:A,amountLp:BigInt(a.amount)}),l=await Oe(u=>this.client.getCoins({owner:a.accountAddress,coinType:a.token.originTokenAddress,cursor:u}));if(!c[0]||!c[1])throw new I("No rewards found");return l[0]?d.mergeCoins(l[0].coinObjectId,[c[0],c[1]]):(d.mergeCoins(c[0],[c[1]]),d.transferObjects([c[0]],a.accountAddress)),await d.toJSON({client:this.client})}async buildRawTransactionClaimRewards(a){let o=a.token.suiAddresses;if(!o)throw new I("SUI token must contain 'suiAddresses'");if((0,Vt.setAddress)(o.bridgeAddress,o.bridgeAddressOrigin),!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");let s=U(a.token.originTokenAddress).phantomType,d=new mi;d.setSender(a.accountAddress);let{depositObj:A,isNewDeposit:g}=await this.getDepositObject(a.accountAddress,a.token.originTokenAddress,d);if(g)throw new Ke("No deposit found");let c=To(d,s,{bridge:o.bridgeObjectAddress,userDeposit:A}),l=await Oe(u=>this.client.getCoins({owner:a.accountAddress,coinType:a.token.originTokenAddress,cursor:u}));return l[0]?d.mergeCoins(l[0].coinObjectId,[c]):d.transferObjects([c],a.accountAddress),await d.toJSON({client:this.client})}};import{Web3 as Ci}from"web3";import{encodeFunctionCall as ed}from"web3-eth-abi";var gn=class extends ae{constructor(a,o,s){super();this.tronWeb=a;this.api=o;this.tronJsonRpc=s}chainType="TRX";P=52;async getUserBalanceInfo(a,o){let s;if(this.tronJsonRpc)try{s=await this.getUserBalanceInfoByBatch(this.tronJsonRpc,a,o)}catch{s=await this.getUserBalanceInfoPerProperty(a,o)}else s=await this.getUserBalanceInfoPerProperty(a,o);return s}async getUserBalanceInfoByBatch(a,o,s){let d=Dt(s.poolAddress),A=Dt(o),g=[{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:d,data:this.getFunctionAbi("userRewardDebt",A)},"latest"]},{jsonrpc:"2.0",id:2,method:"eth_call",params:[{to:d,data:this.getFunctionAbi("balanceOf",A)},"latest"]}],l=await(await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(g)})).json();if(Array.isArray(l)&&l.length===2){let u=p=>{let m=l.find(y=>y.id===p);if(!m||!m.result)throw new Error(`Missing or invalid result for id ${p}`);return Ci.utils.toBigInt(m.result).toString()};return new $({lpAmount:Ci.utils.toBigInt(u(2)).toString(),rewardDebt:Ci.utils.toBigInt(u(1)).toString()})}throw new Error("Batched HTTP call failed")}async getUserBalanceInfoPerProperty(a,o){this.tronWeb.defaultAddress.base58||this.tronWeb.setAddress(a);let s=this.getContract(o.poolAddress),d=(await s.methods.userRewardDebt(a).call()).toString(),A=(await s.methods.balanceOf(a).call()).toString();return new $({lpAmount:A,rewardDebt:d})}async getPoolInfoFromChain(a){let o;if(this.tronJsonRpc)try{o=await this.getPoolInfoByBatch(this.tronJsonRpc,a)}catch{o=await this.getPoolInfoPerProperty(a)}else o=await this.getPoolInfoPerProperty(a);return o}async getPoolInfoByBatch(a,o){let s=Dt(o.poolAddress),d=[{jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("a")},"latest"]},{jsonrpc:"2.0",id:2,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("d")},"latest"]},{jsonrpc:"2.0",id:3,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("tokenBalance")},"latest"]},{jsonrpc:"2.0",id:4,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("vUsdBalance")},"latest"]},{jsonrpc:"2.0",id:5,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("totalSupply")},"latest"]},{jsonrpc:"2.0",id:6,method:"eth_call",params:[{to:s,data:this.getFunctionAbi("accRewardPerShareP")},"latest"]}],g=await(await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)})).json();if(Array.isArray(g)&&g.length===6){let c=m=>{let y=g.find(Y=>Y.id===m);if(!y||!y.result)throw new Error(`Missing or invalid result for id ${m}`);return Ci.utils.toBigInt(y.result).toString()},l=c(3),u=c(4),p=q({tokenBalance:l,vUsdBalance:u});return{aValue:c(1),dValue:c(2),tokenBalance:l,vUsdBalance:u,totalLpAmount:c(5),accRewardPerShareP:c(6),p:this.P,imbalance:p}}throw new Error("Batched pool info call failed")}async getPoolInfoPerProperty(a){this.tronWeb.defaultAddress.base58||this.tronWeb.setAddress(a.poolAddress);let o=this.getContract(a.poolAddress),[s,d,A,g,c,l]=await Promise.all([o.methods.a().call(),o.methods.d().call(),o.methods.tokenBalance().call(),o.methods.vUsdBalance().call(),o.methods.totalSupply().call(),o.methods.accRewardPerShareP().call()]),u=A.toString(),p=g.toString(),m=q({tokenBalance:u,vUsdBalance:p});return{aValue:s.toString(),dValue:d.toString(),tokenBalance:u,vUsdBalance:p,totalLpAmount:c.toString(),accRewardPerShareP:l.toString(),p:this.P,imbalance:m}}buildRawTransactionDeposit(a){let{amount:o,accountAddress:s}=a,d=[{type:"uint256",value:o}];return this.buildRawTransaction(a.token.poolAddress,"deposit(uint256)",d,"0",s)}buildRawTransactionWithdraw(a){let{amount:o,accountAddress:s}=a,d=[{type:"uint256",value:o}];return this.buildRawTransaction(a.token.poolAddress,"withdraw(uint256)",d,"0",s)}buildRawTransactionClaimRewards(a){let{accountAddress:o}=a,s=[];return this.buildRawTransaction(a.token.poolAddress,"claimRewards()",s,"0",o)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}getContract(a){return this.tronWeb.contract(rn.abi,a)}getFunctionAbi(a,...o){let s=rn.abi.find(d=>d.type==="function"&&"name"in d&&d.name===a);if(!s)throw new Error(`${a} method not found in Pool ABI`);return ed(s,o)}};var yi=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new ni(i,a,this.params,s);let d=o.cachePoolInfoChainSec>0?o.cachePoolInfoChainSec*1e3:20*1e3;this.cache=new nd({defaultTtl:d})}rawTxBuilder;cache;async getAllowance(i,a){if(a){let o=i,s=a;return await this.tokenService.getAllowance({...s,spender:s.token.poolAddress},o)}else{let o=i;return await this.tokenService.getAllowance({...o,spender:o.token.poolAddress})}}async checkAllowance(i,a){if(a){let o=i,s=a;return this.tokenService.checkAllowance({...s,spender:s.token.poolAddress},o)}else{let o=i;return this.tokenService.checkAllowance({...o,spender:o.token.poolAddress})}}async approve(i,a){return this.tokenService.approve(i,{...a,spender:a.token.poolAddress})}async getAmountToBeDeposited(i,a,o){V(i),H("amount",i,a.decimals);let s=await this.getPoolInfoFromChain(a,o),{vUsdBalance:d,tokenBalance:A,aValue:g,dValue:c}=s,l=Jo(i,g,c,A,d);return F(l,3).toFixed()}async getAmountToBeWithdrawn(i,a,o,s){V(i),H("amount",i,o.decimals);let d=await this.getPoolInfoFromChain(o,s),A=ko(i),g=ue(A,o.decimals),l=(await this.getUserBalanceInfo(a,o,s)).earned(d)||"0",u=td(g).plus(l).toFixed();return F(u,o.decimals).toFixed()}async getUserBalanceInfo(i,a,o){return Nt(a.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,o).getUserBalanceInfo(i,a)}async getPoolInfoFromChain(i,a){let o={chainSymbol:i.chainSymbol,poolAddress:i.poolAddress},s=this.cache.get(o);if(s)return s;{let d=await Nt(i.chainSymbol,this.api,this.nodeRpcUrlsConfig,this.params,a).getPoolInfoFromChain(i);return this.cache.put(o,d),this.api.cachePut({chainSymbol:i.chainSymbol,poolAddress:i.poolAddress},d),d}}};function Nt(r,i,a,o,s){switch(S.getChainProperty(r).chainType){case"EVM":{if(s)return new sn(s,i);{let d=a.getNodeRpcUrl(r),A=new rd(d);return A.defaultReturnFormat={number:od.STR,bytes:ad.HEX},new sn(A,i)}}case"TRX":{let d=a.getNodeRpcUrl(r),A=o.tronJsonRpc;if(s)return new gn(s,i,A);{let g=new id({fullHost:d});return new gn(g,i,A)}}case"SOLANA":{let d=a.getNodeRpcUrl(r);return new ii(d,i)}case"SRB":return new oi(a,o,i);case"SUI":return new bi(a.getNodeRpcUrl(r),i);case"ALG":if(s){let d=s,A=Do.fromClients({algod:d});return new on(A,i)}else{let d=a.getNodeRpcUrl(r),A=Do.fromConfig({algodConfig:{server:d}});return new on(A,i)}case"STX":{let d=a.getNodeRpcUrl(r);return new ri(d,i)}}}import{TronWeb as Ad}from"tronweb";import{FMT_BYTES as gd,FMT_NUMBER as cd,Web3 as ld}from"web3";var sd={abi:[{inputs:[{internalType:"string",name:"tokenName_",type:"string"},{internalType:"string",name:"tokenSymbol_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"uint256",name:"lpAmount",type:"uint256"}],name:"Deposited",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"},{indexed:!1,internalType:"address",name:"token",type:"address"}],name:"DepositedRewards",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256[4]",name:"values",type:"uint256[4]"}],name:"MultiTransfer",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"previousOwner",type:"address"},{indexed:!0,internalType:"address",name:"newOwner",type:"address"}],name:"OwnershipTransferred",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{anonymous:!1,inputs:[{indexed:!1,internalType:"address",name:"user",type:"address"},{indexed:!1,internalType:"address",name:"token",type:"address"},{indexed:!1,internalType:"uint256",name:"amount",type:"uint256"}],name:"Withdrawn",type:"event"},{stateMutability:"payable",type:"fallback"},{inputs:[],name:"NUM_TOKENS",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"pure",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"},{internalType:"uint256",name:"minVirtualAmount",type:"uint256"}],name:"deposit",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"depositRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"getEstimatedAmountOnDeposit",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"getRewardsAmount",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"user",type:"address"},{internalType:"uint256",name:"virtualAmount",type:"uint256"}],name:"getWithdrawProportionAmount",outputs:[{internalType:"uint256[4]",name:"",type:"uint256[4]"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"owner",outputs:[{internalType:"address",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"pools",outputs:[{internalType:"contract IPool",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"renounceOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"},{internalType:"contract IPool",name:"pool",type:"address"}],name:"setPool",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subBalanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"subDepositRewards",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"index",type:"uint256"}],name:"subTotalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subTransfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subTransferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"virtualAmount",type:"uint256"},{internalType:"uint256",name:"index",type:"uint256"}],name:"subWithdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"uint256",name:"",type:"uint256"}],name:"tokens",outputs:[{internalType:"contract IERC20",name:"",type:"address"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"newOwner",type:"address"}],name:"transferOwnership",outputs:[],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"uint256",name:"virtualAmount",type:"uint256"}],name:"withdraw",outputs:[],stateMutability:"nonpayable",type:"function"},{stateMutability:"payable",type:"receive"}]},Ii=sd;var It=class{};var cn=class extends It{constructor(a,o){super();this.web3=a;this.api=o}chainType="EVM";async balanceOf(a){let o=(await this.getYieldContract(a.token.yieldAddress).methods.balanceOf(a.owner).call()).toString();return F(o,3).toFixed()}async getEstimatedAmountOnDeposit(a){let o=Z(a.amount,a.token.decimals).toFixed(),s=(await this.getYieldContract(a.token.yieldAddress).methods.getEstimatedAmountOnDeposit(o,a.token.yieldId).call()).toString();return F(s,3).toFixed()}async getWithdrawProportionAmount(a){let o=Z(a.amount,3).toFixed();return await this.getYieldContract(a.cydToken.yieldAddress).methods.getWithdrawProportionAmount(a.owner,o).call()}async buildRawTransactionDeposit(a){return Promise.resolve({...this.buildTxParams({owner:a.owner,yieldAddress:a.token.yieldAddress}),data:this.getYieldContract(a.token.yieldAddress).methods.deposit(a.amount,a.token.yieldId,a.minVirtualAmount).encodeABI()})}async buildRawTransactionWithdraw(a){return Promise.resolve({...this.buildTxParams({owner:a.owner,yieldAddress:a.token.yieldAddress}),data:this.getYieldContract(a.token.yieldAddress).methods.withdraw(a.amount).encodeABI()})}buildTxParams(a){return{from:a.owner,to:a.yieldAddress,value:"0"}}getYieldContract(a){return new this.web3.eth.Contract(Ii.abi,a)}};var hi=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s}async approve(i,a){return this.tokenService.buildRawTransactionApprove({...i,spender:i.token.yieldAddress},a)}async deposit(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),V(i.minVirtualAmount),H("minVirtualAmount",i.minVirtualAmount,3),i.amount=Z(i.amount,i.token.decimals).toFixed(),i.minVirtualAmount=Z(i.minVirtualAmount,3).toFixed(),Mt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).buildRawTransactionDeposit(i)}async withdraw(i,a){return V(i.amount),H("amount",i.amount,3),i.amount=Z(i.amount,3).toFixed(),Mt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).buildRawTransactionWithdraw(i)}};var ln=class extends It{constructor(a,o){super();this.tronWeb=a;this.api=o}chainType="TRX";async balanceOf(a){let o=(await(await this.getContract(a.token.yieldAddress)).methods.balanceOf(a.owner).call()).toString();return F(o,3).toFixed()}async getEstimatedAmountOnDeposit(a){let o=Z(a.amount,a.token.decimals).toFixed(),s=(await(await this.getContract(a.token.yieldAddress)).methods.getEstimatedAmountOnDeposit(o,a.token.yieldId).call()).toString();return F(s,3).toFixed()}async getWithdrawProportionAmount(a){let o=Z(a.amount,3).toFixed();return(await(await this.getContract(a.cydToken.yieldAddress)).methods.getWithdrawProportionAmount(a.owner,o).call()).toString().split(",")}async buildRawTransactionDeposit(a){let{amount:o,owner:s,token:d,minVirtualAmount:A}=a,g=[{type:"uint256",value:o},{type:"uint256",value:d.yieldId},{type:"uint256",value:A}];return this.buildRawTransaction(a.token.yieldAddress,"deposit(uint256,uint256,uint256)",g,"0",s)}async buildRawTransactionWithdraw(a){let{amount:o,owner:s}=a,d=[{type:"uint256",value:o}];return this.buildRawTransaction(a.token.yieldAddress,"withdraw(uint256)",d,"0",s)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}getContract(a){return this.tronWeb.contract(Ii.abi,a)}};function dd(r){if(!vi(r))throw new Wn("Token does not support Yield")}function vi(r){return!!r.yieldAddress&&r.yieldId!==void 0}var Ri=class{constructor(i,a,o,s){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o;this.tokenService=s;this.rawTxBuilder=new hi(i,a,o,s)}rawTxBuilder;async getCYDTokens(){let i=[],a=await this.api.getChainDetailsMap("pool");return Object.values(a).forEach(o=>{if(o.yieldAddress){let s=o.tokens.find(A=>A.tokenAddress===o.yieldAddress),d=o.tokens.filter(vi);if(d.length>0){let A=s??{allbridgeChainId:o.allbridgeChainId,apr:"",apr30d:"",apr7d:"",bridgeId:o.bridgeId,bridgeAddress:o.bridgeAddress,chainId:o.chainId,chainName:o.name,chainSymbol:o.chainSymbol,chainType:o.chainType,confirmations:o.confirmations,decimals:3,feeShare:"",lpRate:"",name:"Core Yield",poolAddress:"",symbol:"CYD",tokenAddress:o.yieldAddress,transferTime:{},txCostAmount:{maxAmount:"0",swap:"0",transfer:"0"},yieldAddress:o.yieldAddress};i.push({...A,yieldAddress:o.yieldAddress,tokens:d})}}}),i}async getAllowance(i,a){return await this.tokenService.getAllowance({...i,spender:i.token.yieldAddress},a)}async checkAllowance(i,a){return this.tokenService.checkAllowance({...i,spender:i.token.yieldAddress},a)}async balanceOf(i,a){return Mt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).balanceOf(i)}async getEstimatedAmountOnDeposit(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),Mt(i.token.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.token.yieldAddress,a).getEstimatedAmountOnDeposit(i)}async getWithdrawAmounts(i,a){V(i.amount),H("amount",i.amount,3);let o=await Mt(i.cydToken.chainSymbol,this.api,this.nodeRpcUrlsConfig,i.owner,a).getWithdrawProportionAmount(i);return i.cydToken.tokens.filter(s=>o[s.yieldId]!==void 0).map(s=>({amount:F(o[s.yieldId],s.decimals).toFixed(),token:s}))}};function Mt(r,i,a,o,s){switch(S.getChainProperty(r).chainType){case"EVM":{if(s)return new cn(s,i);{let d=a.getNodeRpcUrl(r),A=new ld(d);return A.defaultReturnFormat={number:cd.STR,bytes:gd.HEX},new cn(A,i)}}case"TRX":{if(s)return new ln(s,i);{let d=a.getNodeRpcUrl(r),A=new Ad({fullHost:d});return A.setAddress(o),new ln(A,i)}}case"SOLANA":throw new X;case"SRB":throw new X;case"SUI":throw new X;case"ALG":throw new X;case"STX":throw new X}}import{Big as _}from"big.js";function $o(r,i,a){let o=ud(r,{decimals:i.decimals,feeShare:i.feeShare},i.poolInfo),s=pd(o.amountIncludingCommissionInSystemPrecision,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo);return{swapToVUsdCalcResult:o,swapFromVUsdCalcResult:s}}function qo(r,i,a){let o=md(r,{decimals:a.decimals,feeShare:a.feeShare},a.poolInfo),s=bd(o.amountIncludingCommissionInSystemPrecision,{decimals:i.decimals,feeShare:i.feeShare},i.poolInfo);return{swapToVUsdCalcResult:o,swapFromVUsdCalcResult:s}}function ud(r,{feeShare:i,decimals:a},o){let s=_(r),d=s.times(i),A=s.minus(d);return{bridgeFeeInTokenPrecision:d.round().toFixed(),amountIncludingCommissionInSystemPrecision:Eo(lt(A,a),o),amountExcludingCommissionInSystemPrecision:Eo(lt(s,a),o)}}function Eo(r,i){if(r.eq(0))return"0";let a=_(i.tokenBalance).plus(r),o=ke(a.toFixed(),i.aValue,i.dValue);return _(i.vUsdBalance).minus(o).round().toFixed()}function pd(r,{feeShare:i,decimals:a},o){if(_(r).eq(0))return{bridgeFeeInTokenPrecision:"0",amountIncludingCommissionInTokenPrecision:"0",amountExcludingCommissionInTokenPrecision:"0"};let d=_(r).plus(o.vUsdBalance),A=ke(d,o.aValue,o.dValue),g=ue(_(o.tokenBalance).minus(A),a),c=_(g).times(i),l=_(g).minus(c).round();return{bridgeFeeInTokenPrecision:c.round().toFixed(),amountIncludingCommissionInTokenPrecision:l.toFixed(),amountExcludingCommissionInTokenPrecision:g.toFixed()}}function md(r,{feeShare:i,decimals:a},o){let s=_(i).div(_(1).minus(i)),d=_(r).times(s),A=_(r).plus(d);return{bridgeFeeInTokenPrecision:d.round().toFixed(),amountIncludingCommissionInSystemPrecision:_o(lt(A,a),o),amountExcludingCommissionInSystemPrecision:_o(lt(r,a),o)}}function _o(r,i){let a=_(i.tokenBalance).minus(r),o=ke(a.toFixed(),i.aValue,i.dValue);return _(o).minus(i.vUsdBalance).round().toFixed()}function bd(r,{feeShare:i,decimals:a},o){if(_(r).eq(0))return{bridgeFeeInTokenPrecision:"0",amountIncludingCommissionInTokenPrecision:"0",amountExcludingCommissionInTokenPrecision:"0"};let s=_(o.vUsdBalance).minus(r),d=ke(s.toFixed(),o.aValue,o.dValue),A=_(d).minus(o.tokenBalance),g=ue(A.toFixed(),a),c=_(i).div(_(1).minus(i)),l=_(g).times(c),u=_(g).plus(l);return{bridgeFeeInTokenPrecision:l.round().toFixed(),amountIncludingCommissionInTokenPrecision:u.round().toFixed(),amountExcludingCommissionInTokenPrecision:g.toFixed()}}import{Big as gt}from"big.js";function er(r,i,a,o,s){let d=Je(r,i,a),A=ue(d,i.decimals),g=Ut(d,o,s),c=gt(r).times(i.feeShare),l=gt(g).div(gt(1).minus(o.feeShare)).minus(g);return{sourceLPSwap:{fee:F(c,i.decimals).neg().round(i.decimals,gt.roundUp).toFixed(),swap:F(gt(r).minus(A).minus(c),i.decimals).neg().round(i.decimals,gt.roundUp).toFixed()},destLPSwap:{fee:F(l,o.decimals).neg().round(o.decimals,gt.roundUp).toFixed(),swap:F(ue(d,o.decimals).minus(g).minus(l),o.decimals).neg().round(o.decimals,gt.roundUp).toFixed()}}}import{AlgorandClient as tr}from"@algorandfoundation/algokit-utils";import{ABIMethod as Cd,OnApplicationComplete as yd}from"algosdk";var Yi=class{constructor(i){this.nodeRpcUrlsConfig=i}async checkAssetOptIn(i,a,o){let s=this.getAlgorand(o);return Nn(i,a,s)}async buildRawTransactionAssetOptIn(i,a,o){let s=this.getAlgorand(o);typeof i=="string"&&(i=BigInt(i));let d=await s.createTransaction.assetOptIn({assetId:i,sender:a});return et(d)}async checkAppOptIn(i,a,o){let s=this.getAlgorand(o);return wn(i,a,s)}async buildRawTransactionAppOptIn(i,a,o){let s=this.getAlgorand(o);typeof i=="string"&&(i=BigInt(i));let d=s.newGroup(),A=s.account.random();d.addAppCallMethodCall({appId:i,method:new Cd({name:"optInToApplication",desc:void 0,args:[],returns:{type:"void",desc:void 0},events:[],readonly:!1}),args:[],sender:a,signer:A,onComplete:yd.OptInOC});let{transactions:g}=await d.buildTransactions();return et(...g)}getAlgorand(i){if(i)return tr.fromClients({algod:i});{let a=this.nodeRpcUrlsConfig.getNodeRpcUrl("ALG");return tr.fromConfig({algodConfig:{server:a}})}}};import Bd from"axios";var nr="3.27.0-alpha.3";function ir(r){return Object.entries(r).reduce((i,a)=>{let o=a[0],s=a[1],d=Yd(o,s);return d&&(i[o]=d),i},{})}function ar(r){let i={};for(let[a,o]of Object.entries(r)){let s=a;for(let d of o.tokens){let A=Pt({chainSymbol:s,poolAddress:d.poolAddress}),g=q(d.poolInfo);i[A]={...d.poolInfo,imbalance:g}}}return i}function Id(r,i){let{name:a,...o}=r,{poolInfo:s,...d}=i;return{...d,...o,chainName:a}}function hd(r){switch(r){case"allbridge":return 1;case"wormhole":return 2;case"cctp":return 3;case"cctpV2":return 4;case"oft":return 5}}function vd(r){return Object.entries(r).reduce((i,[a,o])=>(i[a]=Rd(o),i),{})}function Rd(r){return Object.entries(r).reduce((i,[a,o])=>{let s=hd(a);return s&&o!=null&&(i[s]=o),i},{})}function Yd(r,i){let a=S.getChainsProperties()[r];if(!a)return null;let o={...a,allbridgeChainId:i.chainId,bridgeId:i.bridgeId,bridgeAddress:i.bridgeAddress,oftBridgeAddress:i.oftBridgeAddress,yieldAddress:i.yieldAddress,transferTime:vd(i.transferTime),txCostAmount:i.txCostAmount,confirmations:i.confirmations,suiAddresses:i.suiAddresses};return{...o,tokens:i.tokens.map(s=>Id(o,s))}}function Pt(r){return r.chainSymbol+"_"+r.poolAddress}function or(r){let i=[];for(let[a,o]of Object.entries(r)){let s=a;for(let d of o.tokens)i.push({chainSymbol:s,poolAddress:d.poolAddress})}return i}function rr(r){let i={};for(let[a,o]of Object.entries(r)){let s=a;for(let[d,A]of Object.entries(o))A.imbalance=q(A),i[Pt({chainSymbol:s,poolAddress:d})]=A}return i}var Lt=class{api;constructor(i){this.api=Bd.create({baseURL:i.coreApiUrl,headers:{Accept:"application/json",...i.coreApiHeaders,"x-Sdk-Agent":"AllbridgeCoreSDK/"+nr},params:i.coreApiQueryParams})}async getTokenInfo(){let{data:i}=await this.api.get("/token-info",{params:{filter:"all"}});return{chainDetailsMap:ir(i),poolInfoMap:ar(i)}}async getPendingInfo(){let{data:i}=await this.api.get("/pending-info");return i}async getGasBalance(i,a){let{data:o}=await this.api.get(`/check/${i}/${a}`);return o}async getTransferStatus(i,a){let{data:o}=await this.api.get(`/chain/${i}/${a}`);return o}async getReceiveTransactionCost(i){if(i.messenger===5&&!i.sourceToken)throw new vn("For OFT sourceToken required");let{data:a}=await this.api.post("/receive-fee",i,{headers:{"Content-Type":"application/json"}});return{exchangeRate:a.exchangeRate,fee:a.fee,sourceNativeTokenPrice:a.sourceNativeTokenPrice,adminFeeShareWithExtras:a.adminFeeShareWithExtras}}async getPoolInfoMap(i){let a=i instanceof Array?i:[i],{data:o}=await this.api.post("/pool-info",{pools:a},{headers:{"Content-Type":"application/json"}});return rr(o)}};import Bi from"timed-cache";var Wa=20*1e3,Wd=55*1e3,Ht=class{constructor(i){this.apiClient=i;this.tokenInfoCache=new Bi({defaultTtl:Wd}),this.receivedTransactionCache=new Bi({defaultTtl:Wa}),this.pendingInfoCache=new Bi({defaultTtl:Wa}),this.gasBalanceCache=new Bi({defaultTtl:Wa})}tokenInfoCache;pendingInfoCache;gasBalanceCache;receivedTransactionCache;getTokenInfo(){let i="TOKEN_INFO_CACHE_KEY",a=this.tokenInfoCache.get(i);if(a)return a;let o=this.apiClient.getTokenInfo();return this.tokenInfoCache.put(i,o),o}async getGasBalance(i,a){let o=`GAS_BALANCE_${i}_${a}`,s=this.gasBalanceCache.get(o);if(s)return s;let d=this.apiClient.getGasBalance(i,a);return this.gasBalanceCache.put(o,d),d}async getPendingInfo(){let i="PENDING_INFO_CACHE_KEY",a=this.pendingInfoCache.get(i);if(a)return a;let o=this.apiClient.getPendingInfo();return this.pendingInfoCache.put(i,o),o}async getReceiveTransactionCost(i){let a=`RECEIVE_TX_COST_${i.sourceChainId}_${i.destinationChainId}_${i.messenger}${i.sourceToken?"_"+i.sourceToken:""}`,o=this.receivedTransactionCache.get(a);if(o)return o;let s=await this.apiClient.getReceiveTransactionCost(i);return this.receivedTransactionCache.put(a,s),s}async getTransferStatus(i,a){return this.apiClient.getTransferStatus(i,a)}async getPoolInfoMap(i){return this.apiClient.getPoolInfoMap(i)}};var jt=class{constructor(i){this.apiClient=i}async getChainDetailsMap(){return(await this.apiClient.getTokenInfo()).chainDetailsMap}async tokens(){let i=await this.getChainDetailsMap();return Object.values(i).flatMap(a=>a.tokens)}async getPendingInfo(){return this.apiClient.getPendingInfo()}async getGasBalance(i,a){return this.apiClient.getGasBalance(i,a)}async getChainDetailsMapAndPoolInfoMap(){return await this.apiClient.getTokenInfo()}async getTransferStatus(i,a){return await this.apiClient.getTransferStatus(i,a)}async getReceiveTransactionCost(i){return await this.apiClient.getReceiveTransactionCost(i)}async getPoolInfoMap(i){return await this.apiClient.getPoolInfoMap(i)}};var Jt=class{constructor(i,a){this.client=i;this.isStaging=a.coreApiQueryParams?.staging==="true"}isStaging;async getChainDetailsMap(i){let a=await this.client.getChainDetailsMap(),o={};for(let s in a){let d=a[s];d&&(o[s]={...d,tokens:sr(d.tokens,i,this.isStaging)})}return o}async tokens(i){return sr(await this.client.tokens(),i,this.isStaging)}async getPendingInfo(){return this.client.getPendingInfo()}async getGasBalance(i,a){return this.client.getGasBalance(i,a)}async getTransferStatus(i,a){return await this.client.getTransferStatus(i,a)}async getReceiveTransactionCost(i){return await this.client.getReceiveTransactionCost(i)}cachePut(i,a){return this.client.cachePut(i,a)}getPoolInfoByKey(i){return this.client.getPoolInfoByKey(i)}refreshPoolInfo(i){return this.client.refreshPoolInfo(i)}};function sr(r,i,a){return r.filter(o=>a?!0:o.flags[i]).map(fd)}function fd(r){let{flags:i,...a}=r;return a}import Td from"timed-cache";var Fd=55*1e3,kt=class{constructor(i){this.client=i;this.poolInfoCache=new fa}poolInfoCache;async getChainDetailsMap(){return(await this.client.getChainDetailsMapAndPoolInfoMap()).chainDetailsMap}async tokens(){return await this.client.tokens()}getTransferStatus(i,a){return this.client.getTransferStatus(i,a)}getReceiveTransactionCost(i){return this.client.getReceiveTransactionCost(i)}getPendingInfo(){return this.client.getPendingInfo()}getGasBalance(i,a){return this.client.getGasBalance(i,a)}async getPoolInfoByKey(i){this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap);let a=this.poolInfoCache.get(i);if(a)return a;{let o=await this.client.getPoolInfoMap(i);this.poolInfoCache.putAll(o);let s=o[Pt(i)];if(s)return s;throw new I("Cannot find pool info for "+i.poolAddress+" on chain "+i.chainSymbol)}}async refreshPoolInfo(i){let a;if(i)this.poolInfoCache.putAllIfNotExists((await this.client.getChainDetailsMapAndPoolInfoMap()).poolInfoMap),a=await this.client.getPoolInfoMap(i);else{let o=await this.client.getChainDetailsMapAndPoolInfoMap();a=await this.client.getPoolInfoMap(or(o.chainDetailsMap))}this.poolInfoCache.putAll(a)}cachePut(i,a){this.poolInfoCache.put(Pt(i),a)}},fa=class{cache;constructor(){this.cache=new Td({defaultTtl:Fd})}putAll(i){for(let[a,o]of Object.entries(i))this.cache.put(a,o)}putAllIfNotExists(i){for(let[a,o]of Object.entries(i))this.cache.get(a)||this.cache.put(a,o)}put(i,a){this.cache.put(i,a)}get(i){let a=Pt(i);return this.cache.get(a)}};import{AlgorandClient as Ar}from"@algorandfoundation/algokit-utils";import{Big as jd}from"big.js";import{TronWeb as Jd}from"tronweb";import{Web3 as kd}from"web3";import{Big as dr}from"big.js";var oe=class{async checkAllowance(i){let a=await this.getAllowance(i);return dr(a).gte(dr(i.amount))}};var un=class extends oe{constructor(a,o){super();this.algorand=a;this.api=o}chainType="SUI";approve(a){throw new X}buildRawTransactionApprove(a){throw new X}getAllowance(a){throw new X}async getNativeTokenBalance(a){let{account:o}=a;return(await this.algorand.account.getInformation(o)).balance.microAlgo.toString()}async getTokenBalance(a){let{account:o,token:s}=a;try{return(await this.algorand.asset.getAccountInformation(o,BigInt(s.tokenAddress))).balance.toString()}catch(d){if(d instanceof Error)return d.message.includes("account asset info not found"),"0";throw d}}};var Zd={abi:[{inputs:[{internalType:"string",name:"name_",type:"string"},{internalType:"string",name:"symbol_",type:"string"}],stateMutability:"nonpayable",type:"constructor"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"owner",type:"address"},{indexed:!0,internalType:"address",name:"spender",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Approval",type:"event"},{anonymous:!1,inputs:[{indexed:!0,internalType:"address",name:"from",type:"address"},{indexed:!0,internalType:"address",name:"to",type:"address"},{indexed:!1,internalType:"uint256",name:"value",type:"uint256"}],name:"Transfer",type:"event"},{inputs:[{internalType:"address",name:"owner",type:"address"},{internalType:"address",name:"spender",type:"address"}],name:"allowance",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"approve",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"account",type:"address"}],name:"balanceOf",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[],name:"decimals",outputs:[{internalType:"uint8",name:"",type:"uint8"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"subtractedValue",type:"uint256"}],name:"decreaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"spender",type:"address"},{internalType:"uint256",name:"addedValue",type:"uint256"}],name:"increaseAllowance",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[],name:"name",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"symbol",outputs:[{internalType:"string",name:"",type:"string"}],stateMutability:"view",type:"function"},{inputs:[],name:"totalSupply",outputs:[{internalType:"uint256",name:"",type:"uint256"}],stateMutability:"view",type:"function"},{inputs:[{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transfer",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"},{inputs:[{internalType:"address",name:"from",type:"address"},{internalType:"address",name:"to",type:"address"},{internalType:"uint256",name:"amount",type:"uint256"}],name:"transferFrom",outputs:[{internalType:"bool",name:"",type:"bool"}],stateMutability:"nonpayable",type:"function"}]},Wi=Zd;var Gd="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",Nd="0xdac17f958d2ee523a2206206994597c13d831ec7",wd=1e5,pn=class extends oe{constructor(a,o){super();this.web3=a;this.api=o}chainType="EVM";getAllowance(a){let o=a.token.tokenAddress,s=a.owner,d=a.spender;return this.getAllowanceByTokenAddress(o,s,d)}getAllowanceByTokenAddress(a,o,s){return this.getERC20Contract(a).methods.allowance(o,s).call()}async getTokenBalance(a){return await this.getERC20Contract(a.token.tokenAddress).methods.balanceOf(a.account).call()}async getNativeTokenBalance(a){return(await this.web3.eth.getBalance(a.account)).toString()}async approve(a){if(this.isUsdt(a.tokenAddress)&&await this.getAllowanceByTokenAddress(a.tokenAddress,a.owner,a.spender)!=="0"){let d=await this.buildRawTransactionApprove({...a,amount:"0"});await this.sendRawTransaction(d,a.chainSymbol)}let o=await this.buildRawTransactionApprove(a);return await this.sendRawTransaction(o,a.chainSymbol)}isUsdt(a){return a.toLowerCase()===Nd}buildRawTransactionApprove(a){let{tokenAddress:o,spender:s,owner:d,amount:A}=a,c=this.getERC20Contract(o).methods.approve(s,A==null?Gd:Dn(A));return Promise.resolve({from:d,to:o,value:"0",data:c.encodeABI()})}async sendRawTransaction(a,o){let s=a,d={maxPriorityFeePerGas:void 0,maxFeePerGas:void 0};o==="POL"?s.gas=wd:s.gas=await this.web3.eth.estimateGas(a);let{transactionHash:A}=await this.web3.eth.sendTransaction({...s,...d});return{txId:A.toString()}}getERC20Contract(a){return new this.web3.eth.Contract(Wi.abi,a)}};import{AnchorProvider as Xd}from"@project-serum/anchor";import{Connection as Sd,PublicKey as fi}from"@solana/web3.js";var Ti=class extends oe{constructor(a,o){super();this.solanaRpcUrl=a;this.api=o}chainType="SOLANA";approve(a){throw new X}buildRawTransactionApprove(a){throw new X}buildAnchorProvider(a){let o=new Sd(this.solanaRpcUrl,"confirmed"),s=new fi(a);return new Xd(o,{publicKey:s},{preflightCommitment:"confirmed",commitment:"confirmed"})}getAllowance(a){throw new X}async getTokenBalance(a){let{account:o,token:s}=a;try{let d=await Se(new fi(o),new fi(s.tokenAddress));return(await Wt(d,this.buildAnchorProvider(o))).amount.toString()}catch(d){if(d instanceof Error)return d.message.startsWith("Account does not exist"),"0";throw d}}async getNativeTokenBalance(a){return(await this.buildAnchorProvider(a.account).connection.getBalance(new fi(a.account))).toString()}};import{Horizon as Dv,NotFoundError as Vd}from"@stellar/stellar-sdk";var Fi=class extends oe{constructor(a,o,s){super();this.nodeRpcUrlsConfig=a;this.params=o;this.api=s}chainType="SRB";getAllowance(){throw new X}async getTokenBalance(a){if(!a.token.originTokenAddress)throw new I("OriginTokenAddress missing");let[o,s]=a.token.originTokenAddress.split(":"),d=new Dv.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),A;try{A=await d.loadAccount(a.account)}catch(l){if(l instanceof Vd)return"0";throw l}let c=A.balances.find(l=>(l.asset_type==="credit_alphanum4"||l.asset_type==="credit_alphanum12")&&l.asset_code==o&&l.asset_issuer==s);return c?.balance?Z(c.balance,S.getChainDecimalsByType(S.getChainProperty(a.token.chainSymbol).chainType)).toFixed():"0"}async getNativeTokenBalance(a){let A=(await new Dv.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")).loadAccount(a.account)).balances.find(g=>g.asset_type==="native");return A?.balance?Z(A.balance,S.getChainDecimalsByType(S.getChainProperty(a.chainSymbol).chainType)).toFixed():"0"}approve(){throw new X}buildRawTransactionApprove(){throw new X}};import{ClarigenClient as Md,contractFactory as Pd}from"@clarigen/core";var Zi=class extends oe{constructor(a,o){super();this.nodeRpcUrl=a;this.api=o}chainType="STX";async getTokenBalance(a){let o=Ft(this.nodeRpcUrl),s=new Md(o),d=Pd(Me.ftToken,a.token.tokenAddress);return(await s.roOk(d.getBalance({owner:a.account}))).toString()}async getNativeTokenBalance(a){let o=`${this.nodeRpcUrl}/extended/v1/address/${a.account}/stx`,s=await fetch(o);if(!s.ok)throw new Error(`Failed to fetch account: ${s.status}`);let A=(await s.json()).balance;return BigInt(A).toString()}getAllowance(a){throw new X}checkAllowance(a){throw new X}approve(a){throw new X}buildRawTransactionApprove(a){throw new X}};import{SuiClient as Ld}from"@mysten/sui/client";var Gi=class extends oe{constructor(a,o){super();this.suiRpcUrl=a;this.api=o;this.suiClient=new Ld({url:this.suiRpcUrl})}chainType="SUI";suiClient;approve(a){throw new X}buildRawTransactionApprove(a){throw new X}getAllowance(a){throw new X}async getTokenBalance(a){if(!a.token.originTokenAddress)throw new I("SUI token must contain 'originTokenAddress'");return(await this.suiClient.getBalance({owner:a.account,coinType:a.token.originTokenAddress})).totalBalance}async getNativeTokenBalance(a){let o=await Oe(s=>this.suiClient.getCoins({owner:a.account,cursor:s}));return o.length===0?"0":o.reduce((s,d)=>s+BigInt(d.balance),BigInt(0)).toString()}};var Hd="0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",mn=class extends oe{constructor(a,o){super();this.tronWeb=a;this.api=o}chainType="TRX";async getAllowance(a){let{token:{tokenAddress:o},owner:s}=a;return(await(await this.getContract(o)).methods.allowance(s,a.spender).call()).toString()}async getTokenBalance(a){return(await(await this.getContract(a.token.tokenAddress)).balanceOf(a.account).call()).toString()}async getNativeTokenBalance(a){return(await this.tronWeb.trx.getBalance(a.account)).toString()}async approve(a){let o=await this.buildRawTransactionApprove(a);return await En(this.tronWeb,o)}async buildRawTransactionApprove(a){let{tokenAddress:o,spender:s,owner:d,amount:A}=a,g=A==null?Hd:Dn(A),c=[{type:"address",value:s},{type:"uint256",value:g}];return this.buildRawTransaction(o,"approve(address,uint256)",c,"0",d)}getContract(a){return this.tronWeb.contract(Wi.abi,a)}async buildRawTransaction(a,o,s,d,A){let g=await this.tronWeb.transactionBuilder.triggerSmartContract(a,o,{callValue:+d},s,A);if(!g?.result?.result)throw new I("Unknown error: "+JSON.stringify(g,null,2));return g.transaction}};var zt=class{constructor(i,a,o){this.api=i;this.nodeRpcUrlsConfig=a;this.params=o}async getAllowance(i,a){let o=await this.getChainTokenService(i.token.chainSymbol,i.owner,a).getAllowance(i);return F(o,i.token.decimals).toFixed()}async checkAllowance(i,a){return V(i.amount),H("amount",i.amount,i.token.decimals),this.getChainTokenService(i.token.chainSymbol,i.owner,a).checkAllowance(this.prepareCheckAllowanceParams(i))}async approve(i,a){return a.amount&&(V(a.amount),H("amount",a.amount,a.token.decimals)),this.getChainTokenService(a.token.chainSymbol,a.owner,i).approve(this.prepareApproveParams(a))}async buildRawTransactionApprove(i,a){return i.amount&&(V(i.amount),H("amount",i.amount,i.token.decimals)),this.getChainTokenService(i.token.chainSymbol,i.owner,a).buildRawTransactionApprove(this.prepareApproveParams(i))}async getTokenBalance(i,a){let o=await this.getChainTokenService(i.token.chainSymbol,i.account,a).getTokenBalance(i);return i.token.decimals?F(o,i.token.decimals).toFixed():o}async getNativeTokenBalance(i,a){let o=await this.getChainTokenService(i.chainSymbol,i.account,a).getNativeTokenBalance(i);return{int:o,float:F(o,S.getChainDecimalsByType(S.getChainProperty(i.chainSymbol).chainType)).toFixed()}}getChainTokenService(i,a,o){switch(S.getChainProperty(i).chainType){case"EVM":{if(o)return new pn(o,this.api);{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i);return new pn(new kd(s),this.api)}}case"TRX":{if(o)return new mn(o,this.api);{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i),d=new Jd({fullHost:s});return d.setAddress(a),new mn(d,this.api)}}case"SOLANA":{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i);return new Ti(s,this.api)}case"SRB":return new Fi(this.nodeRpcUrlsConfig,this.params,this.api);case"SUI":return new Gi(this.nodeRpcUrlsConfig.getNodeRpcUrl(i),this.api);case"ALG":if(o){let s=o,d=Ar.fromClients({algod:s});return new un(d,this.api)}else{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i),d=Ar.fromConfig({algodConfig:{server:s}});return new un(d,this.api)}case"STX":{let s=this.nodeRpcUrlsConfig.getNodeRpcUrl(i);return new Zi(s,this.api)}}}prepareCheckAllowanceParams(i){return{...i,amount:Z(i.amount,i.token.decimals)}}prepareApproveParams(i){return{tokenAddress:i.token.tokenAddress,owner:i.owner,spender:i.spender,chainSymbol:i.token.chainSymbol,amount:i.amount==null?void 0:jd(i.amount).toFixed()}}};var Ni=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a;let o=new Lt(a),s=new Ht(o),d=new jt(s),A=new kt(d);this.api=new Jt(A,a),this.tokenService=new zt(this.api,i,a)}api;tokenService;buildRawTransactionApprove(i,a){return this.tokenService.buildRawTransactionApprove(i,a)}checkAllowance(i,a){return this.tokenService.checkAllowance(i,a)}getAllowance(i,a){return this.tokenService.getAllowance(i,a)}};import{Connection as zd,PublicKey as xd,TransactionMessage as Od}from"@solana/web3.js";var wi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a}async addMemoToTx(i,a){if(a.length>28)throw new I("InvalidArgumentException memo cannot be more than 28 characters");let o=new zd(this.nodeRpcUrlsConfig.getNodeRpcUrl("SOL"),"confirmed"),s=await pt(i,o),d=Od.decompile(i.message,{addressLookupTableAccounts:s}),A=d.instructions[d.instructions.length-1];if(!A?.keys)throw new I("Last instruction or its keys are invalid.");A.keys.push({pubkey:new xd(Buffer.from(a)),isSigner:!1,isWritable:!1}),i.message=d.compileToV0Message(s)}};import{Asset as Ud,BASE_FEE as Dd,contract as nf,Horizon as gr,Operation as Ed,Operation as _d,rpc as Cn,TimeoutInfinite as $d,TransactionBuilder as Ta,TransactionBuilder as cr}from"@stellar/stellar-sdk";import{contract as e}from"@stellar/stellar-sdk";var Qd=e.Spec,Kd=e.Client;var bn=class extends Kd{constructor(a){super(new Qd(["AAAAAAAAAYlSZXR1cm5zIHRoZSBhbGxvd2FuY2UgZm9yIGBzcGVuZGVyYCB0byB0cmFuc2ZlciBmcm9tIGBmcm9tYC4KClRoZSBhbW91bnQgcmV0dXJuZWQgaXMgdGhlIGFtb3VudCB0aGF0IHNwZW5kZXIgaXMgYWxsb3dlZCB0byB0cmFuc2ZlcgpvdXQgb2YgZnJvbSdzIGJhbGFuY2UuIFdoZW4gdGhlIHNwZW5kZXIgdHJhbnNmZXJzIGFtb3VudHMsIHRoZSBhbGxvd2FuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQgdHJhbnNmZXJlZC4KCiMgQXJndW1lbnRzCgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHRvIGJlIGRyYXduIGZyb20uCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3Mgc3BlbmRpbmcgdGhlIHRva2VucyBoZWxkIGJ5IGBmcm9tYC4AAAAAAAAJYWxsb3dhbmNlAAAAAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAEAAAAL","AAAAAAAAAIlSZXR1cm5zIHRydWUgaWYgYGlkYCBpcyBhdXRob3JpemVkIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBmb3Igd2hpY2ggdG9rZW4gYXV0aG9yaXphdGlvbiBpcyBiZWluZyBjaGVja2VkLgAAAAAAAAphdXRob3JpemVkAAAAAAABAAAAAAAAAAJpZAAAAAAAEwAAAAEAAAAB","AAAAAAAAA55TZXQgdGhlIGFsbG93YW5jZSBieSBgYW1vdW50YCBmb3IgYHNwZW5kZXJgIHRvIHRyYW5zZmVyL2J1cm4gZnJvbQpgZnJvbWAuCgpUaGUgYW1vdW50IHNldCBpcyB0aGUgYW1vdW50IHRoYXQgc3BlbmRlciBpcyBhcHByb3ZlZCB0byB0cmFuc2ZlciBvdXQgb2YKZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byB0cmFuc2ZlciBhbW91bnRzLCBhbmQKd2hlbiBhbiBhbW91bnQgaXMgdHJhbnNmZXJyZWQgdGhlIGFsbG93YW5jZSB3aWxsIGJlIHJlZHVjZWQgYnkgdGhlCmFtb3VudCB0cmFuc2ZlcmVkLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgdG8gYmUgZHJhd24gZnJvbS4KKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBiZWluZyBhdXRob3JpemVkIHRvIHNwZW5kIHRoZSB0b2tlbnMgaGVsZCBieQpgZnJvbWAuCiogYGFtb3VudGAgLSBUaGUgdG9rZW5zIHRvIGJlIG1hZGUgYXZhaWxhYmxlIHRvIGBzcGVuZGVyYC4KKiBgZXhwaXJhdGlvbl9sZWRnZXJgIC0gVGhlIGxlZGdlciBudW1iZXIgd2hlcmUgdGhpcyBhbGxvd2FuY2UgZXhwaXJlcy4gQ2Fubm90CmJlIGxlc3MgdGhhbiB0aGUgY3VycmVudCBsZWRnZXIgbnVtYmVyIHVubGVzcyB0aGUgYW1vdW50IGlzIGJlaW5nIHNldCB0byAwLgpBbiBleHBpcmVkIGVudHJ5ICh3aGVyZSBleHBpcmF0aW9uX2xlZGdlciA8IHRoZSBjdXJyZW50IGxlZGdlciBudW1iZXIpCnNob3VsZCBiZSB0cmVhdGVkIGFzIGEgMCBhbW91bnQgYWxsb3dhbmNlLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImFwcHJvdmUiLCBmcm9tOiBBZGRyZXNzLApzcGVuZGVyOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6IGkxMjgsIGV4cGlyYXRpb25fbGVkZ2VyOiB1MzJdYAAAAAAAB2FwcHJvdmUAAAAABAAAAAAAAAAEZnJvbQAAABMAAAAAAAAAB3NwZW5kZXIAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAAAAABFleHBpcmF0aW9uX2xlZGdlcgAAAAAAAAQAAAAA","AAAAAAAAAJhSZXR1cm5zIHRoZSBiYWxhbmNlIG9mIGBpZGAuCgojIEFyZ3VtZW50cwoKKiBgaWRgIC0gVGhlIGFkZHJlc3MgZm9yIHdoaWNoIGEgYmFsYW5jZSBpcyBiZWluZyBxdWVyaWVkLiBJZiB0aGUKYWRkcmVzcyBoYXMgbm8gZXhpc3RpbmcgYmFsYW5jZSwgcmV0dXJucyAwLgAAAAdiYWxhbmNlAAAAAAEAAAAAAAAAAmlkAAAAAAATAAAAAQAAAAs=","AAAAAAAAAWRCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLgoKUmVkdWNlcyBmcm9tJ3MgYmFsYW5jZSBieSB0aGUgYW1vdW50LCB3aXRob3V0IHRyYW5zZmVycmluZyB0aGUgYmFsYW5jZQp0byBhbm90aGVyIGhvbGRlcidzIGJhbGFuY2UuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIG9mIHRva2VucyB3aGljaCB3aWxsIGJlCmJ1cm5lZCBmcm9tLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgYnVybmVkLgoKIyBFdmVudHMKCkVtaXRzIGFuIGV2ZW50IHdpdGggdG9waWNzIGBbImJ1cm4iLCBmcm9tOiBBZGRyZXNzXSwgZGF0YSA9IFthbW91bnQ6CmkxMjhdYAAAAARidXJuAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAtxCdXJuIGBhbW91bnRgIGZyb20gYGZyb21gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSBvZiBgc3BlbmRlcmAuCgpSZWR1Y2VzIGZyb20ncyBiYWxhbmNlIGJ5IHRoZSBhbW91bnQsIHdpdGhvdXQgdHJhbnNmZXJyaW5nIHRoZSBiYWxhbmNlCnRvIGFub3RoZXIgaG9sZGVyJ3MgYmFsYW5jZS4KClRoZSBzcGVuZGVyIHdpbGwgYmUgYWxsb3dlZCB0byBidXJuIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZSwgaWYKdGhlIGFtb3VudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFsbG93YW5jZSB0aGF0IHRoZSBzcGVuZGVyIGhhcwpvbiB0aGUgZnJvbSdzIGJhbGFuY2UuIFRoZSBzcGVuZGVyJ3MgYWxsb3dhbmNlIG9uIGZyb20ncyBiYWxhbmNlIHdpbGwgYmUKcmVkdWNlZCBieSB0aGUgYW1vdW50LgoKIyBBcmd1bWVudHMKCiogYHNwZW5kZXJgIC0gVGhlIGFkZHJlc3MgYXV0aG9yaXppbmcgdGhlIGJ1cm4sIGFuZCBoYXZpbmcgaXRzIGFsbG93YW5jZQpjb25zdW1lZCBkdXJpbmcgdGhlIGJ1cm4uCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQpidXJuZWQgZnJvbS4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIGJ1cm5lZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJidXJuIiwgZnJvbTogQWRkcmVzc10sIGRhdGEgPSBbYW1vdW50OgppMTI4XWAAAAAJYnVybl9mcm9tAAAAAAAAAwAAAAAAAAAHc3BlbmRlcgAAAAATAAAAAAAAAARmcm9tAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==","AAAAAAAAAVNDbGF3YmFjayBgYW1vdW50YCBmcm9tIGBmcm9tYCBhY2NvdW50LiBgYW1vdW50YCBpcyBidXJuZWQgaW4gdGhlCmNsYXdiYWNrIHByb2Nlc3MuCgojIEFyZ3VtZW50cwoKKiBgZnJvbWAgLSBUaGUgYWRkcmVzcyBob2xkaW5nIHRoZSBiYWxhbmNlIGZyb20gd2hpY2ggdGhlIGNsYXdiYWNrIHdpbGwKdGFrZSB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSBjbGF3ZWQgYmFjay4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJjbGF3YmFjayIsIGFkbWluOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAACGNsYXdiYWNrAAAAAgAAAAAAAAAEZnJvbQAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAIBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVjaW1hbHMgdXNlZCB0byByZXByZXNlbnQgYW1vdW50cyBvZiB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAhkZWNpbWFscwAAAAAAAAABAAAABA==","AAAAAAAAAPVNaW50cyBgYW1vdW50YCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgbWludGVkIHRva2Vucy4KKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgdG9rZW5zIHRvIGJlIG1pbnRlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJtaW50IiwgYWRtaW46IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwgZGF0YQo9IFthbW91bnQ6IGkxMjhdYAAAAAAAAARtaW50AAAAAgAAAAAAAAACdG8AAAAAABMAAAAAAAAABmFtb3VudAAAAAAACwAAAAA=","AAAAAAAAAFlSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGlzIHRva2VuLgoKIyBQYW5pY3MKCklmIHRoZSBjb250cmFjdCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgAAAAAAAARuYW1lAAAAAAAAAAEAAAAQ","AAAAAAAAAQxTZXRzIHRoZSBhZG1pbmlzdHJhdG9yIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBgbmV3X2FkbWluYC4KCiMgQXJndW1lbnRzCgoqIGBuZXdfYWRtaW5gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCBoZW5jZWZvcnRoIGJlIHRoZSBhZG1pbmlzdHJhdG9yCm9mIHRoaXMgdG9rZW4gY29udHJhY3QuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2FkbWluIiwgYWRtaW46IEFkZHJlc3NdLCBkYXRhID0KW25ld19hZG1pbjogQWRkcmVzc11gAAAACXNldF9hZG1pbgAAAAAAAAEAAAAAAAAACW5ld19hZG1pbgAAAAAAABMAAAAA","AAAAAAAAAEZSZXR1cm5zIHRoZSBhZG1pbiBvZiB0aGUgY29udHJhY3QuCgojIFBhbmljcwoKSWYgdGhlIGFkbWluIGlzIG5vdCBzZXQuAAAAAAAFYWRtaW4AAAAAAAAAAAAAAQAAABM=","AAAAAAAAAVBTZXRzIHdoZXRoZXIgdGhlIGFjY291bnQgaXMgYXV0aG9yaXplZCB0byB1c2UgaXRzIGJhbGFuY2UuIElmCmBhdXRob3JpemVkYCBpcyB0cnVlLCBgaWRgIHNob3VsZCBiZSBhYmxlIHRvIHVzZSBpdHMgYmFsYW5jZS4KCiMgQXJndW1lbnRzCgoqIGBpZGAgLSBUaGUgYWRkcmVzcyBiZWluZyAoZGUtKWF1dGhvcml6ZWQuCiogYGF1dGhvcml6ZWAgLSBXaGV0aGVyIG9yIG5vdCBgaWRgIGNhbiB1c2UgaXRzIGJhbGFuY2UuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsic2V0X2F1dGhvcml6ZWQiLCBpZDogQWRkcmVzc10sIGRhdGEgPQpbYXV0aG9yaXplOiBib29sXWAAAAAOc2V0X2F1dGhvcml6ZWQAAAAAAAIAAAAAAAAAAmlkAAAAAAATAAAAAAAAAAlhdXRob3JpemUAAAAAAAABAAAAAA==","AAAAAAAAAFtSZXR1cm5zIHRoZSBzeW1ib2wgZm9yIHRoaXMgdG9rZW4uCgojIFBhbmljcwoKSWYgdGhlIGNvbnRyYWN0IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuAAAAAAZzeW1ib2wAAAAAAAAAAAABAAAAEA==","AAAAAAAAAWRUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLgoKIyBBcmd1bWVudHMKCiogYGZyb21gIC0gVGhlIGFkZHJlc3MgaG9sZGluZyB0aGUgYmFsYW5jZSBvZiB0b2tlbnMgd2hpY2ggd2lsbCBiZQp3aXRoZHJhd24gZnJvbS4KKiBgdG9gIC0gVGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSB0cmFuc2ZlcnJlZCB0b2tlbnMuCiogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIHRva2VucyB0byBiZSB0cmFuc2ZlcnJlZC4KCiMgRXZlbnRzCgpFbWl0cyBhbiBldmVudCB3aXRoIHRvcGljcyBgWyJ0cmFuc2ZlciIsIGZyb206IEFkZHJlc3MsIHRvOiBBZGRyZXNzXSwKZGF0YSA9IFthbW91bnQ6IGkxMjhdYAAAAAh0cmFuc2ZlcgAAAAMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA==","AAAAAAAAAzNUcmFuc2ZlciBgYW1vdW50YCBmcm9tIGBmcm9tYCB0byBgdG9gLCBjb25zdW1pbmcgdGhlIGFsbG93YW5jZSB0aGF0CmBzcGVuZGVyYCBoYXMgb24gYGZyb21gJ3MgYmFsYW5jZS4gQXV0aG9yaXplZCBieSBzcGVuZGVyCihgc3BlbmRlci5yZXF1aXJlX2F1dGgoKWApLgoKVGhlIHNwZW5kZXIgd2lsbCBiZSBhbGxvd2VkIHRvIHRyYW5zZmVyIHRoZSBhbW91bnQgZnJvbSBmcm9tJ3MgYmFsYW5jZQppZiB0aGUgYW1vdW50IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgYWxsb3dhbmNlIHRoYXQgdGhlIHNwZW5kZXIKaGFzIG9uIHRoZSBmcm9tJ3MgYmFsYW5jZS4gVGhlIHNwZW5kZXIncyBhbGxvd2FuY2Ugb24gZnJvbSdzIGJhbGFuY2UKd2lsbCBiZSByZWR1Y2VkIGJ5IHRoZSBhbW91bnQuCgojIEFyZ3VtZW50cwoKKiBgc3BlbmRlcmAgLSBUaGUgYWRkcmVzcyBhdXRob3JpemluZyB0aGUgdHJhbnNmZXIsIGFuZCBoYXZpbmcgaXRzCmFsbG93YW5jZSBjb25zdW1lZCBkdXJpbmcgdGhlIHRyYW5zZmVyLgoqIGBmcm9tYCAtIFRoZSBhZGRyZXNzIGhvbGRpbmcgdGhlIGJhbGFuY2Ugb2YgdG9rZW5zIHdoaWNoIHdpbGwgYmUKd2l0aGRyYXduIGZyb20uCiogYHRvYCAtIFRoZSBhZGRyZXNzIHdoaWNoIHdpbGwgcmVjZWl2ZSB0aGUgdHJhbnNmZXJyZWQgdG9rZW5zLgoqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiB0b2tlbnMgdG8gYmUgdHJhbnNmZXJyZWQuCgojIEV2ZW50cwoKRW1pdHMgYW4gZXZlbnQgd2l0aCB0b3BpY3MgYFsidHJhbnNmZXIiLCBmcm9tOiBBZGRyZXNzLCB0bzogQWRkcmVzc10sCmRhdGEgPSBbYW1vdW50OiBpMTI4XWAAAAAADXRyYW5zZmVyX2Zyb20AAAAAAAAEAAAAAAAAAAdzcGVuZGVyAAAAABMAAAAAAAAABGZyb20AAAATAAAAAAAAAAJ0bwAAAAAAEwAAAAAAAAAGYW1vdW50AAAAAAALAAAAAA=="]),a);this.options=a}fromJSON={allowance:this.txFromJSON,authorized:this.txFromJSON,approve:this.txFromJSON,balance:this.txFromJSON,burn:this.txFromJSON,burn_from:this.txFromJSON,clawback:this.txFromJSON,decimals:this.txFromJSON,mint:this.txFromJSON,name:this.txFromJSON,set_admin:this.txFromJSON,admin:this.txFromJSON,set_authorized:this.txFromJSON,symbol:this.txFromJSON,transfer:this.txFromJSON,transfer_from:this.txFromJSON}};var qd=100,eA=180,Xi=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.params=a}async buildChangeTrustLineXdrTx(i){let o=await new gr.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")).loadAccount(i.sender),d=await this.getContract(bn,i.tokenAddress).name();if(Xt(d))throw new I;let A=wt(d);if(!A)throw new I;let[g,c]=A.split(":");if(g===void 0||c===void 0)throw new I("Invalid token name format. Expected format 'symbol:srbTokenAddress'");let l=new Ud(g,c),u=_d.changeTrust({asset:l,limit:i.limit});return new cr(o,{fee:qd.toString(10),networkPassphrase:this.params.sorobanNetworkPassphrase}).addOperation(u).setTimeout(eA).build().toXDR()}async getBalanceLine(i,a){let s=await this.getContract(bn,a).name();if(Xt(s))throw new I;let d=wt(s);if(!d)throw new I;let[A,g]=d.split(":"),c=this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR");return(await new gr.Server(c).loadAccount(i)).balances.find(m=>(m.asset_type==="credit_alphanum4"||m.asset_type==="credit_alphanum12")&&m.asset_code==A&&m.asset_issuer==g)}async submitTransactionStellar(i){let a=new gr.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR")),o=cr.fromXDR(i,this.nodeRpcUrlsConfig.getNodeRpcUrl("STLR"));return await a.submitTransaction(o)}async simulateAndCheckRestoreTxRequiredSoroban(i,a){let o=new Cn.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),s=await o.getAccount(a),d=Ta.fromXDR(i,this.params.sorobanNetworkPassphrase),A=await o.simulateTransaction(d);if(Cn.Api.isSimulationRestore(A))return new Ta(s,{fee:(+Dd+ +A.restorePreamble.minResourceFee).toString(),networkPassphrase:this.params.sorobanNetworkPassphrase}).setSorobanData(A.restorePreamble.transactionData.build()).addOperation(Ed.restoreFootprint({})).setTimeout($d).build().toXDR()}async sendTransactionSoroban(i){let a=new Cn.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),o=Ta.fromXDR(i,this.params.sorobanNetworkPassphrase);return a.sendTransaction(o)}async confirmTx(i,a=15){let o=new Cn.Server(this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")),s=await Ga(()=>o.getTransaction(i),A=>A.status===Cn.Api.GetTransactionStatus.NOT_FOUND,a);if(s.length===0)throw new I("No transaction responses found.");let d=s[s.length-1];if(!d)throw new I("Unexpected error: last response is undefined.");return d}getContract(i,a){let o={contractId:a,networkPassphrase:this.params.sorobanNetworkPassphrase,rpcUrl:this.nodeRpcUrlsConfig.getNodeRpcUrl("SRB")};return new i(o)}};var Si=class{constructor(i,a){this.nodeRpcUrlsConfig=i;this.api=a}_suiBridgeService;async buildSendTxFromCustomTx(i,a,o){return this.suiBridgeService.buildRawTransactionSendFromCustomTx(i,a,o)}get suiBridgeService(){return this._suiBridgeService||(this._suiBridgeService=new Gt(this.nodeRpcUrlsConfig,this.api)),this._suiBridgeService}};var Vi=class{constructor(i){this.service=i;this.srb=new Xi(i.nodeRpcUrlsConfig,i.params),this.sol=new wi(i.nodeRpcUrlsConfig,i.params),this.sui=new Si(i.nodeRpcUrlsConfig,i.api),this.evm=new Ni(i.nodeRpcUrlsConfig,i.params),this.alg=new Yi(i.nodeRpcUrlsConfig)}srb;sol;sui;evm;alg};var Ee=(a=>(a.WITH_NATIVE_CURRENCY="native",a.WITH_STABLECOIN="stablecoin",a))(Ee||{}),Xn=(a=>(a.INT="int",a.FLOAT="float",a))(Xn||{});import{Big as te}from"big.js";var yn=class{constructor(i){this.nodeRpcUrls=i}getNodeRpcUrl(i){let a=this.nodeRpcUrls[i];if(a!==void 0)return a;throw new Bn(i)}},Mi=class{constructor(i,a=hn){this.nodeRpcUrlsConfig=i;S.addChainsProperties(a.additionalChainsProperties);let o=new Lt(a),s=new Ht(o),d=new jt(s),A=new kt(d);this.api=new Jt(A,a),this.tokenService=new zt(this.api,i,a),this.bridge=new _n(this.api,i,a,this.tokenService),this.pool=new yi(this.api,i,a,this.tokenService),this.yield=new Ri(this.api,i,a,this.tokenService),this.params=a}api;tokenService;params;bridge;pool;yield;async chainDetailsMap(i){return this.api.getChainDetailsMap(i)}async tokens(i){return this.api.tokens(i)}async tokensByChain(i,a){let s=(await this.api.getChainDetailsMap(a))[i];return s?s.tokens:[]}async getTransferStatus(i,a){return this.api.getTransferStatus(i,a)}async getGasBalance(i,a){return this.api.getGasBalance(i,a)}async checkAddress(){return new Promise(i=>{i({status:"OK",gasBalance:null})})}async getPendingStatusInfo(i,a,o,s){V(i);let d;a=="float"?(H("amount",i,o.decimals),d=Z(i,o.decimals).toFixed()):d=i;let A=Je(d,o,await ee(this.api,o)),g=await ee(this.api,s),c=this.getAmountFromVUsdFormatted(A,s,g),l,u=await this.api.getPendingInfo();for(let p in u[s.chainSymbol]){let m=u[s.chainSymbol];if(!m)throw new I("Cannot find pending info for "+s.chainSymbol);l=m[p]}if(l){let p=Na(l.totalSentAmount,g),m=this.getAmountFromVUsdFormatted(A,s,p),y;return te(m.int).gt(c.int)?y={min:c,max:m}:y={min:m,max:c},{pendingTxs:l.pendingTxs,pendingAmount:{int:We(l.totalSentAmount,3,s.decimals).toFixed(0),float:F(l.totalSentAmount,3).toFixed()},estimatedAmount:y}}return{pendingTxs:0,pendingAmount:{int:"0",float:"0"},estimatedAmount:{min:c,max:c}}}async getTokenBalance(i,a){return this.tokenService.getTokenBalance(i,a)}async getNativeTokenBalance(i,a){return this.tokenService.getNativeTokenBalance(i,a)}async calculateFeePercentOnSourceChain(i,a){V(i),H("amountFloat",i,a.decimals);let o=Z(i,a.decimals);if(o.eq(0))return 0;let s=Je(o,a,await ee(this.api,a)),d=ue(s,a.decimals);return ki(o,d)}async calculateFeePercentOnDestinationChain(i,a,o){V(i),H("amountFloat",i,a.decimals);let s=Z(i,a.decimals);if(s.eq(0))return 0;let d=Je(s,a,await ee(this.api,a)),A=Ut(d,o,await ee(this.api,o)),g=ue(d,o.decimals);return ki(g,A)}async getAmountToBeReceivedAndGasFeeOptions(i,a,o,s){return V(i),H("amountToSendFloat",i,a.decimals),{amountToSendFloat:te(i).toFixed(),amountToBeReceivedFloat:await this.getAmountToBeReceived(i,a,o,s),gasFeeOptions:await this.getGasFeeOptions(a,o,s)}}async getAmountToSendAndGasFeeOptions(i,a,o,s){return V(i),H("amountToBeReceivedFloat",i,o.decimals),{amountToSendFloat:await this.getAmountToSend(i,a,o,s),amountToBeReceivedFloat:te(i).toFixed(),gasFeeOptions:await this.getGasFeeOptions(a,o,s)}}async getAmountToBeReceived(i,a,o,s){return this.getAmountToBeReceivedCompute(i,a,o,s,async()=>await ee(this.api,a),async()=>await ee(this.api,o))}async getAmountToBeReceivedFromChain(i,a,o,s,d,A){return this.getAmountToBeReceivedCompute(i,a,o,s,async()=>await this.pool.getPoolInfoFromChain(a,d),async()=>await this.pool.getPoolInfoFromChain(o,A))}async getAmountToBeReceivedCompute(i,a,o,s=1,d,A){switch(s){case 1:case 2:return this.getAmountToBeReceivedComputeWithPools(i,a,o,await d(),await A());case 3:case 4:return this.getAmountToBeReceivedComputeCctp(i,a,o,s);case 5:return this.getAmountToBeReceivedComputeOft(i,a,o)}}getAmountToBeReceivedComputeWithPools(i,a,o,s,d){V(i),H("amountToSendFloat",i,a.decimals);let A=Z(i,a.decimals),g=Je(A,a,s);return this.getAmountFromVUsdFormatted(g,o,d).float}getAmountToBeReceivedComputeCctp(i,a,o,s){V(i),H("amountToSendFloat",i,a.decimals);let d=Z(i,a.decimals);switch(s){case 3:{if(!a.cctpAddress||!o.cctpAddress||!a.cctpFeeShare)throw new ce("Such route does not support CCTP protocol");let A=d.mul(te(1).minus(a.cctpFeeShare)).round(0,te.roundUp),g=We(A,a.decimals,o.decimals).round(0);return F(g,o.decimals).toFixed()}case 4:{if(!a.cctpV2Address||!o.cctpV2Address||!a.cctpV2FeeShare)throw new ce("Such route does not support CCTP V2 protocol");let A=d.mul(te(1).minus(a.cctpV2FeeShare)).round(0,te.roundUp),g=We(A,a.decimals,o.decimals).round(0);return F(g,o.decimals).toFixed()}}}async getAmountToBeReceivedComputeOft(i,a,o){V(i),H("amountToSendFloat",i,a.decimals);let s=Z(i,a.decimals);if(!a.oftBridgeAddress||!o.oftBridgeAddress||a.oftId!==o.oftId)throw new le("Such route does not support OFT protocol");let{adminFeeShareWithExtras:d}=await this.api.getReceiveTransactionCost({sourceChainId:a.allbridgeChainId,destinationChainId:o.allbridgeChainId,messenger:5,sourceToken:a.tokenAddress});if(!d)throw new le("Such route does not support OFT protocol");let A=s.mul(te(1).minus(d)).round(0,te.roundUp),g=We(A,a.decimals,o.decimals).round(0);return F(g,o.decimals).toFixed()}async getAmountToSend(i,a,o,s){return this.getAmountToSendCompute(i,a,o,s,()=>ee(this.api,a),()=>ee(this.api,o))}async getAmountToSendFromChain(i,a,o,s,d,A){return this.getAmountToSendCompute(i,a,o,s,()=>this.pool.getPoolInfoFromChain(a,d),()=>this.pool.getPoolInfoFromChain(o,A))}async getAmountToSendCompute(i,a,o,s=1,d,A){switch(s){case 1:case 2:return this.getAmountToSendComputeWithPools(i,a,o,await d(),await A());case 3:case 4:return this.getAmountToSendComputeCctp(i,a,o,s);case 5:return this.getAmountToSendComputeOft(i,a,o)}}getAmountToSendComputeWithPools(i,a,o,s,d){V(i),H("amountToBeReceivedFloat",i,o.decimals);let A=Z(i,o.decimals),g=Xa(A,o,d),c=wa(g,a,s);if(te(c).lte(0))throw new Ue;return F(c,a.decimals).toFixed()}getAmountToSendComputeCctp(i,a,o,s){V(i),H("amountToBeReceivedFloat",i,o.decimals);let d=Z(i,o.decimals);switch(s){case 3:{if(!a.cctpAddress||!o.cctpAddress||!a.cctpFeeShare)throw new ce("Such route does not support CCTP protocol");let A=d.div(te(1).minus(a.cctpFeeShare)).round(0,te.roundDown),g=We(A,o.decimals,a.decimals).round(0);return F(g,a.decimals).toFixed()}case 4:{if(!a.cctpV2Address||!o.cctpV2Address||!a.cctpV2FeeShare)throw new ce("Such route does not support CCTP V2 protocol");let A=d.div(te(1).minus(a.cctpV2FeeShare)).round(0,te.roundDown),g=We(A,o.decimals,a.decimals).round(0);return F(g,a.decimals).toFixed()}}}async getAmountToSendComputeOft(i,a,o){V(i),H("amountToBeReceivedFloat",i,o.decimals);let s=Z(i,o.decimals);if(!a.oftId||!o.oftId||!a.oftBridgeAddress||a.oftId!==o.oftId)throw new le("Such route does not support OFT protocol");let{adminFeeShareWithExtras:d}=await this.api.getReceiveTransactionCost({sourceChainId:a.allbridgeChainId,destinationChainId:o.allbridgeChainId,messenger:5,sourceToken:a.tokenAddress});if(!d)throw new le("Such route does not support OFT protocol");let A=s.div(te(1).minus(d)).round(0,te.roundDown),g=We(A,o.decimals,a.decimals).round(0);return F(g,a.decimals).toFixed()}async getGasFeeOptions(i,a,o){return xi(i,a.allbridgeChainId,o,this.api)}getAverageTransferTime(i,a,o){return i.transferTime?.[a.chainSymbol]?.[o]??null}async getPoolInfoByToken(i){return await this.api.getPoolInfoByKey({chainSymbol:i.chainSymbol,poolAddress:i.poolAddress})}async refreshPoolInfo(i){if(i){let o=(i instanceof Array?i:[i]).map(s=>({chainSymbol:s.chainSymbol,poolAddress:s.poolAddress}));return this.api.refreshPoolInfo(o)}return this.api.refreshPoolInfo()}aprInPercents(i){return Va(i)}async getExtraGasMaxLimits(i,a,o){return await Oi(i,a,o,this.api)}async getVUsdFromAmount(i,a,o){V(i);let s;a=="float"?(H("amount",i,o.decimals),s=Z(i,o.decimals).toFixed()):s=i;let d=Je(s,o,await ee(this.api,o));return{int:d,float:F(d,3).toFixed()}}async getAmountFromVUsd(i,a){return this.getAmountFromVUsdFormatted(i,a,await ee(this.api,a))}getAmountFromVUsdFormatted(i,a,o){V(i);let s=Ut(i,a,o);if(te(s).lt(0))throw new Ue;return{int:s,float:F(s,a.decimals).toFixed()}}async swapAndBridgeFeeCalculation(i,a,o){return $o(i,{decimals:a.decimals,feeShare:a.feeShare,poolInfo:await ee(this.api,a)},{decimals:o.decimals,feeShare:o.feeShare,poolInfo:await ee(this.api,o)})}async swapAndBridgeFeeCalculationReverse(i,a,o){let s=qo(i,{decimals:a.decimals,feeShare:a.feeShare,poolInfo:await ee(this.api,a)},{decimals:o.decimals,feeShare:o.feeShare,poolInfo:await ee(this.api,o)}),d=s.swapFromVUsdCalcResult.amountIncludingCommissionInTokenPrecision;if(te(d).lt(0))throw new Ue;return s}async getSendAmountDetails(i,a,o,s){V(i);let d;return a=="float"?(H("amount",i,o.decimals),d=Z(i,o.decimals).toFixed()):d=i,er(d,o,await ee(this.api,o),s,await ee(this.api,s))}};function tA(r){return"solanaRpcUrl"in r}var lr=class{params;bridge;pool;yield;utils;service;constructor(i,a=hn){let o;tA(i)?o=new yn({SOL:i.solanaRpcUrl,TRX:i.tronRpcUrl}):o=new yn(i),this.service=new Mi(o,a),this.bridge=this.service.bridge,this.pool=this.service.pool,this.yield=this.service.yield,this.utils=new Vi(this.service),this.params=a}async chainDetailsMap(i="swap"){return this.service.chainDetailsMap(i)}async tokens(i="swap"){return this.service.tokens(i)}async tokensByChain(i,a="swap"){return this.service.tokensByChain(i,a)}async getTransferStatus(i,a){return this.service.getTransferStatus(i,a)}async getGasBalance(i,a){return this.service.getGasBalance(i,a)}async checkAddress(i,a,o){return await this.service.checkAddress()}async getPendingStatusInfo(i,a,o,s){return this.service.getPendingStatusInfo(i,a,o,s)}async getTokenBalance(i,a){return this.service.getTokenBalance(i,a)}async getNativeTokenBalance(i,a){return this.service.getNativeTokenBalance(i,a)}async calculateFeePercentOnSourceChain(i,a){return this.service.calculateFeePercentOnSourceChain(i,a)}async calculateFeePercentOnDestinationChain(i,a,o){return this.service.calculateFeePercentOnDestinationChain(i,a,o)}async getAmountToBeReceivedAndGasFeeOptions(i,a,o,s){return this.service.getAmountToBeReceivedAndGasFeeOptions(i,a,o,s)}async getAmountToSendAndGasFeeOptions(i,a,o,s){return this.service.getAmountToSendAndGasFeeOptions(i,a,o,s)}async getAmountToBeReceived(i,a,o,s=1){return this.service.getAmountToBeReceived(i,a,o,s)}async getAmountToBeReceivedFromChain(i,a,o,s=1,d,A){return this.service.getAmountToBeReceivedFromChain(i,a,o,s,d,A)}getAmountToBeReceivedFromPools(i,a,o,s,d,A=1){switch(A){case 1:case 2:return this.service.getAmountToBeReceivedComputeWithPools(i,a,o,s,d);case 3:case 4:return this.service.getAmountToBeReceivedComputeCctp(i,a,o,A)}}async getAmountToSend(i,a,o,s=1){return this.service.getAmountToSend(i,a,o,s)}async getAmountToSendFromChain(i,a,o,s=1,d,A){return this.service.getAmountToSendFromChain(i,a,o,s,d,A)}getAmountToSendFromPools(i,a,o,s,d,A=1){switch(A){case 1:case 2:return this.service.getAmountToSendComputeWithPools(i,a,o,s,d);case 3:case 4:return this.service.getAmountToSendComputeCctp(i,a,o,A)}}async getGasFeeOptions(i,a,o){return this.service.getGasFeeOptions(i,a,o)}getAverageTransferTime(i,a,o){return this.service.getAverageTransferTime(i,a,o)}async getPoolInfoByToken(i){return this.service.getPoolInfoByToken(i)}async refreshPoolInfo(i){return this.service.refreshPoolInfo(i)}aprInPercents(i){return this.service.aprInPercents(i)}async getExtraGasMaxLimits(i,a,o=1){return this.service.getExtraGasMaxLimits(i,a,o)}async getVUsdFromAmount(i,a,o){return this.service.getVUsdFromAmount(i,a,o)}async getAmountFromVUsd(i,a){return this.service.getAmountFromVUsd(i,a)}async swapAndBridgeFeeCalculation(i,a,o){return this.service.swapAndBridgeFeeCalculation(i,a,o)}async swapAndBridgeFeeCalculationReverse(i,a,o){return this.service.swapAndBridgeFeeCalculationReverse(i,a,o)}async getSendAmountDetails(i,a,o,s){return this.service.getSendAmountDetails(i,a,o,s)}};export{Li as AddressStatus,lr as AllbridgeCoreSdk,Xn as AmountFormat,ht as AmountNotEnoughError,Yn as ArgumentInvalidDecimalsError,ce as CCTPDoesNotSupportedError,he as ChainSymbol,J as ChainType,vr as ErrorCode,Rn as ExtraGasMaxLimitExceededError,Ee as FeePaymentMethod,Ue as InsufficientPoolLiquidityError,Ke as InvalidAmountError,xt as InvalidGasFeePaymentOptionError,vn as InvalidMessengerOptionError,vt as InvalidTxError,re as JupiterError,Be as Messenger,X as MethodNotSupportedError,Bn as NodeRpcUrlNotInitializedError,le as OFTDoesNotSupportedError,I as SdkError,K as SdkRootError,Di as SolanaAutoTxFee,Qt as TimeoutError,fn as TxTooLargeError,Ot as VerifyTxError,Wn as YieldDoesNotSupportedError,dd as assertYieldIsSupported,vi as isYieldSupported,hn as mainnet,aA as nodeRpcUrlsDefault,iA as nodeUrlsDefault};
7
7
  //# sourceMappingURL=index.js.map