diff --git a/dev-docs/CHANGELOG.md b/dev-docs/CHANGELOG.md
index 8e2cfbf8ed..f675930a3c 100644
--- a/dev-docs/CHANGELOG.md
+++ b/dev-docs/CHANGELOG.md
@@ -13,6 +13,10 @@ The documentation changelog is kept separately: [CHANGELOG-DOCS](./CHANGELOG-DOC
- Reordered arguments of the `__tact_store_address_opt` function to optimize gas consumption: PR [#3333](https://github.com/tact-lang/tact/pull/3333)
+### Language features
+
+- Support `.send()` method from all message-like structures
+
## [1.6.13] - 2025-05-29
### Language features
@@ -23,6 +27,7 @@ The documentation changelog is kept separately: [CHANGELOG-DOCS](./CHANGELOG-DOC
- [Anton Trunov](https://github.com/anton-trunov)
- [Novus Nota](https://github.com/novusnota)
+- [skywardboundd](https://github.com/skywardboundd)
## [1.6.12] - 2025-05-27
diff --git a/docs/src/content/docs/book/send.mdx b/docs/src/content/docs/book/send.mdx
index f0ed2aaf79..9ca09a274c 100644
--- a/docs/src/content/docs/book/send.mdx
+++ b/docs/src/content/docs/book/send.mdx
@@ -256,6 +256,9 @@ Read more about all message-sending functions in the Reference:
* [`send(){:tact}`](/ref/core-send#send)
* [`message(){:tact}`](/ref/core-send#message)
* [`deploy(){:tact}`](/ref/core-send#deploy)
+* [`SendParameters.send(){:tact}`](/ref/core-send#sendparameters-send)
+* [`MessageParameters.send(){:tact}`](/ref/core-send#messageparameters-send)
+* [`DeployParameters.send(){:tact}`](/ref/core-send#deployparameters-send)
* [`emit(){:tact}`](/ref/core-send#emit)
* [`cashback(){:tact}`](/ref/core-send#cashback)
* [`self.notify(){:tact}`](/ref/core-base#self-notify)
diff --git a/docs/src/content/docs/ref/core-send.mdx b/docs/src/content/docs/ref/core-send.mdx
index a0d1399983..f0cb6c0ab3 100644
--- a/docs/src/content/docs/ref/core-send.mdx
+++ b/docs/src/content/docs/ref/core-send.mdx
@@ -42,6 +42,38 @@ send(SendParameters {
:::
+### SendParameters.send {#sendparameters-send}
+
+
+
+
+```tact
+extends fun send(self: SendParameters);
+```
+
+[Queues the message](/book/send#outbound-message-processing) to be sent using a [`SendParameters{:tact}`](/book/send) [struct][struct].
+
+Attempts to queue more than 255 messages throw an exception with [exit code 33](/book/exit-codes#33): `Action list is too long`.
+
+Usage example:
+
+```tact
+SendParameters {
+ to: sender(), // back to the sender,
+ value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin),
+ // and no message body
+}.send();
+```
+
+:::note[Useful links:]
+
+ [Sending messages in the Book](/book/send)\
+ [Message `mode` in the Book](/book/message-mode)\
+ [Single-contract communication in the Cookbook](/cookbook/single-communication)\
+ [`nativeReserve(){:tact}`](/ref/core-contextstate#nativereserve)
+
+:::
+
### message
@@ -75,6 +107,39 @@ message(MessageParameters {
:::
+### MessageParameters.send {#messageparameters-send}
+
+
+
+
+```tact
+extends fun send(self: MessageParameters);
+```
+
+[Queues the message](/book/send#outbound-message-processing) to be sent using the `MessageParameters{:tact}` [struct][struct]. Allows for cheaper non-deployment regular messages compared to the [`send(){:tact}`](#send) function.
+
+The `MessageParameters{:tact}` [struct][struct] is similar to the [`SendParameters{:tact}`](/book/send) [struct][struct], but without the `code` and `data` fields.
+
+Attempts to queue more than 255 messages throw an exception with an [exit code 33](/book/exit-codes#33): `Action list is too long`.
+
+Usage example:
+
+```tact
+MessageParameters {
+ to: sender(), // back to the sender,
+ value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin),
+ // and no message body
+}.send();
+```
+
+:::note[Useful links:]
+
+ [Sending messages in the Book](/book/send)\
+ [Message `mode` in the Book](/book/message-mode)\
+ [`nativeReserve(){:tact}`](/ref/core-contextstate#nativereserve)
+
+:::
+
### deploy
@@ -117,6 +182,48 @@ deploy(DeployParameters {
:::
+### DeployParameters.send {#deployparameters-send}
+
+
+
+
+```tact
+extends fun send(self: DeployParameters);
+```
+
+[Queues](/book/send#outbound-message-processing) the [contract deployment message](/book/deploy) to be sent using the `DeployParameters{:tact}` [struct][struct]. Allows for cheaper on-chain deployments compared to the [`send(){:tact}`](#send) function.
+
+The `DeployParameters{:tact}` [struct][struct] consists of the following fields:
+
+Field | Type | Description
+:------- | :---------------------------- | :----------
+`mode` | [`Int{:tact}`][int] | An 8-bit value that configures how to send a message, defaults to $0$. See: [Message `mode`](/book/message-mode).
+`body` | [`Cell?{:tact}`][cell] | [Optional][opt] message body as a [`Cell{:tact}`][cell].
+`value` | [`Int{:tact}`][int] | The amount of [nanoToncoins][nano] you want to send with the message. This value is used to cover [forward fees][fwdfee] unless the optional flag [`SendPayFwdFeesSeparately{:tact}`](/book/message-mode#optional-flags) is used.
+`bounce` | [`Bool{:tact}`][p] | When set to `true` (default), the message bounces back to the sender if the recipient contract doesn't exist or isn't able to process the message.
+`init` | [`StateInit{:tact}`][initpkg] | [Initial package][initpkg] of the contract (initial code and initial data). See: [`initOf{:tact}`][initpkg].
+
+Attempts to queue more than 255 messages throw an exception with an [exit code 33](/book/exit-codes#33): `Action list is too long`.
+
+Usage example:
+
+```tact
+DeployParameters {
+ init: initOf SomeContract(), // with initial code and data of SomeContract
+ // and no additional message body
+ mode: SendIgnoreErrors, // skip the message in case of errors
+ value: ton("1"), // send 1 Toncoin (1_000_000_000 nanoToncoin)
+}.send();
+```
+
+:::note[Useful links:]
+
+ [Sending messages in the Book](/book/send)\
+ [Message `mode` in the Book](/book/message-mode)\
+ [`nativeReserve(){:tact}`](/ref/core-contextstate#nativereserve)
+
+:::
+
### cashback
diff --git a/src/benchmarks/escrow/tact/escrow.tact b/src/benchmarks/escrow/tact/escrow.tact
index 29b35b8da4..e94c972425 100644
--- a/src/benchmarks/escrow/tact/escrow.tact
+++ b/src/benchmarks/escrow/tact/escrow.tact
@@ -56,7 +56,7 @@ contract Escrow(
self.assetAddress!!,
self.jettonWalletCode!!,
);
- message(MessageParameters {
+ MessageParameters {
to: escrowJettonWalletAddress,
value: self.JETTON_TRANSFER_GAS,
body: JettonTransfer {
@@ -69,7 +69,7 @@ contract Escrow(
customPayload: null,
}.toCell(),
mode,
- });
+ }.send();
}
receive(_: Funding) {
@@ -122,16 +122,16 @@ contract Escrow(
if (self.assetAddress == null) {
throwUnless(404, ctx.value > (2 * self.TON_TRANSFER_GAS));
- message(MessageParameters {
+ MessageParameters {
to: self.sellerAddress,
value: self.dealAmount - royaltyAmount,
mode: SendPayFwdFeesSeparately,
- });
- message(MessageParameters {
+ }.send();
+ MessageParameters {
to: self.guarantorAddress,
value: royaltyAmount,
mode: SendRemainingBalance | SendDestroyIfZero, // send all remaining and destroy escrow
- });
+ }.send();
} else {
throwUnless(404, ctx.value > (2 * self.JETTON_TRANSFER_GAS));
self.sendJettons(self.sellerAddress, self.dealAmount - royaltyAmount, SendPayFwdFeesSeparately);
@@ -147,11 +147,11 @@ contract Escrow(
// it's up to business logic to decide if guarantor gets royalty in case of cancel
// in this implementation we don't pay royalty in case of cancel
if (self.assetAddress == null) {
- message(MessageParameters {
+ MessageParameters {
to: self.buyerAddress!!,
value: self.dealAmount,
mode: SendRemainingBalance | SendDestroyIfZero, // send all remaining and destroy escrow
- });
+ }.send();
} else {
self.sendJettons(self.buyerAddress!!, self.dealAmount, SendRemainingBalance | SendDestroyIfZero);
}
@@ -159,7 +159,7 @@ contract Escrow(
// on-chain data access, could be useful to guarantor contract
receive(_: ProvideEscrowData) {
- message(MessageParameters {
+ MessageParameters {
bounce: false,
value: 0,
to: sender(),
@@ -177,7 +177,7 @@ contract Escrow(
},
}.toCell(),
mode: SendRemainingValue,
- });
+ }.send();
}
get fun calculateRoyaltyAmount(): Int {
diff --git a/src/benchmarks/jetton/tact/minter.tact b/src/benchmarks/jetton/tact/minter.tact
index 04be0b3813..aac7c7c666 100644
--- a/src/benchmarks/jetton/tact/minter.tact
+++ b/src/benchmarks/jetton/tact/minter.tact
@@ -28,13 +28,13 @@ contract JettonMinter(
self.totalSupply -= msg.amount;
if (msg.responseDestination.isNotNone()) {
- message(MessageParameters {
+ MessageParameters {
to: msg.responseDestination,
body: JettonExcesses { queryId: msg.queryId }.toCell(),
value: 0,
bounce: false,
mode: SendRemainingValue | SendIgnoreErrors, // ignore errors, because supply has already been updated
- });
+ }.send();
}
}
@@ -50,12 +50,12 @@ contract JettonMinter(
? contractBasechainAddress(initOf JettonWallet(msg.ownerAddress, myAddress(), 0))
: emptyBasechainAddress();
- message(MessageParameters {
+ MessageParameters {
body: makeTakeWalletAddressMsg(targetJettonWallet, msg),
to: sender(),
value: 0,
mode: SendRemainingValue,
- });
+ }.send();
}
receive(msg: JettonUpdateContent) {
@@ -67,13 +67,13 @@ contract JettonMinter(
throwUnless(73, sender() == self.owner);
self.totalSupply += msg.mintMessage.amount;
- deploy(DeployParameters {
+ DeployParameters {
value: 0,
bounce: true,
mode: SendRemainingValue,
body: msg.mintMessage.toCell(),
init: getJettonWalletInit(msg.receiver),
- });
+ }.send();
}
receive(msg: ChangeOwner) {
diff --git a/src/benchmarks/jetton/tact/wallet.tact b/src/benchmarks/jetton/tact/wallet.tact
index 21dd906e8d..1fe4356fd2 100644
--- a/src/benchmarks/jetton/tact/wallet.tact
+++ b/src/benchmarks/jetton/tact/wallet.tact
@@ -27,7 +27,7 @@ contract JettonWallet(
fwdCount * ctx.readForwardFee() +
(2 * self.gasConsumption + self.minTonsForStorage));
- deploy(DeployParameters {
+ DeployParameters {
value: 0,
mode: SendRemainingValue,
bounce: true,
@@ -40,7 +40,7 @@ contract JettonWallet(
forwardPayload: msg.forwardPayload,
}.toCell(),
init: initOf JettonWallet(msg.destination, self.master, 0),
- });
+ }.send();
}
receive(msg: JettonTransferInternal) {
@@ -61,7 +61,7 @@ contract JettonWallet(
if (msg.forwardTonAmount > 0) {
let fwdFee: Int = ctx.readForwardFee();
msgValue -= msg.forwardTonAmount + fwdFee;
- message(MessageParameters {
+ MessageParameters {
to: self.owner,
value: msg.forwardTonAmount,
mode: SendPayFwdFeesSeparately,
@@ -72,18 +72,18 @@ contract JettonWallet(
sender: msg.sender,
forwardPayload: msg.forwardPayload,
}.toCell(),
- });
+ }.send();
}
// 0xd53276db -- Cashback to the original Sender
if (msg.responseDestination != null && msgValue > 0) {
- message(MessageParameters {
+ MessageParameters {
to: msg.responseDestination!!,
value: msgValue,
mode: SendIgnoreErrors,
bounce: false,
body: JettonExcesses { queryId: msg.queryId }.toCell(),
- });
+ }.send();
}
}
@@ -97,7 +97,7 @@ contract JettonWallet(
let fwdFee: Int = ctx.readForwardFee();
throwUnless(707, ctx.value > (fwdFee + 2 * self.gasConsumption));
- message(MessageParameters {
+ MessageParameters {
to: self.master,
value: 0,
mode: SendRemainingValue,
@@ -108,7 +108,7 @@ contract JettonWallet(
sender: self.owner,
responseDestination: msg.responseDestination,
}.toCell(),
- });
+ }.send();
}
receive(_: Slice) { throw(0xffff) }
diff --git a/src/benchmarks/nft/tact/collection.tact b/src/benchmarks/nft/tact/collection.tact
index 57ef972d79..dba356277b 100644
--- a/src/benchmarks/nft/tact/collection.tact
+++ b/src/benchmarks/nft/tact/collection.tact
@@ -37,7 +37,7 @@ contract NFTCollection {
}
receive(msg: GetRoyaltyParams) {
- message(MessageParameters {
+ MessageParameters {
bounce: false,
to: sender(),
value: 0,
@@ -46,7 +46,7 @@ contract NFTCollection {
params: self.royaltyParams,
}.toCell(),
mode: SendRemainingValue,
- });
+ }.send();
}
receive(msg: BatchDeploy) {
@@ -112,12 +112,12 @@ contract NFTCollection {
inline fun deployNFTItem(commonCode: Cell, itemIndex: Int, amount: Int, initNFTBody: Cell, commonData: Builder) {
let data: Cell = commonData.storeUint(itemIndex, 64).endCell(); // IndexSizeBits = 64
- deploy(DeployParameters {
+ DeployParameters {
value: amount,
body: initNFTBody,
init: StateInit { code: commonCode, data },
mode: SendPayFwdFeesSeparately,
- });
+ }.send();
}
struct DictGet {
diff --git a/src/benchmarks/notcoin/gas.json b/src/benchmarks/notcoin/gas.json
index a49f1a6bd3..1aece8dcac 100644
--- a/src/benchmarks/notcoin/gas.json
+++ b/src/benchmarks/notcoin/gas.json
@@ -116,6 +116,15 @@
"burn": "12027",
"discovery": "5818"
}
+ },
+ {
+ "label": "1.6.13 with new send",
+ "pr": "https://github.com/tact-lang/tact/pull/3056",
+ "gas": {
+ "transfer": "15635",
+ "burn": "12027",
+ "discovery": "5698"
+ }
}
]
}
diff --git a/src/benchmarks/notcoin/size.json b/src/benchmarks/notcoin/size.json
index edc87989c8..21c82c8b1e 100644
--- a/src/benchmarks/notcoin/size.json
+++ b/src/benchmarks/notcoin/size.json
@@ -139,6 +139,16 @@
"wallet cells": "13",
"wallet bits": "8004"
}
+ },
+ {
+ "label": "1.6.13 with new send",
+ "pr": "https://github.com/tact-lang/tact/pull/3056",
+ "size": {
+ "minter cells": "28",
+ "minter bits": "15948",
+ "wallet cells": "13",
+ "wallet bits": "8004"
+ }
}
]
}
diff --git a/src/benchmarks/notcoin/tact/minter.tact b/src/benchmarks/notcoin/tact/minter.tact
index 1ed15c825e..838ec8f12b 100644
--- a/src/benchmarks/notcoin/tact/minter.tact
+++ b/src/benchmarks/notcoin/tact/minter.tact
@@ -26,13 +26,13 @@ contract JettonMinterNotcoin(
self.totalSupply -= msg.amount;
if (msg.responseDestination.isNotNone()) {
- message(MessageParameters {
+ MessageParameters {
to: msg.responseDestination,
body: JettonExcesses { queryId: msg.queryId }.toCell(),
value: 0,
bounce: false,
mode: SendRemainingValue | SendIgnoreErrors, // ignore errors, because supply has already been updated
- });
+ }.send();
}
}
@@ -43,12 +43,12 @@ contract JettonMinterNotcoin(
? contractBasechainAddress(initOf JettonWalletNotcoin(0, msg.ownerAddress, myAddress()))
: emptyBasechainAddress();
- message(MessageParameters {
+ MessageParameters {
body: makeTakeWalletAddressMsg(targetJettonWallet, msg),
to: sender(),
value: 0,
mode: SendRemainingValue | SendBounceIfActionFail,
- });
+ }.send();
}
receive(msg: Mint) {
@@ -59,13 +59,13 @@ contract JettonMinterNotcoin(
forceBasechain(msg.receiver);
checkAmountIsEnoughToTransfer(ctx.value, msg.mintMessage.forwardTonAmount, ctx.readForwardFee());
- deploy(DeployParameters {
+ DeployParameters {
value: 0,
bounce: true,
mode: SendRemainingValue,
body: msg.mintMessage.toCell(),
init: getJettonWalletInit(msg.receiver),
- });
+ }.send();
}
receive(msg: JettonUpdateContent) {
diff --git a/src/benchmarks/notcoin/tact/wallet.tact b/src/benchmarks/notcoin/tact/wallet.tact
index 473ce6d380..77a6ee32ea 100644
--- a/src/benchmarks/notcoin/tact/wallet.tact
+++ b/src/benchmarks/notcoin/tact/wallet.tact
@@ -69,7 +69,7 @@ contract JettonWalletNotcoin(
let ctx = context();
checkAmountIsEnoughToTransfer(ctx.value, msg.forwardTonAmount, ctx.readForwardFee());
- deploy(DeployParameters {
+ DeployParameters {
value: 0,
mode: SendRemainingValue,
bounce: true,
@@ -82,7 +82,7 @@ contract JettonWalletNotcoin(
forwardPayload: msg.forwardPayload,
}.toCell(),
init: initOf JettonWalletNotcoin(0, msg.destination, self.master),
- });
+ }.send();
}
receive(msg: JettonTransferInternal) {
@@ -95,7 +95,7 @@ contract JettonWalletNotcoin(
}
if (msg.forwardTonAmount > 0) {
- message(MessageParameters {
+ MessageParameters {
to: self.owner,
value: msg.forwardTonAmount,
mode: SendPayFwdFeesSeparately,
@@ -106,7 +106,7 @@ contract JettonWalletNotcoin(
sender: msg.sender,
forwardPayload: msg.forwardPayload,
}.toCell(),
- });
+ }.send();
}
// 0xd53276db -- Cashback to the original Sender
@@ -117,13 +117,13 @@ contract JettonWalletNotcoin(
2,
);
- message(MessageParameters {
+ MessageParameters {
to: msg.responseDestination!!,
value: 0,
mode: SendRemainingBalance | SendIgnoreErrors,
bounce: false,
body: JettonExcesses { queryId: msg.queryId }.toCell(),
- });
+ }.send();
}
}
@@ -135,7 +135,7 @@ contract JettonWalletNotcoin(
checkAmountIsEnoughToBurn(context().value);
- message(MessageParameters {
+ MessageParameters {
to: self.master,
value: 0,
mode: SendRemainingValue,
@@ -146,7 +146,7 @@ contract JettonWalletNotcoin(
sender: self.owner,
responseDestination: msg.responseDestination,
}.toCell(),
- });
+ }.send();
}
receive(_: Slice) { throw(0xffff) }
diff --git a/src/benchmarks/sbt/tact/item.tact b/src/benchmarks/sbt/tact/item.tact
index 8190ea055c..1ad2570e18 100644
--- a/src/benchmarks/sbt/tact/item.tact
+++ b/src/benchmarks/sbt/tact/item.tact
@@ -50,13 +50,13 @@ contract SBTItem(
content,
};
- message(MessageParameters {
+ MessageParameters {
to: msg.destination,
value: 0,
mode: SendRemainingValue,
bounce: true,
body: msgBody.toCell(),
- });
+ }.send();
}
receive(msg: ProveOwnership) {
@@ -74,17 +74,17 @@ contract SBTItem(
content,
};
- message(MessageParameters {
+ MessageParameters {
to: msg.destination,
value: 0,
mode: SendRemainingValue,
bounce: true,
body: msgBody.toCell(),
- });
+ }.send();
}
bounced(msg: bounced) {
- message(MessageParameters {
+ MessageParameters {
to: self.owner!!,
value: 0,
mode: SendRemainingValue,
@@ -92,7 +92,7 @@ contract SBTItem(
body: ProveOwnershipBounced {
queryId: msg.queryId,
}.toCell(),
- });
+ }.send();
}
receive(msg: GetStaticData) {
@@ -104,13 +104,13 @@ contract SBTItem(
collectionAddress: self.collectionAddress,
};
- message(MessageParameters {
+ MessageParameters {
bounce: false,
to: sender(),
value: 0,
body: msgBody.toCell(),
mode: SendRemainingValue,
- });
+ }.send();
}
receive(msg: TakeExcess) {
@@ -121,13 +121,13 @@ contract SBTItem(
let msgBody = ExcessOut { queryId: msg.queryId };
- message(MessageParameters {
+ MessageParameters {
bounce: false,
to: sender(),
value: 0,
body: msgBody.toCell(),
mode: SendRemainingBalance,
- });
+ }.send();
}
receive(msg: Destroy) {
@@ -136,13 +136,13 @@ contract SBTItem(
let msgBody = ExcessOut { queryId: msg.queryId };
- message(MessageParameters {
+ MessageParameters {
bounce: false,
to: sender(),
value: 0,
body: msgBody.toCell(),
mode: SendRemainingBalance,
- });
+ }.send();
self.owner = null;
self.authorityAddress = null;
diff --git a/src/stdlib/stdlib.ts b/src/stdlib/stdlib.ts
index 57e64380c4..476cc7004c 100644
--- a/src/stdlib/stdlib.ts
+++ b/src/stdlib/stdlib.ts
@@ -379,62 +379,62 @@ files["std/internal/base.tact"] =
"PSBzZW5kZXIoKTsKICAgICAgICBsZXQgYm91bmNlOiBCb29sID0gdHJ1ZTsKICAgICAgICBpZiAoc2VsZi5zdG9yYWdlUmVzZXJ2ZSA+IDApIHsgLy8gT3B0aW1pemVk" +
"IGluIGNvbXBpbGUtdGltZQogICAgICAgICAgICBsZXQgYmFsYW5jZTogSW50ID0gbXlCYWxhbmNlKCk7CiAgICAgICAgICAgIGxldCBiYWxhbmNlQmVmb3JlTWVzc2Fn" +
"ZTogSW50ID0gYmFsYW5jZSAtIGNvbnRleHQoKS52YWx1ZTsKICAgICAgICAgICAgaWYgKGJhbGFuY2VCZWZvcmVNZXNzYWdlIDwgc2VsZi5zdG9yYWdlUmVzZXJ2ZSkg" +
- "ewogICAgICAgICAgICAgICAgbmF0aXZlUmVzZXJ2ZShzZWxmLnN0b3JhZ2VSZXNlcnZlLCBSZXNlcnZlRXhhY3QpOwogICAgICAgICAgICAgICAgbWVzc2FnZShNZXNz" +
- "YWdlUGFyYW1ldGVycyB7CiAgICAgICAgICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICAgICAgICAgIHRvLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAw" +
- "LAogICAgICAgICAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdCYWxhbmNlIHwgU2VuZElnbm9yZUVycm9ycywKICAgICAgICAgICAgICAgICAgICBib2R5LAog" +
- "ICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEp1c3Qgc2VuZCB3aXRoIHJl" +
- "bWFpbmluZyBiYWxhbmNlCiAgICAgICAgbWVzc2FnZShNZXNzYWdlUGFyYW1ldGVycyB7CiAgICAgICAgICAgIGJvdW5jZSwKICAgICAgICAgICAgdG8sCiAgICAgICAg" +
- "ICAgIHZhbHVlOiAwLAogICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nVmFsdWUgfCBTZW5kSWdub3JlRXJyb3JzLAogICAgICAgICAgICBib2R5LAogICAgICAg" +
- "IH0pOwogICAgfQoKICAgIC8vLyBTZW5kcyBhIG5vbi1ib3VuY2VhYmxlIG1lc3NhZ2UgYmFjayB0byB0aGUgc2VuZGVyIG9mIHRoZSBjdXJyZW50IG1lc3NhZ2UuCiAg" +
- "ICAvLy8gQSBzaW1pbGFyIGJ1dCBtb3JlIGdhcy1lZmZpY2llbnQgdmVyc2lvbiBvZiBjYWxsaW5nIHRoZSBgc2VsZi5mb3J3YXJkKClgCiAgICAvLy8gZnVuY3Rpb24g" +
- "d2l0aCB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKICAgIC8vLwogICAgLy8vIGBgYHRhY3QKICAgIC8vLyBzZWxmLmZvcndhcmQoc2VuZGVyKCksIGJvZHksIGZhbHNl" +
- "LCBudWxsKTsKICAgIC8vLyAvLyAgICAgICAgICAg4oaRICAgICAgICAg4oaRICAgICDihpEgICAgIOKGkQogICAgLy8vIC8vICAgICAgICAgICB8ICAgICAgICAgfCAg" +
- "ICAgfCAgICAgaW5pdDogU3RhdGVJbml0PwogICAgLy8vIC8vICAgICAgICAgICB8ICAgICAgICAgfCAgICAgYm91bmNlOiBCb29sCiAgICAvLy8gLy8gICAgICAgICAg" +
- "IHwgICAgICAgICBib2R5OiBDZWxsPwogICAgLy8vIC8vICAgICAgICAgICB0bzogQWRkcmVzcwogICAgLy8vIGBgYAogICAgLy8vCiAgICAvLy8gU2VlOiBodHRwczov" +
- "L2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1iYXNlI3NlbGYtZm9yd2FyZAogICAgLy8vCiAgICB2aXJ0dWFsIGlubGluZSBmdW4gbm90aWZ5KGJvZHk6IENlbGw/" +
- "KSB7CiAgICAgICAgbGV0IHRvOiBBZGRyZXNzID0gc2VuZGVyKCk7CiAgICAgICAgbGV0IGJvdW5jZTogQm9vbCA9IGZhbHNlOwogICAgICAgIGlmIChzZWxmLnN0b3Jh" +
- "Z2VSZXNlcnZlID4gMCkgeyAvLyBPcHRpbWl6ZWQgaW4gY29tcGlsZS10aW1lCiAgICAgICAgICAgIGxldCBiYWxhbmNlOiBJbnQgPSBteUJhbGFuY2UoKTsKICAgICAg" +
- "ICAgICAgbGV0IGJhbGFuY2VCZWZvcmVNZXNzYWdlOiBJbnQgPSBiYWxhbmNlIC0gY29udGV4dCgpLnZhbHVlOwogICAgICAgICAgICBpZiAoYmFsYW5jZUJlZm9yZU1l" +
- "c3NhZ2UgPCBzZWxmLnN0b3JhZ2VSZXNlcnZlKSB7CiAgICAgICAgICAgICAgICBuYXRpdmVSZXNlcnZlKHNlbGYuc3RvcmFnZVJlc2VydmUsIFJlc2VydmVFeGFjdCk7" +
- "CiAgICAgICAgICAgICAgICBtZXNzYWdlKE1lc3NhZ2VQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgICAgICAgICBib3VuY2UsCiAgICAgICAgICAgICAgICAgICAgdG8s" +
- "CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UgfCBTZW5kSWdub3JlRXJyb3Jz" +
- "LAogICAgICAgICAgICAgICAgICAgIGJvZHksCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0K" +
- "CiAgICAgICAgLy8gSnVzdCBzZW5kIHdpdGggcmVtYWluaW5nIGJhbGFuY2UKICAgICAgICBtZXNzYWdlKE1lc3NhZ2VQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgYm91" +
- "bmNlLAogICAgICAgICAgICB0bywKICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJv" +
- "cnMsCiAgICAgICAgICAgIGJvZHksCiAgICAgICAgfSk7CiAgICB9CgogICAgLy8vIFF1ZXVlcyB0aGUgbWVzc2FnZSAoYm91bmNlYWJsZSBvciBub24tYm91bmNlYWJs" +
- "ZSkgdG8gYmUgc2VudCB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYHRvYC4KICAgIC8vLyBPcHRpb25hbGx5LCB5b3UgbWF5IHByb3ZpZGUgYSBgYm9keWAgb2YgdGhl" +
- "IG1lc3NhZ2UgYW5kIHRoZSBgaW5pdGAgcGFja2FnZSB3aXRoIGBpbml0T2ZgLgogICAgLy8vCiAgICAvLy8gV2hlbiBgc2VsZi5zdG9yYWdlUmVzZXJ2ZWAgY29uc3Rh" +
- "bnQgaXMgb3ZlcndyaXR0ZW4gdG8gYmUgZ3JlYXRlciB0aGFuIHplcm8sIGJlZm9yZSBzZW5kaW5nIGEKICAgIC8vLyBtZXNzYWdlIGl0IGFsc28gdHJpZXMgdG8gcmVz" +
- "ZXJ2ZSB0aGUgYHNlbGYuc3RvcmFnZVJlc2VydmVgIGFtb3VudCBvZiBuYW5vVG9uY29pbnMgZnJvbSB0aGUKICAgIC8vLyByZW1haW5pbmcgYmFsYW5jZSBiZWZvcmUg" +
- "bWFraW5nIHRoZSBzZW5kIGluIHRoZSBgU2VuZFJlbWFpbmluZ0JhbGFuY2VgICgxMjgpIG1vZGUuCiAgICAvLy8KICAgIC8vLyBJbiBjYXNlIHJlc2VydmF0aW9uIGF0" +
- "dGVtcHQgZmFpbHMgYW5kIGluIHRoZSBkZWZhdWx0IGNhc2Ugd2l0aG91dCB0aGUgYXR0ZW1wdCwgdGhlIG1lc3NhZ2UKICAgIC8vLyBpcyBzZW50IHdpdGggdGhlIGBT" +
- "ZW5kUmVtYWluaW5nVmFsdWVgICg2NCkgbW9kZSBpbnN0ZWFkLgogICAgLy8vCiAgICAvLy8gPiBOb3RlIHRoYXQgYHNlbGYuZm9yd2FyZCgpYCBuZXZlciBzZW5kcyBh" +
- "ZGRpdGlvbmFsIG5hbm9Ub25jb2lucyBvbiB0b3Agb2Ygd2hhdOKAmXMgYXZhaWxhYmxlIG9uIHRoZSBiYWxhbmNlLgogICAgLy8vID4gVG8gYmUgYWJsZSB0byBzZW5k" +
- "IG1vcmUgbmFub1RvbmNvaW5zIHdpdGggYSBzaW5nbGUgbWVzc2FnZSwgdXNlIHRoZSB0aGUgYHNlbmRgIGZ1bmN0aW9uLgogICAgLy8vCiAgICAvLy8gU2VlOiBodHRw" +
- "czovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1iYXNlI3NlbGYtZm9yd2FyZAogICAgLy8vCiAgICB2aXJ0dWFsIGZ1biBmb3J3YXJkKHRvOiBBZGRyZXNzLCBi" +
- "b2R5OiBDZWxsPywgYm91bmNlOiBCb29sLCBpbml0OiBTdGF0ZUluaXQ/KSB7CiAgICAgICAgaWYgKGluaXQgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBMb2NrIHN0" +
- "b3JhZ2UgaWYgbmVlZGVkCiAgICAgICAgICAgIGlmIChzZWxmLnN0b3JhZ2VSZXNlcnZlID4gMCkgeyAvLyBPcHRpbWl6ZWQgaW4gY29tcGlsZS10aW1lCiAgICAgICAg" +
- "ICAgICAgICBsZXQgY3R4OiBDb250ZXh0ID0gY29udGV4dCgpOwogICAgICAgICAgICAgICAgbGV0IGJhbGFuY2U6IEludCA9IG15QmFsYW5jZSgpOwogICAgICAgICAg" +
- "ICAgICAgbGV0IGJhbGFuY2VCZWZvcmVNZXNzYWdlOiBJbnQgPSBiYWxhbmNlIC0gY3R4LnZhbHVlOwogICAgICAgICAgICAgICAgaWYgKGJhbGFuY2VCZWZvcmVNZXNz" +
- "YWdlIDwgc2VsZi5zdG9yYWdlUmVzZXJ2ZSkgewogICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlc2VydmUoc2VsZi5zdG9yYWdlUmVzZXJ2ZSwgUmVzZXJ2ZUV4YWN0" +
- "KTsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKE1lc3NhZ2VQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICAg" +
- "ICAgICAgICAgICB0bywKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdCYWxh" +
- "bmNlIHwgU2VuZElnbm9yZUVycm9ycywKICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAg" +
- "ICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEp1c3Qgc2VuZCB3aXRoIHJlbWFpbmluZyBiYWxhbmNlCiAgICAg" +
- "ICAgICAgIG1lc3NhZ2UoTWVzc2FnZVBhcmFtZXRlcnMgewogICAgICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICAgICAgdG8sCiAgICAgICAgICAgICAgICB2" +
- "YWx1ZTogMCwKICAgICAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgICAgICBib2R5LAogICAg" +
- "ICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gTG9jayBzdG9yYWdlIGlmIG5lZWRlZAogICAgICAgIGlmIChzZWxmLnN0" +
- "b3JhZ2VSZXNlcnZlID4gMCkgeyAvLyBPcHRpbWl6ZWQgaW4gY29tcGlsZS10aW1lCiAgICAgICAgICAgIGxldCBjdHg6IENvbnRleHQgPSBjb250ZXh0KCk7CiAgICAg" +
- "ICAgICAgIGxldCBiYWxhbmNlOiBJbnQgPSBteUJhbGFuY2UoKTsKICAgICAgICAgICAgbGV0IGJhbGFuY2VCZWZvcmVNZXNzYWdlOiBJbnQgPSBiYWxhbmNlIC0gY3R4" +
- "LnZhbHVlOwogICAgICAgICAgICBpZiAoYmFsYW5jZUJlZm9yZU1lc3NhZ2UgPCBzZWxmLnN0b3JhZ2VSZXNlcnZlKSB7CiAgICAgICAgICAgICAgICBuYXRpdmVSZXNl" +
- "cnZlKHNlbGYuc3RvcmFnZVJlc2VydmUsIFJlc2VydmVFeGFjdCk7CiAgICAgICAgICAgICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgICAgICAg" +
- "ICB0bywKICAgICAgICAgICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nQmFsYW5jZSB8IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgYm9k" +
- "eSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAgICAgICAgICAgICBib3VuY2UsCiAgICAgICAgICAgICAgICAgICAgY29kZTogaW5pdCEhLmNv" +
- "ZGUsCiAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5pdCEhLmRhdGEsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAg" +
- "ICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSnVzdCBzZW5kIHdpdGggcmVtYWluaW5nIGJhbGFuY2UKICAgICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzIHsKICAgICAg" +
- "ICAgICAgYm91bmNlLAogICAgICAgICAgICB0bywKICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJ" +
- "Z25vcmVFcnJvcnMsCiAgICAgICAgICAgIGJvZHksCiAgICAgICAgICAgIGNvZGU6IGluaXQhIS5jb2RlLAogICAgICAgICAgICBkYXRhOiBpbml0ISEuZGF0YSwKICAg" +
- "ICAgICB9KTsKICAgIH0KfQo=";
+ "ewogICAgICAgICAgICAgICAgbmF0aXZlUmVzZXJ2ZShzZWxmLnN0b3JhZ2VSZXNlcnZlLCBSZXNlcnZlRXhhY3QpOwogICAgICAgICAgICAgICAgTWVzc2FnZVBhcmFt" +
+ "ZXRlcnMgewogICAgICAgICAgICAgICAgICAgIGJvdW5jZSwKICAgICAgICAgICAgICAgICAgICB0bywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMCwKICAgICAg" +
+ "ICAgICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nQmFsYW5jZSB8IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgYm9keSwKICAgICAgICAg" +
+ "ICAgICAgIH0uc2VuZCgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBKdXN0IHNlbmQgd2l0aCByZW1h" +
+ "aW5pbmcgYmFsYW5jZQogICAgICAgIE1lc3NhZ2VQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICB0bywKICAgICAgICAgICAgdmFsdWU6" +
+ "IDAsCiAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgIGJvZHksCiAgICAgICAgfS5zZW5kKCk7" +
+ "CiAgICB9CgogICAgLy8vIFNlbmRzIGEgbm9uLWJvdW5jZWFibGUgbWVzc2FnZSBiYWNrIHRvIHRoZSBzZW5kZXIgb2YgdGhlIGN1cnJlbnQgbWVzc2FnZS4KICAgIC8v" +
+ "LyBBIHNpbWlsYXIgYnV0IG1vcmUgZ2FzLWVmZmljaWVudCB2ZXJzaW9uIG9mIGNhbGxpbmcgdGhlIGBzZWxmLmZvcndhcmQoKWAKICAgIC8vLyBmdW5jdGlvbiB3aXRo" +
+ "IHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgogICAgLy8vCiAgICAvLy8gYGBgdGFjdAogICAgLy8vIHNlbGYuZm9yd2FyZChzZW5kZXIoKSwgYm9keSwgZmFsc2UsIG51" +
+ "bGwpOwogICAgLy8vIC8vICAgICAgICAgICDihpEgICAgICAgICDihpEgICAgIOKGkSAgICAg4oaRCiAgICAvLy8gLy8gICAgICAgICAgIHwgICAgICAgICB8ICAgICB8" +
+ "ICAgICBpbml0OiBTdGF0ZUluaXQ/CiAgICAvLy8gLy8gICAgICAgICAgIHwgICAgICAgICB8ICAgICBib3VuY2U6IEJvb2wKICAgIC8vLyAvLyAgICAgICAgICAgfCAg" +
+ "ICAgICAgIGJvZHk6IENlbGw/CiAgICAvLy8gLy8gICAgICAgICAgIHRvOiBBZGRyZXNzCiAgICAvLy8gYGBgCiAgICAvLy8KICAgIC8vLyBTZWU6IGh0dHBzOi8vZG9j" +
+ "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWJhc2Ujc2VsZi1mb3J3YXJkCiAgICAvLy8KICAgIHZpcnR1YWwgaW5saW5lIGZ1biBub3RpZnkoYm9keTogQ2VsbD8pIHsK" +
+ "ICAgICAgICBsZXQgdG86IEFkZHJlc3MgPSBzZW5kZXIoKTsKICAgICAgICBsZXQgYm91bmNlOiBCb29sID0gZmFsc2U7CiAgICAgICAgaWYgKHNlbGYuc3RvcmFnZVJl" +
+ "c2VydmUgPiAwKSB7IC8vIE9wdGltaXplZCBpbiBjb21waWxlLXRpbWUKICAgICAgICAgICAgbGV0IGJhbGFuY2U6IEludCA9IG15QmFsYW5jZSgpOwogICAgICAgICAg" +
+ "ICBsZXQgYmFsYW5jZUJlZm9yZU1lc3NhZ2U6IEludCA9IGJhbGFuY2UgLSBjb250ZXh0KCkudmFsdWU7CiAgICAgICAgICAgIGlmIChiYWxhbmNlQmVmb3JlTWVzc2Fn" +
+ "ZSA8IHNlbGYuc3RvcmFnZVJlc2VydmUpIHsKICAgICAgICAgICAgICAgIG5hdGl2ZVJlc2VydmUoc2VsZi5zdG9yYWdlUmVzZXJ2ZSwgUmVzZXJ2ZUV4YWN0KTsKICAg" +
+ "ICAgICAgICAgICAgIE1lc3NhZ2VQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgICAgICAgICBib3VuY2UsCiAgICAgICAgICAgICAgICAgICAgdG8sCiAgICAgICAgICAg" +
+ "ICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UgfCBTZW5kSWdub3JlRXJyb3JzLAogICAgICAgICAg" +
+ "ICAgICAgICAgIGJvZHksCiAgICAgICAgICAgICAgICB9LnNlbmQoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAg" +
+ "ICAgLy8gSnVzdCBzZW5kIHdpdGggcmVtYWluaW5nIGJhbGFuY2UKICAgICAgICBNZXNzYWdlUGFyYW1ldGVycyB7CiAgICAgICAgICAgIGJvdW5jZSwKICAgICAgICAg" +
+ "ICAgdG8sCiAgICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nVmFsdWUgfCBTZW5kSWdub3JlRXJyb3JzLAogICAgICAgICAg" +
+ "ICBib2R5LAogICAgICAgIH0uc2VuZCgpOwogICAgfQoKICAgIC8vLyBRdWV1ZXMgdGhlIG1lc3NhZ2UgKGJvdW5jZWFibGUgb3Igbm9uLWJvdW5jZWFibGUpIHRvIGJl" +
+ "IHNlbnQgdG8gdGhlIHNwZWNpZmllZCBhZGRyZXNzIGB0b2AuCiAgICAvLy8gT3B0aW9uYWxseSwgeW91IG1heSBwcm92aWRlIGEgYGJvZHlgIG9mIHRoZSBtZXNzYWdl" +
+ "IGFuZCB0aGUgYGluaXRgIHBhY2thZ2Ugd2l0aCBgaW5pdE9mYC4KICAgIC8vLwogICAgLy8vIFdoZW4gYHNlbGYuc3RvcmFnZVJlc2VydmVgIGNvbnN0YW50IGlzIG92" +
+ "ZXJ3cml0dGVuIHRvIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLCBiZWZvcmUgc2VuZGluZyBhCiAgICAvLy8gbWVzc2FnZSBpdCBhbHNvIHRyaWVzIHRvIHJlc2VydmUgdGhl" +
+ "IGBzZWxmLnN0b3JhZ2VSZXNlcnZlYCBhbW91bnQgb2YgbmFub1RvbmNvaW5zIGZyb20gdGhlCiAgICAvLy8gcmVtYWluaW5nIGJhbGFuY2UgYmVmb3JlIG1ha2luZyB0" +
+ "aGUgc2VuZCBpbiB0aGUgYFNlbmRSZW1haW5pbmdCYWxhbmNlYCAoMTI4KSBtb2RlLgogICAgLy8vCiAgICAvLy8gSW4gY2FzZSByZXNlcnZhdGlvbiBhdHRlbXB0IGZh" +
+ "aWxzIGFuZCBpbiB0aGUgZGVmYXVsdCBjYXNlIHdpdGhvdXQgdGhlIGF0dGVtcHQsIHRoZSBtZXNzYWdlCiAgICAvLy8gaXMgc2VudCB3aXRoIHRoZSBgU2VuZFJlbWFp" +
+ "bmluZ1ZhbHVlYCAoNjQpIG1vZGUgaW5zdGVhZC4KICAgIC8vLwogICAgLy8vID4gTm90ZSB0aGF0IGBzZWxmLmZvcndhcmQoKWAgbmV2ZXIgc2VuZHMgYWRkaXRpb25h" +
+ "bCBuYW5vVG9uY29pbnMgb24gdG9wIG9mIHdoYXTigJlzIGF2YWlsYWJsZSBvbiB0aGUgYmFsYW5jZS4KICAgIC8vLyA+IFRvIGJlIGFibGUgdG8gc2VuZCBtb3JlIG5h" +
+ "bm9Ub25jb2lucyB3aXRoIGEgc2luZ2xlIG1lc3NhZ2UsIHVzZSB0aGUgdGhlIGBzZW5kYCBmdW5jdGlvbi4KICAgIC8vLwogICAgLy8vIFNlZTogaHR0cHM6Ly9kb2Nz" +
+ "LnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYmFzZSNzZWxmLWZvcndhcmQKICAgIC8vLwogICAgdmlydHVhbCBmdW4gZm9yd2FyZCh0bzogQWRkcmVzcywgYm9keTogQ2Vs" +
+ "bD8sIGJvdW5jZTogQm9vbCwgaW5pdDogU3RhdGVJbml0PykgewogICAgICAgIGlmIChpbml0ID09IG51bGwpIHsKICAgICAgICAgICAgLy8gTG9jayBzdG9yYWdlIGlm" +
+ "IG5lZWRlZAogICAgICAgICAgICBpZiAoc2VsZi5zdG9yYWdlUmVzZXJ2ZSA+IDApIHsgLy8gT3B0aW1pemVkIGluIGNvbXBpbGUtdGltZQogICAgICAgICAgICAgICAg" +
+ "bGV0IGN0eDogQ29udGV4dCA9IGNvbnRleHQoKTsKICAgICAgICAgICAgICAgIGxldCBiYWxhbmNlOiBJbnQgPSBteUJhbGFuY2UoKTsKICAgICAgICAgICAgICAgIGxl" +
+ "dCBiYWxhbmNlQmVmb3JlTWVzc2FnZTogSW50ID0gYmFsYW5jZSAtIGN0eC52YWx1ZTsKICAgICAgICAgICAgICAgIGlmIChiYWxhbmNlQmVmb3JlTWVzc2FnZSA8IHNl" +
+ "bGYuc3RvcmFnZVJlc2VydmUpIHsKICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZXNlcnZlKHNlbGYuc3RvcmFnZVJlc2VydmUsIFJlc2VydmVFeGFjdCk7CiAgICAg" +
+ "ICAgICAgICAgICAgICAgTWVzc2FnZVBhcmFtZXRlcnMgewogICAgICAgICAgICAgICAgICAgICAgICBib3VuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvLAog" +
+ "ICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UgfCBTZW5kSWdub3Jl" +
+ "RXJyb3JzLAogICAgICAgICAgICAgICAgICAgICAgICBib2R5LAogICAgICAgICAgICAgICAgICAgIH0uc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsK" +
+ "ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSnVzdCBzZW5kIHdpdGggcmVtYWluaW5nIGJhbGFuY2UKICAgICAgICAgICAgTWVz" +
+ "c2FnZVBhcmFtZXRlcnMgewogICAgICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICAgICAgdG8sCiAgICAgICAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAg" +
+ "ICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgICAgICBib2R5LAogICAgICAgICAgICB9LnNlbmQoKTsK" +
+ "ICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gTG9jayBzdG9yYWdlIGlmIG5lZWRlZAogICAgICAgIGlmIChzZWxmLnN0b3JhZ2VSZXNlcnZl" +
+ "ID4gMCkgeyAvLyBPcHRpbWl6ZWQgaW4gY29tcGlsZS10aW1lCiAgICAgICAgICAgIGxldCBjdHg6IENvbnRleHQgPSBjb250ZXh0KCk7CiAgICAgICAgICAgIGxldCBi" +
+ "YWxhbmNlOiBJbnQgPSBteUJhbGFuY2UoKTsKICAgICAgICAgICAgbGV0IGJhbGFuY2VCZWZvcmVNZXNzYWdlOiBJbnQgPSBiYWxhbmNlIC0gY3R4LnZhbHVlOwogICAg" +
+ "ICAgICAgICBpZiAoYmFsYW5jZUJlZm9yZU1lc3NhZ2UgPCBzZWxmLnN0b3JhZ2VSZXNlcnZlKSB7CiAgICAgICAgICAgICAgICBuYXRpdmVSZXNlcnZlKHNlbGYuc3Rv" +
+ "cmFnZVJlc2VydmUsIFJlc2VydmVFeGFjdCk7CiAgICAgICAgICAgICAgICBTZW5kUGFyYW1ldGVycyB7CiAgICAgICAgICAgICAgICAgICAgdG8sCiAgICAgICAgICAg" +
+ "ICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UgfCBTZW5kSWdub3JlRXJyb3JzLAogICAgICAgICAgICAgICAgICAgIGJvZHksCiAgICAgICAgICAgICAg" +
+ "ICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICAgICAgICAgIGNvZGU6IGluaXQhIS5jb2RlLAogICAgICAgICAgICAg" +
+ "ICAgICAgIGRhdGE6IGluaXQhIS5kYXRhLAogICAgICAgICAgICAgICAgfS5zZW5kKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAg" +
+ "ICB9CgogICAgICAgIC8vIEp1c3Qgc2VuZCB3aXRoIHJlbWFpbmluZyBiYWxhbmNlCiAgICAgICAgU2VuZFBhcmFtZXRlcnMgewogICAgICAgICAgICBib3VuY2UsCiAg" +
+ "ICAgICAgICAgIHRvLAogICAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ1ZhbHVlIHwgU2VuZElnbm9yZUVycm9ycywKICAg" +
+ "ICAgICAgICAgYm9keSwKICAgICAgICAgICAgY29kZTogaW5pdCEhLmNvZGUsCiAgICAgICAgICAgIGRhdGE6IGluaXQhIS5kYXRhLAogICAgICAgIH0uc2VuZCgpOwog" +
+ "ICAgfQp9Cg==";
files["std/internal/cells.tact"] =
"Ly8KLy8gQnVpbGRlcgovLwoKLy8vIENyZWF0ZXMgYSBuZXcgZW1wdHkgYEJ1aWxkZXJgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAg" +
"IGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNl" +
@@ -1730,199 +1730,235 @@ files["std/internal/send.tact"] =
"c2FnZSB0byBiZSBzZW50IHVzaW5nIHRoZSBgTWVzc2FnZVBhcmFtZXRlcnNgIHN0cnVjdC4gQWxsb3dzIGZvciBjaGVhcGVyIG5vbi1kZXBsb3ltZW50LCByZWd1bGFy" +
"IG1lc3NhZ2VzIGNvbXBhcmVkIHRvIHRoZSBgc2VuZCgpYCBmdW5jdGlvbi4KLy8vCi8vLyBUaGUgYE1lc3NhZ2VQYXJhbWV0ZXJzYCBzdHJ1Y3QgaXMgc2ltaWxhciB0" +
"byBgU2VuZFBhcmFtZXRlcnNgIHN0cnVjdCwgYnV0IHdpdGhvdXQgdGhlIGBjb2RlYCBhbmQgYGRhdGFgIGZpZWxkcy4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhh" +
- "bXBsZSgpIHsKLy8vICAgICBtZXNzYWdlKE1lc3NhZ2VQYXJhbWV0ZXJzewovLy8gICAgICAgICB0bzogc2VuZGVyKCksICAgIC8vIGJhY2sgdG8gdGhlIHNlbmRlciwK" +
- "Ly8vICAgICAgICAgdmFsdWU6IHRvbigiMSIpLCAvLyB3aXRoIDEgVG9uY29pbiAoMV8wMDBfMDAwXzAwMCBuYW5vVG9uY29pbiksCi8vLyAgICAgICAgICAgICAgICAg" +
- "ICAgICAgICAgLy8gYW5kIG5vIG1lc3NhZ2UgYm9keQovLy8gICAgIH0pOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiAzMzog" +
- "W0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNl" +
- "ZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNtZXNzYWdlCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" +
- "bWVzc2FnZS1tb2RlCi8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8v" +
- "Lwphc20gZnVuIG1lc3NhZ2UocGFyYW1zOiBNZXNzYWdlUGFyYW1ldGVycykgewogICAgTkVXQwogICAgYnswMX0gU1RTTElDRUNPTlNUICAvLyBzdG9yZSB0YWcgPSAk" +
- "MCBhbmQgaWhyX2Rpc2FibGVkID0gdHJ1ZQogICAgMSBTVEkgICAgICAgICAgICAgICAvLyBzdG9yZSBgYm91bmNlYAogICAgYnswMDB9IFNUU0xJQ0VDT05TVCAvLyBz" +
- "dG9yZSBib3VuY2VkID0gZmFsc2UgYW5kIHNyYyA9IGFkZHJfbm9uZQogICAgU1RTTElDRSAgICAgICAgICAgICAvLyBzdG9yZSBgdG9gCiAgICBTV0FQCiAgICBTVEdS" +
- "QU1TICAgICAgICAgICAgIC8vIHN0b3JlIGB2YWx1ZWAKICAgIDEwNiBQVVNISU5UICAgICAgICAgLy8gMSArIDQgKyA0ICsgNjQgKyAzMiArIDEKICAgIFNUWkVST0VT" +
- "CiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBCdWlsZGVyCiAgICAvLyBzMTogYGJvZHlgCiAgICAvLyBzMjogYG1vZGVgCiAgICBTVERJQ1QKICAgIEVO" +
- "REMKICAgIFNXQVAKICAgIFNFTkRSQVdNU0cKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gUXVldWVzIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdXNpbmcgYSBgU2VuZFBh" +
- "cmFtZXRlcnNgIHN0cnVjdC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzewovLy8gICAgICAgICB0" +
- "bzogc2VuZGVyKCksICAgIC8vIGJhY2sgdG8gdGhlIHNlbmRlciwKLy8vICAgICAgICAgdmFsdWU6IHRvbigiMSIpLCAvLyB3aXRoIDEgVG9uY29pbiAoMV8wMDBfMDAw" +
- "XzAwMCBuYW5vVG9uY29pbiksCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG5vIG1lc3NhZ2UgYm9keQovLy8gICAgIH0pOwovLy8gfQovLy8gYGBg" +
+ "bXBsZSgpIHsKLy8vICAgICBNZXNzYWdlUGFyYW1ldGVyc3sKLy8vICAgICAgICAgdG86IHNlbmRlcigpLCAgICAvLyBiYWNrIHRvIHRoZSBzZW5kZXIsCi8vLyAgICAg" +
+ "ICAgIHZhbHVlOiB0b24oIjEiKSwgLy8gd2l0aCAxIFRvbmNvaW4gKDFfMDAwXzAwMF8wMDAgbmFub1RvbmNvaW4pLAovLy8gICAgICAgICAgICAgICAgICAgICAgICAg" +
+ "IC8vIGFuZCBubyBtZXNzYWdlIGJvZHkKLy8vICAgICB9LnNlbmQoKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogMzM6IFtB" +
+ "Y3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBtZXNzYWdlcy4KLy8vCi8vLyBTZWU6" +
+ "Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjbWVzc2FnZQovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL21l" +
+ "c3NhZ2UtbW9kZQovLy8KLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8K" +
+ "YXNtIGZ1biBtZXNzYWdlKHBhcmFtczogTWVzc2FnZVBhcmFtZXRlcnMpIHsKICAgIE5FV0MKICAgIGJ7MDF9IFNUU0xJQ0VDT05TVCAgLy8gc3RvcmUgdGFnID0gJDAg" +
+ "YW5kIGlocl9kaXNhYmxlZCA9IHRydWUKICAgIDEgU1RJICAgICAgICAgICAgICAgLy8gc3RvcmUgYGJvdW5jZWAKICAgIGJ7MDAwfSBTVFNMSUNFQ09OU1QgLy8gc3Rv" +
+ "cmUgYm91bmNlZCA9IGZhbHNlIGFuZCBzcmMgPSBhZGRyX25vbmUKICAgIFNUU0xJQ0UgICAgICAgICAgICAgLy8gc3RvcmUgYHRvYAogICAgU1dBUAogICAgU1RHUkFN" +
+ "UyAgICAgICAgICAgICAvLyBzdG9yZSBgdmFsdWVgCiAgICAxMDYgUFVTSElOVCAgICAgICAgIC8vIDEgKyA0ICsgNCArIDY0ICsgMzIgKyAxCiAgICBTVFpFUk9FUwog" +
+ "ICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQnVpbGRlcgogICAgLy8gczE6IGBib2R5YAogICAgLy8gczI6IGBtb2RlYAogICAgU1RESUNUCiAgICBFTkRD" +
+ "CiAgICBTV0FQCiAgICBTRU5EUkFXTVNHCn0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgTWVzc2FnZVBhcmFtZXRlcnNgIHN0cnVjdC4gQXZhaWxhYmxl" +
+ "IHNpbmNlIFRhY3QgMS43LjAuCi8vLwovLy8gUXVldWVzIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdXNpbmcgdGhlIGBNZXNzYWdlUGFyYW1ldGVyc2Agc3RydWN0LiBB" +
+ "bGxvd3MgZm9yIGNoZWFwZXIgbm9uLWRlcGxveW1lbnQsIHJlZ3VsYXIgbWVzc2FnZXMgY29tcGFyZWQgdG8gdGhlIGBzZW5kKClgIGZ1bmN0aW9uLgovLy8KLy8vIFRo" +
+ "ZSBgTWVzc2FnZVBhcmFtZXRlcnNgIHN0cnVjdCBpcyBzaW1pbGFyIHRvIGBTZW5kUGFyYW1ldGVyc2Agc3RydWN0LCBidXQgd2l0aG91dCB0aGUgYGNvZGVgIGFuZCBg" +
+ "ZGF0YWAgZmllbGRzLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIE1lc3NhZ2VQYXJhbWV0ZXJzewovLy8gICAgICAgICB0bzogc2Vu" +
+ "ZGVyKCksICAgIC8vIGJhY2sgdG8gdGhlIHNlbmRlciwKLy8vICAgICAgICAgdmFsdWU6IHRvbigiMSIpLCAvLyB3aXRoIDEgVG9uY29pbiAoMV8wMDBfMDAwXzAwMCBu" +
+ "YW5vVG9uY29pbiksCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG5vIG1lc3NhZ2UgYm9keQovLy8gICAgIH0uc2VuZCgpOwovLy8gfQovLy8gYGBg" +
"Ci8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBx" +
- "dWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNzZW5kCi8vLwovLy8g" +
- "W0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwphc20gZnVuIHNlbmQocGFyYW1z" +
- "OiBTZW5kUGFyYW1ldGVycykgewogICAgLy8gSW5zdHJ1Y3Rpb25zIGFyZSBncm91cGVkLCBhbmQgdGhlIHN0YWNrIHN0YXRlcyB0aGV5IHByb2R1Y2UgYXMgYSBncm91" +
- "cCBhcmUgc2hvd24gcmlnaHQgYWZ0ZXIuCiAgICAvLyBJbiB0aGUgZW5kLCBvdXIgbWVzc2FnZSBDZWxsIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgVEwtQiBzdHJ1" +
- "Y3R1cmU6CiAgICAvLyBtZXNzYWdlJF8ge1g6VHlwZX0KICAgIC8vICAgaW5mbzpDb21tb25Nc2dJbmZvUmVsYXhlZAogICAgLy8gICBpbml0OihNYXliZSAoRWl0aGVy" +
- "IFN0YXRlSW5pdCBeU3RhdGVJbml0KSkKICAgIC8vICAgYm9keTooRWl0aGVyIFggXlgpCiAgICAvLyA9IE1lc3NhZ2VSZWxheGVkIFg7CgogICAgLy8g4oaSIFN0YWNr" +
- "IHN0YXRlCiAgICAvLyBzMDogYHBhcmFtcy5ib3VuY2VgCiAgICAvLyBzMTogYHBhcmFtcy50b2AKICAgIC8vIHMyOiBgcGFyYW1zLnZhbHVlYAogICAgLy8gczM6IGBw" +
- "YXJhbXMuZGF0YWAKICAgIC8vIHM0OiBgcGFyYW1zLmNvZGVgCiAgICAvLyBzNTogYHBhcmFtcy5ib2R5YAogICAgLy8gczY6IGBwYXJhbXMubW9kZWAKICAgIC8vIEZv" +
- "ciBicmV2aXR5LCB0aGUgInBhcmFtcyIgcHJlZml4IHdpbGwgYmUgb21pdHRlZCBmcm9tIG5vdyBvbi4KCiAgICAvLyBHcm91cCAxOiBTdG9yaW5nIHRoZSBgYm91bmNl" +
- "YCwgYHRvYCBhbmQgYHZhbHVlYCBpbnRvIGEgQnVpbGRlcgogICAgTkVXQwogICAgYnswMX0gU1RTTElDRUNPTlNUICAvLyBzdG9yZSB0YWcgPSAkMCBhbmQgaWhyX2Rp" +
- "c2FibGVkID0gdHJ1ZQogICAgMSBTVEkgICAgICAgICAgICAgICAvLyBzdG9yZSBgYm91bmNlYAogICAgYnswMDB9IFNUU0xJQ0VDT05TVCAvLyBzdG9yZSBib3VuY2Vk" +
- "ID0gZmFsc2UgYW5kIHNyYyA9IGFkZHJfbm9uZQogICAgU1RTTElDRSAgICAgICAgICAgICAvLyBzdG9yZSBgdG9gCiAgICBTV0FQCiAgICBTVEdSQU1TICAgICAgICAg" +
- "ICAgIC8vIHN0b3JlIGB2YWx1ZWAKICAgIDEwNSBQVVNISU5UICAgICAgICAgLy8gMSArIDQgKyA0ICsgNjQgKyAzMgogICAgU1RaRVJPRVMgICAgICAgICAgICAvLyBz" +
- "dG9yZSBjdXJyZW5jeV9jb2xsZWN0aW9uLCBpaHJfZmVlLCBmd2RfZmVlLCBjcmVhdGVkX2x0IGFuZCBjcmVhdGVkX2F0CiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAg" +
- "IC8vIHMwOiBCdWlsZGVyCiAgICAvLyBzMTogYGRhdGFgCiAgICAvLyBzMjogYGNvZGVgCiAgICAvLyBzMzogYGJvZHlgCiAgICAvLyBzNDogYG1vZGVgCgogICAgLy8g" +
- "R3JvdXAgMjogUGxhY2luZyB0aGUgQnVpbGRlciBhZnRlciBjb2RlIGFuZCBkYXRhLCB0aGVuIGNoZWNraW5nIHRob3NlIGZvciBudWxsYWJpbGl0eQogICAgczIgWENI" +
- "RzAKICAgIERVUDIKICAgIElTTlVMTAogICAgU1dBUAogICAgSVNOVUxMCiAgICBBTkQKICAgIC8vIOKGkiBTdGFjayBzdGF0ZQogICAgLy8gczA6IC0xICh0cnVlKSBp" +
- "ZiBgZGF0YWAgYW5kIGBjb2RlYCBhcmUgYm90aCBudWxsLCAwIChmYWxzZSkgb3RoZXJ3aXNlCiAgICAvLyBzMTogYGNvZGVgCiAgICAvLyBzMjogYGRhdGFgCiAgICAv" +
- "LyBzMzogQnVpbGRlcgogICAgLy8gczQ6IGBib2R5YAogICAgLy8gczU6IGBtb2RlYAoKICAgIC8vIEdyb3VwIDM6IExlZnQgYnJhbmNoIG9mIHRoZSBJRkVMU0UsIGV4" +
- "ZWN1dGVkIGlmIHMwIGlzIC0xICh0cnVlKQogICAgPHsKICAgICAgICBEUk9QMiAvLyBkcm9wIGBkYXRhYCBhbmQgYGNvZGVgLCBzaW5jZSBlaXRoZXIgb2YgdGhvc2Ug" +
- "aXMgbnVsbAogICAgICAgIGJ7MH0gU1RTTElDRUNPTlNUCiAgICB9PiBQVVNIQ09OVAoKICAgIC8vIEdyb3VwIDM6IFJpZ2h0IGJyYW5jaCBvZiB0aGUgSUZFTFNFLCBl" +
- "eGVjdXRlZCBpZiBzMCBpcyAwIChmYWxzZSkKICAgIDx7CiAgICAgICAgLy8gXyBzcGxpdF9kZXB0aDooTWF5YmUgKCMjIDUpKQogICAgICAgIC8vICAgc3BlY2lhbDoo" +
- "TWF5YmUgVGlja1RvY2spCiAgICAgICAgLy8gICBjb2RlOihNYXliZSBeQ2VsbCkKICAgICAgICAvLyAgIGRhdGE6KE1heWJlIF5DZWxsKQogICAgICAgIC8vICAgbGli" +
- "cmFyeTooTWF5YmUgXkNlbGwpCiAgICAgICAgLy8gPSBTdGF0ZUluaXQ7CiAgICAgICAgUk9UICAgICAgICAgICAgICAgIC8vIHBsYWNlIG1lc3NhZ2UgQnVpbGRlciBv" +
- "biB0b3AKICAgICAgICBiezEwfSBTVFNMSUNFQ09OU1QgLy8gc3RvcmUgTWF5YmUgPSB0cnVlLCBFaXRoZXIgPSBmYWxzZQogICAgICAgIC8vIFN0YXJ0IGNvbXBvc2lu" +
- "ZyBpbmxpbmVkIFN0YXRlSW5pdAogICAgICAgIGJ7MDB9IFNUU0xJQ0VDT05TVCAvLyBzdG9yZSBzcGxpdF9kZXB0aCBhbmQgc3BlY2lhbCBmaXJzdAogICAgICAgIFNU" +
- "RElDVCAgICAgICAgICAgICAvLyBzdG9yZSBjb2RlCiAgICAgICAgU1RESUNUICAgICAgICAgICAgIC8vIHN0b3JlIGRhdGEKICAgICAgICBiezB9IFNUU0xJQ0VDT05T" +
- "VCAgLy8gc3RvcmUgbGlicmFyeQogICAgfT4gUFVTSENPTlQKCiAgICAvLyBHcm91cCAzOiBJRkVMU0UgdGhhdCBkb2VzIHRoZSBicmFuY2hpbmcgc2hvd24gYWJvdmUK" +
- "ICAgIElGRUxTRQogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQnVpbGRlcgogICAgLy8gczE6IG51bGwgb3IgU3RhdGVJbml0CiAgICAvLyBzMjogYGJv" +
- "ZHlgCiAgICAvLyBzMzogYG1vZGVgCgogICAgLy8gR3JvdXAgNDogRmluYWxpemluZyB0aGUgbWVzc2FnZQogICAgU1RESUNUIC8vIHN0b3JlIGBib2R5YCBhcyByZWYg" +
- "d2l0aCBhbiBleHRyYSBNYXliZSBiaXQsIHNpbmNlIGBib2R5YCBtaWdodCBiZSBudWxsCiAgICBFTkRDCiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBD" +
- "ZWxsCiAgICAvLyBzMTogYG1vZGVgCgogICAgLy8gR3JvdXAgNTogU2VuZGluZyB0aGUgbWVzc2FnZSwgd2l0aCBgbW9kZWAgb24gdG9wCiAgICBTV0FQCiAgICBTRU5E" +
- "UkFXTVNHIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YWN0LWxhbmcvdGFjdC9pc3N1ZXMvMTU1OAp9CgovLy8gU3RydWN0IGZvciBzcGVjaWZ5aW5nIHRoZSBkZXBsb3lt" +
- "ZW50IG1lc3NhZ2UgcGFyYW1ldGVycyBvZiB0aGUgYGRlcGxveSgpYCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gU2VlOiBodHRw" +
- "czovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI2RlcGxveQovLy8Kc3RydWN0IERlcGxveVBhcmFtZXRlcnMgewogICAgLy8vIEFuIDgtYml0IHZhbHVl" +
- "IHRoYXQgY29uZmlndXJlcyBob3cgdG8gc2VuZCBhIG1lc3NhZ2UsIGRlZmF1bHRzIHRvIDAuCiAgICAvLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9i" +
- "b29rL21lc3NhZ2UtbW9kZQogICAgbW9kZTogSW50ID0gU2VuZERlZmF1bHRNb2RlOwoKICAgIC8vLyBPcHRpb25hbCBtZXNzYWdlIGJvZHkgYXMgYSBgQ2VsbGAuCiAg" +
- "ICBib2R5OiBDZWxsPyA9IG51bGw7CgogICAgLy8vIFRoZSBhbW91bnQgb2YgbmFub1RvbmNvaW5zIHlvdSB3YW50IHRvIHNlbmQgd2l0aAogICAgLy8vIHRoZSBtZXNz" +
- "YWdlLiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gY292ZXIgZm9yd2FyZCBmZWVzLAogICAgLy8vIHVubGVzcyB0aGUgb3B0aW9uYWwgZmxhZyBgU2VuZFBheUZ3ZEZlZXNT" +
- "ZXBhcmF0ZWx5YCBpcyB1c2VkLgogICAgdmFsdWU6IEludDsKCiAgICAvLy8gV2hlbiBzZXQgdG8gYHRydWVgIChkZWZhdWx0KSBtZXNzYWdlIGJvdW5jZXMgYmFjayB0" +
- "byB0aGUgc2VuZGVyIGlmCiAgICAvLy8gdGhlIHJlY2lwaWVudCBjb250cmFjdCBkb2Vzbid0IGV4aXN0IG9yIHdhc24ndCBhYmxlIHRvIHByb2Nlc3MgdGhlIG1lc3Nh" +
- "Z2UuCiAgICBib3VuY2U6IEJvb2wgPSB0cnVlOwoKICAgIC8vLyBJbml0aWFsIHBhY2thZ2Ugb2YgdGhlIGNvbnRyYWN0IChpbml0aWFsIGNvZGUgYW5kIGluaXRpYWwg" +
- "ZGF0YSkuCiAgICAvLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4cHJlc3Npb25zI2luaXRvZgogICAgaW5pdDogU3RhdGVJbml0Owp9Cgov" +
- "Ly8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBRdWV1ZXMgdGhlIGNvbnRyYWN0IGRlcGxveW1lbnQgbWVzc2FnZSB0" +
- "byBiZSBzZW50IHVzaW5nIHRoZSBgRGVwbG95UGFyYW1ldGVyc2Agc3RydWN0LiBBbGxvd3MgZm9yIGNoZWFwZXIgb24tY2hhaW4gZGVwbG95bWVudHMgY29tcGFyZWQg" +
- "dG8gdGhlIGBzZW5kKClgIGZ1bmN0aW9uLgovLy8KLy8vIFRoZSBgRGVwbG95UGFyYW1ldGVyc2Agc3RydWN0IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRz" +
- "OgovLy8gKiBgbW9kZTogSW50YCwgYW4gOC1iaXQgdmFsdWUgdGhhdCBjb25maWd1cmVzIGhvdyB0byBzZW5kIGEgbWVzc2FnZSwgZGVmYXVsdHMgdG8gMC4KLy8vICog" +
- "YGJvZHk6IENlbGw/YCwgb3B0aW9uYWwgbWVzc2FnZSBib2R5IGFzIGEgYENlbGxgLgovLy8gKiBgdmFsdWU6IEludGAsIHRoZSBhbW91bnQgb2YgbmFub1RvbmNvaW5z" +
- "IHlvdSB3YW50IHRvIHNlbmQgd2l0aCB0aGUgbWVzc2FnZS4KLy8vICAgVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGNvdmVyIGZvcndhcmQgZmVlcywgdW5sZXNzIHRoZSBv" +
- "cHRpb25hbCBmbGFnIGBTZW5kUGF5RndkRmVlc1NlcGFyYXRlbHlgIGlzIHVzZWQuCi8vLyAqIGBib3VuY2U6IEJvb2xgLCB3aGVuIHNldCB0byBgdHJ1ZWAgKGRlZmF1" +
- "bHQpIG1lc3NhZ2UgYm91bmNlcyBiYWNrIHRvIHRoZSBzZW5kZXIKLy8vICAgIGlmIHRoZSByZWNpcGllbnQgY29udHJhY3QgZG9lc24ndCBleGlzdCBvciB3YXNuJ3Qg" +
- "YWJsZSB0byBwcm9jZXNzIHRoZSBtZXNzYWdlLgovLy8gKiBgaW5pdDogU3RhdGVJbml0YCwgaW5pdCBwYWNrYWdlIG9mIHRoZSBjb250cmFjdCAoaW5pdGlhbCBjb2Rl" +
- "IGFuZCBpbml0aWFsIGRhdGEpLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGRlcGxveShEZXBsb3lQYXJhbWV0ZXJzewovLy8gICAg" +
- "ICAgICBpbml0OiBpbml0T2YgU29tZUNvbnRyYWN0KCksIC8vIHdpdGggaW5pdGlhbCBjb2RlIGFuZCBkYXRhIG9mIFNvbWVDb250cmFjdAovLy8gICAgICAgICAgICAg" +
- "ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBubyBhZGRpdGlvbmFsIG1lc3NhZ2UgYm9keQovLy8gICAgICAgICBtb2RlOiBTZW5kSWdub3JlRXJyb3JzLCAg" +
- "ICAgIC8vIHNraXAgdGhlIG1lc3NhZ2UgaW4gY2FzZSBvZiBlcnJvcnMKLy8vICAgICAgICAgdmFsdWU6IHRvbigiMSIpLCAgICAgICAgICAgICAvLyBzZW5kIDEgVG9u" +
- "Y29pbiAoMV8wMDBfMDAwXzAwMCBuYW5vVG9uY29pbikKLy8vICAgICB9KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogMzM6" +
- "IFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBtZXNzYWdlcy4KLy8vCi8vLyBT" +
- "ZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjZGVwbG95Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" +
- "bWVzc2FnZS1tb2RlCi8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8v" +
- "Lwphc20gZnVuIGRlcGxveShwYXJhbXM6IERlcGxveVBhcmFtZXRlcnMpIHsKICAgIC8vIEluc3RydWN0aW9ucyBhcmUgZ3JvdXBlZCwgYW5kIHRoZSBzdGFjayBzdGF0" +
- "ZXMgdGhleSBwcm9kdWNlIGFzIGEgZ3JvdXAgYXJlIHNob3duIHJpZ2h0IGFmdGVyLgogICAgLy8KICAgIC8vIOKGkiBTdGFjayBzdGF0ZQogICAgLy8gczA6IGBwYXJh" +
- "bXMuaW5pdC5kYXRhYAogICAgLy8gczE6IGBwYXJhbXMuaW5pdC5jb2RlYAogICAgLy8gczI6IGBwYXJhbXMuYm91bmNlYAogICAgLy8gczM6IGBwYXJhbXMudmFsdWVg" +
- "CiAgICAvLyBzNDogYHBhcmFtcy5ib2R5YAogICAgLy8gczU6IGBwYXJhbXMubW9kZWAKICAgIC8vIEZvciBicmV2aXR5LCB0aGUgInBhcmFtcyIgcHJlZml4IHdpbGwg" +
- "YmUgb21pdHRlZCBmcm9tIG5vdyBvbi4KCiAgICAvLyBHcm91cCAxOiBQcmVwYXJhdGlvbiBvZiBuZWVkZWQgcGFyYW1zCiAgICAvLyBGb3IgYWxtb3N0IGlkZW50aWNh" +
- "bCBsb2dpYyBhbmQgaW5zdHJ1Y3Rpb25zLAogICAgLy8gc2VlIGNvbW1lbnRzIGluc2lkZSBgY29udHJhY3RIYXNoKClgIGZ1bmN0aW9uIGluIGNvbnRyYWN0LnRhY3QK" +
- "ICAgIDQgMSBCTEtQVVNIIC8vIHB1c2hlcyAyIGNvcGllcyBvZiBgaW5pdC5jb2RlYCBhbmQgYGluaXQuZGF0YWAKICAgIEhBU0hDVSAvLyBgaW5pdC5kYXRhYCBoYXNo" +
- "CiAgICBTV0FQCiAgICBIQVNIQ1UgLy8gYGluaXQuY29kZWAgaGFzaAogICAgU1dBUDIKICAgIENERVBUSCAvLyBgaW5pdC5kYXRhYCBkZXB0aAogICAgU1dBUAogICAg" +
- "Q0RFUFRIIC8vIGBpbml0LmNvZGVgIGRlcHRoCgogICAgLy8gR3JvdXAgMjogQ2FsY3VsYXRpbmcgZGVzdGluYXRpb24gYWRkcmVzcwogICAgLy8gRm9yIGFsbW9zdCBp" +
- "ZGVudGljYWwgbG9naWMgYW5kIGluc3RydWN0aW9ucywKICAgIC8vIHNlZSBjb21tZW50cyBpbnNpZGUgYGNvbnRyYWN0SGFzaCgpYCBmdW5jdGlvbiBpbiBjb250cmFj" +
- "dC50YWN0CiAgICAxMzEzODAgSU5UIC8vICgyIDw8IDE2KSB8ICgxIDw8IDgpIHwgMHgzNAogICAgTkVXQwogICAgMjQgU1RVCiAgICAxNiBTVFUKICAgIDE2IFNUVQog" +
- "ICAgMjU2IFNUVQogICAgMjU2IFNUVQogICAgT05FIEhBU0hFWFRfU0hBMjU2IC8vIG9idGFpbnMgaGFzaCBwYXJ0IChhY2NvdW50IGlkKSBvZiB0aGUgYWRkcmVzcwog" +
- "ICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogZGVzdEFkZHIoaGFzaCBwYXJ0KQogICAgLy8gczE6IGBpbml0LmRhdGFgCiAgICAvLyBzMjogYGluaXQuY29k" +
- "ZWAKICAgIC8vIHMzIGFuZCBiZWxvdzogYGJvdW5jZWAsIGB2YWx1ZWAsIGBib2R5YCwgYG1vZGVgCgogICAgLy8gR3JvdXAgMzogQnVpbGRpbmcgYSBtZXNzYWdlIChD" +
- "b21tb25Nc2dJbmZvUmVsYXhlZCkKICAgIHMzIFhDSEcwICAgICAgICAgICAvLyBzd2FwcyBgYm91bmNlYCB3aXRoIGRlc3RBZGRyKGhhc2ggcGFydCkKICAgIE5FV0MK" +
- "ICAgIGJ7MDF9IFNUU0xJQ0VDT05TVCAvLyBzdG9yZSB0YWcgPSAkMCBhbmQgaWhyX2Rpc2FibGVkID0gdHJ1ZQogICAgMSBTVEkgICAgICAgICAgICAgIC8vIHN0b3Jl" +
- "IGBib3VuY2VgCiAgICBzMSBzMiBYQ0hHICAgICAgICAgLy8gc3dhcCBgaW5pdC5kYXRhYCB3aXRoIGBpbml0LmNvZGVgLCBwbGFjaW5nIGNvZGUgb24gczEKICAgIFNU" +
- "UkVGICAgICAgICAgICAgICAvLyBzdG9yZSBgaW5pdC5jb2RlYAogICAgU1RSRUYgICAgICAgICAgICAgIC8vIHN0b3JlIGBpbml0LmRhdGFgCiAgICAvLyBJbmxpbmUg" +
- "U3RhdGVJbml0OgogICAgYnswMDAxMDAwMDAwMDAwMH0gU1RTTElDRUNPTlNUCiAgICAvLyAwICsgMDAgKyAxMCArIDAgKyAwMDAwMDAwMAogICAgLy8gMSkgMCAtIGJv" +
- "dW5jZWQgPSBmYWxzZQogICAgLy8gMikgMDAgLSBzcmMgPSBhZGRyX25vbmUKICAgIC8vIDMpIDEwIC0gdGFnIG9mIGFkZHJfc3RkIChwYXJ0IG9mIGRlc3QpCiAgICAv" +
- "LyA0KSAwIC0gTWF5YmUgQW55Y2FzdCA9IGZhbHNlCiAgICAvLyA1KSAwMDAwMDAwMCAtIHdvcmtjaGFpbl9pZCAocGFydCBvZiBkZXN0KQogICAgLy8KICAgIDI1NiBT" +
- "VFUgICAgIC8vIHN0b3JlIGRlc3RBZGRyKGhhc2ggcGFydCkKICAgIFNXQVAgICAgICAgIC8vIEJ1aWxkZXIgb24gdG9wLCBgdmFsdWVgIGJlbG93CiAgICBTVEdSQU1T" +
- "ICAgICAvLyBzdG9yZSBgdmFsdWVgCiAgICAxMDUgUFVTSElOVCAvLyAxICsgNCArIDQgKyA2NCArIDMyCiAgICBTVFpFUk9FUyAgICAvLyBzdG9yZSBjdXJyZW5jeV9j" +
- "b2xsZWN0aW9uLCBpaHJfZmVlLCBmd2RfZmVlLCBjcmVhdGVkX2x0IGFuZCBjcmVhdGVkX2F0CgogICAgLy8gR3JvdXAgNDogQ29udGludWUgYnVpbGRpbmcgYSBtZXNz" +
- "YWdlIChDb21tb25Nc2dJbmZvUmVsYXhlZCBpbnRvIE1lc3NhZ2VSZWxheGVkKQogICAgLy8gUmVtYWluaW5nIGJpdHMgb2YgTWVzc2FnZVJlbGF4ZWQ6CiAgICBiezEw" +
- "MDAxMTB9IFNUU0xJQ0VDT05TVAogICAgLy8gMTAgKyAwICsgMCArIDEgKyAxICsgMAogICAgLy8gMTAgLSBNYXliZSAoRWl0aGVyIFN0YXRlSW5pdCBeU3RhdGVJbml0" +
- "KSA9IHRydWUgZmFsc2UKICAgIC8vIDAgLSBzcGxpdF9kZXB0aDooTWF5YmUgKCMjIDUpKSA9IGZhbHNlCiAgICAvLyAwID0gc3BlY2lhbDooTWF5YmUgVGlja1RvY2sp" +
- "ID0gZmFsc2UKICAgIC8vIDEgPSBjb2RlOihNYXliZSBeQ2VsbCkgPSB0cnVlCiAgICAvLyAxID0gZGF0YTooTWF5YmUgXkNlbGwpID0gdHJ1ZQogICAgLy8gMCA9IGxp" +
- "YnJhcnk6KE1heWJlIF5DZWxsKSA9IGZhbHNlCiAgICAvLwogICAgU1RESUNUIC8vIHN0b3JlIGBib2R5YCBhcyByZWYgd2l0aCBhbiBleHRyYSBNYXliZSBiaXQsIHNp" +
- "bmNlIGBib2R5YCBtaWdodCBiZSBudWxsCiAgICBFTkRDICAgLy8gZmluYWxpemUgdGhlIG1lc3NhZ2UKICAgIC8vIOKGkiBTdGFjayBzdGF0ZQogICAgLy8gczA6IENl" +
- "bGwKICAgIC8vIHMxOiBwYXJhbXMuYG1vZGVgCgogICAgLy8gR3JvdXAgNTogU2VuZGluZyB0aGUgbWVzc2FnZSwgd2l0aCBgbW9kZWAgb24gdG9wCiAgICBTV0FQCiAg" +
- "ICBTRU5EUkFXTVNHCn0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4xLgovLy8KLy8vIFF1ZXVlcyBhbiBlbXB0eSBtZXNzYWdl" +
- "IHRvIGJlIHNlbnQgd2l0aCB0aGUgYFNlbmRSZW1haW5pbmdWYWx1ZWAgbW9kZSBhbmQgdGhlIGBTZW5kSWdub3JlRXJyb3JzYCBmbGFnIHRvIHRoZSBkZXN0aW5hdGlv" +
- "biBhZGRyZXNzIGB0b2AuCi8vLyBUaGlzIGlzIHRoZSBtb3N0IGdhcy1lZmZpY2llbnQgd2F5IHRvIHNlbmQgdGhlIHJlbWFpbmluZyB2YWx1ZSBmcm9tIHRoZSBpbmNv" +
- "bWluZyBtZXNzYWdlIHRvIHRoZSBnaXZlbiBhZGRyZXNzLgovLy8KLy8vIFRoaXMgZnVuY3Rpb24gd29uJ3QgZm9yd2FyZCBleGNlc3MgdmFsdWVzIGlmIGFueSBvdGhl" +
- "ciBtZXNzYWdlLXNlbmRpbmcgZnVuY3Rpb25zIHdlcmUgY2FsbGVkIGluIHRoZSBzYW1lIHJlY2VpdmVyIGJlZm9yZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhh" +
- "bXBsZXMoKSB7Ci8vLyAgICAgLy8gRm9yd2FyZCB0aGUgcmVtYWluaW5nIHZhbHVlIGJhY2sgdG8gdGhlIHNlbmRlcgovLy8gICAgIGNhc2hiYWNrKHNlbmRlcigpKTsK" +
- "Ly8vCi8vLyAgICAgLy8gVGhlIGNhc2hiYWNrKCkgZnVuY3Rpb24gYWJvdmUgaXMgY2hlYXBlciwgYnV0IGZ1bmN0aW9uYWxseQovLy8gICAgIC8vIGVxdWl2YWxlbnQg" +
- "dG8gdGhlIGZvbGxvd2luZyBjYWxsIHRvIHRoZSBtZXNzYWdlKCkgZnVuY3Rpb24KLy8vICAgICBtZXNzYWdlKE1lc3NhZ2VQYXJhbWV0ZXJzewovLy8gICAgICAgICBt" +
- "b2RlOiBTZW5kUmVtYWluaW5nVmFsdWUgfCBTZW5kSWdub3JlRXJyb3JzLAovLy8gICAgICAgICBib2R5OiBudWxsLAovLy8gICAgICAgICB2YWx1ZTogMCwKLy8vICAg" +
- "ICAgICAgdG86IHNlbmRlcigpLAovLy8gICAgICAgICBib3VuY2U6IGZhbHNlLAovLy8gICAgIH0pOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVz" +
- "Ci8vLwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3Nh" +
- "Z2VzLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNjYXNoYmFjawovLy8KLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28g" +
- "bG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8KYXNtIGZ1biBjYXNoYmFjayh0bzogQWRkcmVzcykgewogICAgTkVX" +
- "QwogICAgeHs0Ml99IFNUU0xJQ0VDT05TVCAvLyAuc3RvcmVVaW50KDB4MTAsIDYpCiAgICBTVFNMSUNFICAgICAgICAgIC8vIC5zdG9yZUFkZHJlc3ModG8pCiAgICAw" +
- "IFBVU0hJTlQgICAgICAgIC8vIDAKICAgIDExMSBTVFVSICAgICAgICAgLy8gLnN0b3JlVWludCgwLCAxMTEpCiAgICAgICAgICAgICAgICAgICAgIC8vIDQgemVyb3Mg" +
- "Zm9yIGNvaW5zIGFuZCAxMDcgemVyb3MgZm9yIGx0LCBmZWVzLCBldGMuCiAgICBFTkRDCiAgICA2NiBQVVNISU5UICAgICAgIC8vIFNlbmRSZW1haW5pbmdWYWx1ZSB8" +
- "IFNlbmRJZ25vcmVFcnJvcnMKICAgIFNFTkRSQVdNU0cKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gKipEZXByZWNhdGVkKiogc2luY2UgVGFjdCAxLjYuNi4gVXNlIGBz" +
- "ZW5kUmF3TWVzc2FnZSgpYCBpbnN0ZWFkLgovLy8KLy8vIFF1ZXVlcyB0aGUgbWVzc2FnZSB0byBiZSBzZW50IGJ5IHNwZWNpZnlpbmcgdGhlIGNvbXBsZXRlIGBtc2dg" +
- "IGNlbGwgYW5kIHRoZSBtZXNzYWdlIGBtb2RlYC4KLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKA" +
- "lCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVlIG1vcmUgdGhhbiAyNTUgbWVzc2FnZXMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1s" +
- "YW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmRyYXdtZXNzYWdlCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjbmF0aXZlc2VuZG1l" +
- "c3NhZ2UKLy8vCi8vLyBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjMzMKLy8vCmFzbSBm" +
- "dW4gbmF0aXZlU2VuZE1lc3NhZ2UobXNnOiBDZWxsLCBtb2RlOiBJbnQpIHsgU0VORFJBV01TRyB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2Ug" +
- "VGFjdCAxLjYuNi4KLy8vCi8vLyBRdWV1ZXMgdGhlIG1lc3NhZ2UgdG8gYmUgc2VudCBieSBzcGVjaWZ5aW5nIHRoZSBjb21wbGV0ZSBgbXNnYCBjZWxsIGFuZCB0aGUg" +
- "bWVzc2FnZSBgbW9kZWAuCi8vLwovLy8gUHJlZmVyIHVzaW5nIHRoZSBtb3JlIHVzZXItZnJpZW5kbHkgYG1lc3NhZ2UoKWAsIGBkZXBsb3koKWAsIG9yIGBzZW5kKClg" +
- "IGZ1bmN0aW9ucyB1bmxlc3MgeW91IGhhdmUgYSBjb21wbGV4IGxvZ2ljIHRoYXQgY2Fubm90IGJlIGV4cHJlc3NlZCBvdGhlcndpc2UuCi8vLwovLy8gIyMjIyBFeGl0" +
- "IGNvZGVzCi8vLwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1" +
- "IG1lc3NhZ2VzLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNzZW5kcmF3bWVzc2FnZQovLy8gKiBodHRw" +
- "czovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI21lc3NhZ2UKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNkZXBs" +
- "b3kKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNzZW5kCi8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6" +
- "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwphc20gZnVuIHNlbmRSYXdNZXNzYWdlKG1zZzogQ2VsbCwgbW9kZTogSW50KSB7IFNFTkRS" +
- "QVdNU0cgfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gKipEZXByZWNhdGVkKiogc2luY2UgVGFjdCAxLjYuNi4gVXNlIGBzZW5kUmF3TWVzc2FnZVJldHVybkZvcndhcmRG" +
- "ZWUoKWAgaW5zdGVhZC4KLy8vCi8vLyBTaW1pbGFyIHRvIGBzZW5kUmF3TWVzc2FnZSgpYCwgYnV0IGFsc28gY2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgZm9yd2Fy" +
- "ZCBmZWUgaW4gbmFub1RvbmNvaW4uCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdIC0gVGhy" +
- "b3duIGlmIHRoZSBtZXNzYWdlIG1vZGUgaXMgaW52YWxpZC4KLy8vICogNzogW1R5cGUgY2hlY2sgZXJyb3JdIC0gVGhyb3duIGlmIGFueSBvZiB0aGUgYmxvY2tjaGFp" +
- "biBjb25maWcsIGNvbnRyYWN0IGJhbGFuY2Ugb3IgaW5jb21pbmcgbWVzc2FnZSB2YWx1ZSBhcmUgaW52YWxpZC4KLy8vICogOTogW0NlbGwgdW5kZXJmbG93XSAtIFRo" +
- "cm93biBpZiB0aGUgYmxvY2tjaGFpbiBjb25maWcgaXMgaW52YWxpZC4KLy8vICogMTE6IFsiVW5rbm93biIgZXJyb3JdIC0gVGhyb3duIGlmIHRoZSBtZXNzYWdlIGNl" +
- "bGwgaXMgaWxsLWZvcm1lZCBvciB0aGUgYmxvY2tjaGFpbiBjb25maWcgaXMgaW52YWxpZC4KLy8vICogMzM6IFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRo" +
- "cm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBtZXNzYWdlcy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
- "b3JnL3JlZi9jb3JlLXNlbmQjbmF0aXZlc2VuZG1lc3NhZ2VyZXR1cm5mb3J3YXJkZmVlCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNl" +
- "bmQjc2VuZHJhd21lc3NhZ2UKLy8vCi8vLyBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQt" +
- "Y29kZXMjNQovLy8gW1R5cGUgY2hlY2sgZXJyb3JdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNwovLy8gW0NlbGwgdW5kZXJmbG93" +
- "XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vIFsiVW5rbm93biIgZXJyb3JdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9y" +
- "Zy9ib29rL2V4aXQtY29kZXMjMTEKLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMz" +
- "MwovLy8KYXNtIGZ1biBuYXRpdmVTZW5kTWVzc2FnZVJldHVybkZvcndhcmRGZWUobXNnOiBDZWxsLCBtb2RlOiBJbnQpOiBJbnQgeyBTRU5ETVNHIH0KCi8vLyBHbG9i" +
- "YWwgZnVuY3Rpb24uIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi42LgovLy8KLy8vIFNpbWlsYXIgdG8gYHNlbmRSYXdNZXNzYWdlKClgLCBidXQgYWxzbyBjYWxjdWxh" +
- "dGVzIGFuZCByZXR1cm5zIHRoZSBmb3J3YXJkIGZlZSBpbiBuYW5vVG9uY29pbi4KLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6IFtJbnRlZ2VyIG91" +
- "dCBvZiBleHBlY3RlZCByYW5nZV0gLSBUaHJvd24gaWYgdGhlIG1lc3NhZ2UgbW9kZSBpcyBpbnZhbGlkLgovLy8gKiA3OiBbVHlwZSBjaGVjayBlcnJvcl0gLSBUaHJv" +
- "d24gaWYgYW55IG9mIHRoZSBibG9ja2NoYWluIGNvbmZpZywgY29udHJhY3QgYmFsYW5jZSBvciBpbmNvbWluZyBtZXNzYWdlIHZhbHVlIGFyZSBpbnZhbGlkLgovLy8g" +
- "KiAxMTogWyJVbmtub3duIiBlcnJvcl0gLSBUaHJvd24gaWYgdGhlIG1lc3NhZ2UgY2VsbCBpcyBpbGwtZm9ybWVkIG9yIHRoZSBUVk0gY29uZmlnIGlzIGludmFsaWQu" +
- "Ci8vLyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVlIG1vcmUgdGhhbiAyNTUgbWVzc2FnZXMu" +
- "Ci8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmRyYXdtZXNzYWdlcmV0dXJuZm9yd2FyZGZlZQovLy8g" +
- "KiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmRyYXdtZXNzYWdlCi8vLwovLy8gW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdl" +
- "XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtUeXBlIGNoZWNrIGVycm9yXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5v" +
- "cmcvYm9vay9leGl0LWNvZGVzIzcKLy8vIFsiVW5rbm93biIgZXJyb3JdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjMTEKLy8vIFtB" +
- "Y3Rpb24gbGlzdCBpcyB0b28gbG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8KYXNtIGZ1biBzZW5kTWVzc2FnZVJl" +
- "dHVybkZvcndhcmRGZWUobXNnOiBDZWxsLCBtb2RlOiBJbnQpOiBJbnQgeyBTRU5ETVNHIH0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uCi8vLwovLy8gUXVldWVzIHRoZSBt" +
- "ZXNzYWdlIGBib2R5YCB0byBiZSBzZW50IHRvIHRoZSBvdXRlciB3b3JsZCB3aXRoIHRoZSBwdXJwb3NlIG9mIGxvZ2dpbmcgYW5kIGFuYWx5emluZyBpdCBsYXRlciBv" +
- "ZmYtY2hhaW4uIFRoZSBtZXNzYWdlIGRvZXMgbm90IGhhdmUgYSByZWNpcGllbnQgYW5kIGlzIG1vcmUgZ2FzLWVmZmljaWVudCBjb21wYXJlZCB0byB1c2luZyBhbnkg" +
- "b3RoZXIgbWVzc2FnZS1zZW5kaW5nIGZ1bmN0aW9ucyBvZiBUYWN0LgovLy8KLy8vIFRoZSBtZXNzYWdlIGlzIHNlbnQgd2l0aCB0aGUgZGVmYXVsdCBtb2RlOiBgU2Vu" +
- "ZERlZmF1bHRNb2RlYCAoMCkuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgZW1pdCgiQ2F0Y2ggbWUgaWYgeW91IGNhbiwgTXIuIEhv" +
- "bG1lcyIuYXNDb21tZW50KCkpOyAvLyBhc0NvbW1lbnQoKSBjb252ZXJ0cyBhIFN0cmluZyB0byBhIENlbGwKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBj" +
- "b2RlcwovLy8KLy8vICogMzM6IFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBt" +
- "ZXNzYWdlcy4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjZW1pdAovLy8KLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28g" +
- "bG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8KaW5saW5lIGZ1biBlbWl0KGJvZHk6IENlbGwpIHsKICAgIC8vIGV4" +
- "dF9vdXRfbXNnX2luZm8kMTEgc3JjOk1zZ0FkZHJlc3NJbnQgZGVzdDpNc2dBZGRyZXNzRXh0IGNyZWF0ZWRfbHQ6dWludDY0IGNyZWF0ZWRfYXQ6dWludDMyCiAgICAv" +
- "LyAgICAgICAgICAgICAgICAgICAgIG1heWJlOiBzdGF0ZUluaXQgKGZhbHNlKSBib2R5UmVmOiBib29sICh0cnVlKQogICAgbGV0IGM6IENlbGwgPSBiZWdpbkNlbGwo" +
- "KQogICAgICAgIC5zdG9yZVVpbnQoMTUyMTE4MDcyMDI3Mzg3NTI4MTc5NjA0Mzg0NjQ1MTMsIDEwNCkKICAgICAgICAuc3RvcmVSZWYoYm9keSkKICAgICAgICAuZW5k" +
- "Q2VsbCgpOwogICAgc2VuZFJhd01lc3NhZ2UoYywgMCk7Cn0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uCi8vLwovLy8gQWdyZWVzIHRvIGJ1eSBzb21lIGdhcyB0byBmaW5p" +
- "c2ggdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gYnkgc2V0dGluZyB0aGUgYGdhc19saW1pdGAgdG8gaXRzIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBvZiAyXjYzIC0gMSBh" +
- "bmQgcmVzZXR0aW5nIHRoZSBgZ2FzX2NyZWRpdGAgdG8gMC4gVGhpcyBhY3Rpb24gaXMgcmVxdWlyZWQgdG8gcHJvY2VzcyBleHRlcm5hbCBtZXNzYWdlcywgd2hpY2gg" +
- "YnJpbmcgbm8gdmFsdWUgKGhlbmNlIG5vIGdhcykgd2l0aCB0aGVtc2VsdmVzLgovLy8KLy8vIGBgYHRhY3QKLy8vIGNvbnRyYWN0IFRpbWVvdXQgewovLy8gICAgIHRp" +
- "bWVvdXQ6IEludDsKLy8vCi8vLyAgICAgaW5pdCgpIHsKLy8vICAgICAgICAgc2VsZi50aW1lb3V0ID0gbm93KCkgKyA1ICogNjA7IC8vIDUgbWludXRlcyBmcm9tIG5v" +
- "dwovLy8gICAgIH0KLy8vCi8vLyAgICAgZXh0ZXJuYWwoInRpbWVvdXQiKSB7Ci8vLyAgICAgICAgIGlmIChub3coKSA+IHNlbGYudGltZW91dCkgewovLy8gICAgICAg" +
- "ICAgICAgYWNjZXB0TWVzc2FnZSgpOyAvLyBzdGFydCBhY2NlcHRpbmcgZXh0ZXJuYWwgbWVzc2FnZXMgb25jZSB0aW1lb3V0IHdlbnQgb3V0Ci8vLyAgICAgICAgIH0K" +
- "Ly8vICAgICB9Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWdhcyNhY2NlcHRtZXNzYWdlCi8vLwph" +
- "c20gZnVuIGFjY2VwdE1lc3NhZ2UoKSB7IEFDQ0VQVCB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLgovLy8KLy8vIENvbW1pdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgcmVn" +
- "aXN0ZXJzIGBjNGAgKHBlcnNpc3RlbnQgZGF0YSkgYW5kIGBjNWAgKGFjdGlvbnMpLCBzbyB0aGF0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBpcyBjb25zaWRlcmVkICJz" +
- "dWNjZXNzZnVsIiB3aXRoIHRoZSBzYXZlZCB2YWx1ZXMgZXZlbiBpZiBhbiBleGNlcHRpb24gaW4gY29tcHV0ZSBwaGFzZSBpcyB0aHJvd24gbGF0ZXIuCi8vLwovLy8g" +
- "YGBgdGFjdAovLy8gY29udHJhY3QgV2FsbGV0VjQoCi8vLyAgICAgc2Vxbm86IEludCBhcyB1aW50MzIsCi8vLyAgICAgLy8gLi4ub3RoZXIgcGFyYW1ldGVycy4uLgov" +
- "Ly8gKSB7Ci8vLyAgICAgLy8gLi4uCi8vLyAgICAgZXh0ZXJuYWwoXzogU2xpY2UpIHsKLy8vICAgICAgICAgLy8gLi4udmFyaW91cyBwcmlvciBjaGVja3MuLi4KLy8v" +
- "Ci8vLyAgICAgICAgIGFjY2VwdE1lc3NhZ2UoKTsKLy8vICAgICAgICAgc2VsZi5zZXFubyArPSAxOwovLy8gICAgICAgICBzZXREYXRhKHNlbGYudG9DZWxsKCkpOwov" +
- "Ly8gICAgICAgICBjb21taXQoKTsgLy8gIG5vdywgdHJhbnNhY3Rpb24gaXMgY29uc2lkZXJlZCAic3VjY2Vzc2Z1bCIKLy8vICAgICAgICAgdGhyb3coNDIpOyAvLyBh" +
- "bmQgdGhpcyB3b24ndCBmYWlsIGl0Ci8vLyAgICAgfQovLy8gfQovLy8KLy8vIGFzbSBmdW4gc2V0RGF0YShkYXRhOiBDZWxsKSB7IGM0IFBPUCB9Ci8vLyBgYGAKLy8v" +
- "Ci8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNvbnRleHRzdGF0ZSNjb21taXQKLy8vCmFzbSBmdW4gY29tbWl0KCkgeyBDT01NSVQg" +
- "fQo=";
+ "dWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNtZXNzYWdl" +
+ "Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svbWVzc2FnZS1tb2RlCi8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9k" +
+ "b2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwpleHRlbmRzIGlubGluZSBmdW4gc2VuZChzZWxmOiBNZXNzYWdlUGFyYW1ldGVycykgewogICAg" +
+ "bWVzc2FnZShzZWxmKTsKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gUXVldWVzIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdXNpbmcgYSBgU2VuZFBhcmFtZXRlcnNgIHN0" +
+ "cnVjdC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBTZW5kUGFyYW1ldGVyc3sKLy8vICAgICAgICAgdG86IHNlbmRlcigpLCAgICAv" +
+ "LyBiYWNrIHRvIHRoZSBzZW5kZXIsCi8vLyAgICAgICAgIHZhbHVlOiB0b24oIjEiKSwgLy8gd2l0aCAxIFRvbmNvaW4gKDFfMDAwXzAwMF8wMDAgbmFub1RvbmNvaW4p" +
+ "LAovLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBubyBtZXNzYWdlIGJvZHkKLy8vICAgICB9LnNlbmQoKQovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMj" +
+ "IyBFeGl0IGNvZGVzCi8vLwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRo" +
+ "YW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNzZW5kCi8vLwovLy8gW0FjdGlvbiBsaXN0" +
+ "IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwphc20gZnVuIHNlbmQocGFyYW1zOiBTZW5kUGFyYW1l" +
+ "dGVycykgewogICAgLy8gSW5zdHJ1Y3Rpb25zIGFyZSBncm91cGVkLCBhbmQgdGhlIHN0YWNrIHN0YXRlcyB0aGV5IHByb2R1Y2UgYXMgYSBncm91cCBhcmUgc2hvd24g" +
+ "cmlnaHQgYWZ0ZXIuCiAgICAvLyBJbiB0aGUgZW5kLCBvdXIgbWVzc2FnZSBDZWxsIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgVEwtQiBzdHJ1Y3R1cmU6CiAgICAv" +
+ "LyBtZXNzYWdlJF8ge1g6VHlwZX0KICAgIC8vICAgaW5mbzpDb21tb25Nc2dJbmZvUmVsYXhlZAogICAgLy8gICBpbml0OihNYXliZSAoRWl0aGVyIFN0YXRlSW5pdCBe" +
+ "U3RhdGVJbml0KSkKICAgIC8vICAgYm9keTooRWl0aGVyIFggXlgpCiAgICAvLyA9IE1lc3NhZ2VSZWxheGVkIFg7CgogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAv" +
+ "LyBzMDogYHBhcmFtcy5ib3VuY2VgCiAgICAvLyBzMTogYHBhcmFtcy50b2AKICAgIC8vIHMyOiBgcGFyYW1zLnZhbHVlYAogICAgLy8gczM6IGBwYXJhbXMuZGF0YWAK" +
+ "ICAgIC8vIHM0OiBgcGFyYW1zLmNvZGVgCiAgICAvLyBzNTogYHBhcmFtcy5ib2R5YAogICAgLy8gczY6IGBwYXJhbXMubW9kZWAKICAgIC8vIEZvciBicmV2aXR5LCB0" +
+ "aGUgInBhcmFtcyIgcHJlZml4IHdpbGwgYmUgb21pdHRlZCBmcm9tIG5vdyBvbi4KCiAgICAvLyBHcm91cCAxOiBTdG9yaW5nIHRoZSBgYm91bmNlYCwgYHRvYCBhbmQg" +
+ "YHZhbHVlYCBpbnRvIGEgQnVpbGRlcgogICAgTkVXQwogICAgYnswMX0gU1RTTElDRUNPTlNUICAvLyBzdG9yZSB0YWcgPSAkMCBhbmQgaWhyX2Rpc2FibGVkID0gdHJ1" +
+ "ZQogICAgMSBTVEkgICAgICAgICAgICAgICAvLyBzdG9yZSBgYm91bmNlYAogICAgYnswMDB9IFNUU0xJQ0VDT05TVCAvLyBzdG9yZSBib3VuY2VkID0gZmFsc2UgYW5k" +
+ "IHNyYyA9IGFkZHJfbm9uZQogICAgU1RTTElDRSAgICAgICAgICAgICAvLyBzdG9yZSBgdG9gCiAgICBTV0FQCiAgICBTVEdSQU1TICAgICAgICAgICAgIC8vIHN0b3Jl" +
+ "IGB2YWx1ZWAKICAgIDEwNSBQVVNISU5UICAgICAgICAgLy8gMSArIDQgKyA0ICsgNjQgKyAzMgogICAgU1RaRVJPRVMgICAgICAgICAgICAvLyBzdG9yZSBjdXJyZW5j" +
+ "eV9jb2xsZWN0aW9uLCBpaHJfZmVlLCBmd2RfZmVlLCBjcmVhdGVkX2x0IGFuZCBjcmVhdGVkX2F0CiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBCdWls" +
+ "ZGVyCiAgICAvLyBzMTogYGRhdGFgCiAgICAvLyBzMjogYGNvZGVgCiAgICAvLyBzMzogYGJvZHlgCiAgICAvLyBzNDogYG1vZGVgCgogICAgLy8gR3JvdXAgMjogUGxh" +
+ "Y2luZyB0aGUgQnVpbGRlciBhZnRlciBjb2RlIGFuZCBkYXRhLCB0aGVuIGNoZWNraW5nIHRob3NlIGZvciBudWxsYWJpbGl0eQogICAgczIgWENIRzAKICAgIERVUDIK" +
+ "ICAgIElTTlVMTAogICAgU1dBUAogICAgSVNOVUxMCiAgICBBTkQKICAgIC8vIOKGkiBTdGFjayBzdGF0ZQogICAgLy8gczA6IC0xICh0cnVlKSBpZiBgZGF0YWAgYW5k" +
+ "IGBjb2RlYCBhcmUgYm90aCBudWxsLCAwIChmYWxzZSkgb3RoZXJ3aXNlCiAgICAvLyBzMTogYGNvZGVgCiAgICAvLyBzMjogYGRhdGFgCiAgICAvLyBzMzogQnVpbGRl" +
+ "cgogICAgLy8gczQ6IGBib2R5YAogICAgLy8gczU6IGBtb2RlYAoKICAgIC8vIEdyb3VwIDM6IExlZnQgYnJhbmNoIG9mIHRoZSBJRkVMU0UsIGV4ZWN1dGVkIGlmIHMw" +
+ "IGlzIC0xICh0cnVlKQogICAgPHsKICAgICAgICBEUk9QMiAvLyBkcm9wIGBkYXRhYCBhbmQgYGNvZGVgLCBzaW5jZSBlaXRoZXIgb2YgdGhvc2UgaXMgbnVsbAogICAg" +
+ "ICAgIGJ7MH0gU1RTTElDRUNPTlNUCiAgICB9PiBQVVNIQ09OVAoKICAgIC8vIEdyb3VwIDM6IFJpZ2h0IGJyYW5jaCBvZiB0aGUgSUZFTFNFLCBleGVjdXRlZCBpZiBz" +
+ "MCBpcyAwIChmYWxzZSkKICAgIDx7CiAgICAgICAgLy8gXyBzcGxpdF9kZXB0aDooTWF5YmUgKCMjIDUpKQogICAgICAgIC8vICAgc3BlY2lhbDooTWF5YmUgVGlja1Rv" +
+ "Y2spCiAgICAgICAgLy8gICBjb2RlOihNYXliZSBeQ2VsbCkKICAgICAgICAvLyAgIGRhdGE6KE1heWJlIF5DZWxsKQogICAgICAgIC8vICAgbGlicmFyeTooTWF5YmUg" +
+ "XkNlbGwpCiAgICAgICAgLy8gPSBTdGF0ZUluaXQ7CiAgICAgICAgUk9UICAgICAgICAgICAgICAgIC8vIHBsYWNlIG1lc3NhZ2UgQnVpbGRlciBvbiB0b3AKICAgICAg" +
+ "ICBiezEwfSBTVFNMSUNFQ09OU1QgLy8gc3RvcmUgTWF5YmUgPSB0cnVlLCBFaXRoZXIgPSBmYWxzZQogICAgICAgIC8vIFN0YXJ0IGNvbXBvc2luZyBpbmxpbmVkIFN0" +
+ "YXRlSW5pdAogICAgICAgIGJ7MDB9IFNUU0xJQ0VDT05TVCAvLyBzdG9yZSBzcGxpdF9kZXB0aCBhbmQgc3BlY2lhbCBmaXJzdAogICAgICAgIFNURElDVCAgICAgICAg" +
+ "ICAgICAvLyBzdG9yZSBjb2RlCiAgICAgICAgU1RESUNUICAgICAgICAgICAgIC8vIHN0b3JlIGRhdGEKICAgICAgICBiezB9IFNUU0xJQ0VDT05TVCAgLy8gc3RvcmUg" +
+ "bGlicmFyeQogICAgfT4gUFVTSENPTlQKCiAgICAvLyBHcm91cCAzOiBJRkVMU0UgdGhhdCBkb2VzIHRoZSBicmFuY2hpbmcgc2hvd24gYWJvdmUKICAgIElGRUxTRQog" +
+ "ICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQnVpbGRlcgogICAgLy8gczE6IG51bGwgb3IgU3RhdGVJbml0CiAgICAvLyBzMjogYGJvZHlgCiAgICAvLyBz" +
+ "MzogYG1vZGVgCgogICAgLy8gR3JvdXAgNDogRmluYWxpemluZyB0aGUgbWVzc2FnZQogICAgU1RESUNUIC8vIHN0b3JlIGBib2R5YCBhcyByZWYgd2l0aCBhbiBleHRy" +
+ "YSBNYXliZSBiaXQsIHNpbmNlIGBib2R5YCBtaWdodCBiZSBudWxsCiAgICBFTkRDCiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBDZWxsCiAgICAvLyBz" +
+ "MTogYG1vZGVgCgogICAgLy8gR3JvdXAgNTogU2VuZGluZyB0aGUgbWVzc2FnZSwgd2l0aCBgbW9kZWAgb24gdG9wCiAgICBTV0FQCiAgICBTRU5EUkFXTVNHIC8vIGh0" +
+ "dHBzOi8vZ2l0aHViLmNvbS90YWN0LWxhbmcvdGFjdC9pc3N1ZXMvMTU1OAp9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNlbmRQYXJhbWV0ZXJzYCBz" +
+ "dHJ1Y3QuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNy4wLgovLy8KLy8vIFF1ZXVlcyB0aGUgbWVzc2FnZSB0byBiZSBzZW50IHVzaW5nIGEgYFNlbmRQYXJhbWV0ZXJz" +
+ "YCBzdHJ1Y3QuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgU2VuZFBhcmFtZXRlcnN7Ci8vLyAgICAgICAgIHRvOiBzZW5kZXIoKSwg" +
+ "ICAgLy8gYmFjayB0byB0aGUgc2VuZGVyLAovLy8gICAgICAgICB2YWx1ZTogdG9uKCIxIiksIC8vIHdpdGggMSBUb25jb2luICgxXzAwMF8wMDBfMDAwIG5hbm9Ub25j" +
+ "b2luKSwKLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm8gbWVzc2FnZSBib2R5Ci8vLyAgICAgfS5zZW5kKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8v" +
+ "LyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVlIG1v" +
+ "cmUgdGhhbiAyNTUgbWVzc2FnZXMuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmQKLy8vCi8vLyBbQWN0aW9u" +
+ "IGxpc3QgaXMgdG9vIGxvbmddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjMzMKLy8vCmV4dGVuZHMgaW5saW5lIGZ1biBzZW5kKHNl" +
+ "bGY6IFNlbmRQYXJhbWV0ZXJzKSB7CiAgICBzZW5kKHNlbGYpOwp9CgovLy8gU3RydWN0IGZvciBzcGVjaWZ5aW5nIHRoZSBkZXBsb3ltZW50IG1lc3NhZ2UgcGFyYW1l" +
+ "dGVycyBvZiB0aGUgYGRlcGxveSgpYCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5n" +
+ "Lm9yZy9yZWYvY29yZS1zZW5kI2RlcGxveQovLy8Kc3RydWN0IERlcGxveVBhcmFtZXRlcnMgewogICAgLy8vIEFuIDgtYml0IHZhbHVlIHRoYXQgY29uZmlndXJlcyBo" +
+ "b3cgdG8gc2VuZCBhIG1lc3NhZ2UsIGRlZmF1bHRzIHRvIDAuCiAgICAvLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL21lc3NhZ2UtbW9kZQog" +
+ "ICAgbW9kZTogSW50ID0gU2VuZERlZmF1bHRNb2RlOwoKICAgIC8vLyBPcHRpb25hbCBtZXNzYWdlIGJvZHkgYXMgYSBgQ2VsbGAuCiAgICBib2R5OiBDZWxsPyA9IG51" +
+ "bGw7CgogICAgLy8vIFRoZSBhbW91bnQgb2YgbmFub1RvbmNvaW5zIHlvdSB3YW50IHRvIHNlbmQgd2l0aAogICAgLy8vIHRoZSBtZXNzYWdlLiBUaGlzIHZhbHVlIGlz" +
+ "IHVzZWQgdG8gY292ZXIgZm9yd2FyZCBmZWVzLAogICAgLy8vIHVubGVzcyB0aGUgb3B0aW9uYWwgZmxhZyBgU2VuZFBheUZ3ZEZlZXNTZXBhcmF0ZWx5YCBpcyB1c2Vk" +
+ "LgogICAgdmFsdWU6IEludDsKCiAgICAvLy8gV2hlbiBzZXQgdG8gYHRydWVgIChkZWZhdWx0KSBtZXNzYWdlIGJvdW5jZXMgYmFjayB0byB0aGUgc2VuZGVyIGlmCiAg" +
+ "ICAvLy8gdGhlIHJlY2lwaWVudCBjb250cmFjdCBkb2Vzbid0IGV4aXN0IG9yIHdhc24ndCBhYmxlIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UuCiAgICBib3VuY2U6IEJv" +
+ "b2wgPSB0cnVlOwoKICAgIC8vLyBJbml0aWFsIHBhY2thZ2Ugb2YgdGhlIGNvbnRyYWN0IChpbml0aWFsIGNvZGUgYW5kIGluaXRpYWwgZGF0YSkuCiAgICAvLy8gU2Vl" +
+ "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4cHJlc3Npb25zI2luaXRvZgogICAgaW5pdDogU3RhdGVJbml0Owp9CgovLy8gR2xvYmFsIGZ1bmN0aW9u" +
+ "LiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBRdWV1ZXMgdGhlIGNvbnRyYWN0IGRlcGxveW1lbnQgbWVzc2FnZSB0byBiZSBzZW50IHVzaW5nIHRo" +
+ "ZSBgRGVwbG95UGFyYW1ldGVyc2Agc3RydWN0LiBBbGxvd3MgZm9yIGNoZWFwZXIgb24tY2hhaW4gZGVwbG95bWVudHMgY29tcGFyZWQgdG8gdGhlIGBzZW5kKClgIGZ1" +
+ "bmN0aW9uLgovLy8KLy8vIFRoZSBgRGVwbG95UGFyYW1ldGVyc2Agc3RydWN0IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzOgovLy8gKiBgbW9kZTogSW50" +
+ "YCwgYW4gOC1iaXQgdmFsdWUgdGhhdCBjb25maWd1cmVzIGhvdyB0byBzZW5kIGEgbWVzc2FnZSwgZGVmYXVsdHMgdG8gMC4KLy8vICogYGJvZHk6IENlbGw/YCwgb3B0" +
+ "aW9uYWwgbWVzc2FnZSBib2R5IGFzIGEgYENlbGxgLgovLy8gKiBgdmFsdWU6IEludGAsIHRoZSBhbW91bnQgb2YgbmFub1RvbmNvaW5zIHlvdSB3YW50IHRvIHNlbmQg" +
+ "d2l0aCB0aGUgbWVzc2FnZS4KLy8vICAgVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGNvdmVyIGZvcndhcmQgZmVlcywgdW5sZXNzIHRoZSBvcHRpb25hbCBmbGFnIGBTZW5k" +
+ "UGF5RndkRmVlc1NlcGFyYXRlbHlgIGlzIHVzZWQuCi8vLyAqIGBib3VuY2U6IEJvb2xgLCB3aGVuIHNldCB0byBgdHJ1ZWAgKGRlZmF1bHQpIG1lc3NhZ2UgYm91bmNl" +
+ "cyBiYWNrIHRvIHRoZSBzZW5kZXIKLy8vICAgIGlmIHRoZSByZWNpcGllbnQgY29udHJhY3QgZG9lc24ndCBleGlzdCBvciB3YXNuJ3QgYWJsZSB0byBwcm9jZXNzIHRo" +
+ "ZSBtZXNzYWdlLgovLy8gKiBgaW5pdDogU3RhdGVJbml0YCwgaW5pdCBwYWNrYWdlIG9mIHRoZSBjb250cmFjdCAoaW5pdGlhbCBjb2RlIGFuZCBpbml0aWFsIGRhdGEp" +
+ "LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIERlcGxveVBhcmFtZXRlcnN7Ci8vLyAgICAgICAgIGluaXQ6IGluaXRPZiBTb21lQ29u" +
+ "dHJhY3QoKSwgLy8gd2l0aCBpbml0aWFsIGNvZGUgYW5kIGRhdGEgb2YgU29tZUNvbnRyYWN0Ci8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg" +
+ "Ly8gYW5kIG5vIGFkZGl0aW9uYWwgbWVzc2FnZSBib2R5Ci8vLyAgICAgICAgIG1vZGU6IFNlbmRJZ25vcmVFcnJvcnMsICAgICAgLy8gc2tpcCB0aGUgbWVzc2FnZSBp" +
+ "biBjYXNlIG9mIGVycm9ycwovLy8gICAgICAgICB2YWx1ZTogdG9uKCIxIiksICAgICAgICAgICAgIC8vIHNlbmQgMSBUb25jb2luICgxXzAwMF8wMDBfMDAwIG5hbm9U" +
+ "b25jb2luKQovLy8gICAgIH0uc2VuZCgpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRv" +
+ "byBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9k" +
+ "b2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNkZXBsb3kKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9tZXNzYWdlLW1vZGUKLy8vCi8v" +
+ "LyBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjMzMKLy8vCmFzbSBmdW4gZGVwbG95KHBh" +
+ "cmFtczogRGVwbG95UGFyYW1ldGVycykgewogICAgLy8gSW5zdHJ1Y3Rpb25zIGFyZSBncm91cGVkLCBhbmQgdGhlIHN0YWNrIHN0YXRlcyB0aGV5IHByb2R1Y2UgYXMg" +
+ "YSBncm91cCBhcmUgc2hvd24gcmlnaHQgYWZ0ZXIuCiAgICAvLwogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogYHBhcmFtcy5pbml0LmRhdGFgCiAgICAv" +
+ "LyBzMTogYHBhcmFtcy5pbml0LmNvZGVgCiAgICAvLyBzMjogYHBhcmFtcy5ib3VuY2VgCiAgICAvLyBzMzogYHBhcmFtcy52YWx1ZWAKICAgIC8vIHM0OiBgcGFyYW1z" +
+ "LmJvZHlgCiAgICAvLyBzNTogYHBhcmFtcy5tb2RlYAogICAgLy8gRm9yIGJyZXZpdHksIHRoZSAicGFyYW1zIiBwcmVmaXggd2lsbCBiZSBvbWl0dGVkIGZyb20gbm93" +
+ "IG9uLgoKICAgIC8vIEdyb3VwIDE6IFByZXBhcmF0aW9uIG9mIG5lZWRlZCBwYXJhbXMKICAgIC8vIEZvciBhbG1vc3QgaWRlbnRpY2FsIGxvZ2ljIGFuZCBpbnN0cnVj" +
+ "dGlvbnMsCiAgICAvLyBzZWUgY29tbWVudHMgaW5zaWRlIGBjb250cmFjdEhhc2goKWAgZnVuY3Rpb24gaW4gY29udHJhY3QudGFjdAogICAgNCAxIEJMS1BVU0ggLy8g" +
+ "cHVzaGVzIDIgY29waWVzIG9mIGBpbml0LmNvZGVgIGFuZCBgaW5pdC5kYXRhYAogICAgSEFTSENVIC8vIGBpbml0LmRhdGFgIGhhc2gKICAgIFNXQVAKICAgIEhBU0hD" +
+ "VSAvLyBgaW5pdC5jb2RlYCBoYXNoCiAgICBTV0FQMgogICAgQ0RFUFRIIC8vIGBpbml0LmRhdGFgIGRlcHRoCiAgICBTV0FQCiAgICBDREVQVEggLy8gYGluaXQuY29k" +
+ "ZWAgZGVwdGgKCiAgICAvLyBHcm91cCAyOiBDYWxjdWxhdGluZyBkZXN0aW5hdGlvbiBhZGRyZXNzCiAgICAvLyBGb3IgYWxtb3N0IGlkZW50aWNhbCBsb2dpYyBhbmQg" +
+ "aW5zdHJ1Y3Rpb25zLAogICAgLy8gc2VlIGNvbW1lbnRzIGluc2lkZSBgY29udHJhY3RIYXNoKClgIGZ1bmN0aW9uIGluIGNvbnRyYWN0LnRhY3QKICAgIDEzMTM4MCBJ" +
+ "TlQgLy8gKDIgPDwgMTYpIHwgKDEgPDwgOCkgfCAweDM0CiAgICBORVdDCiAgICAyNCBTVFUKICAgIDE2IFNUVQogICAgMTYgU1RVCiAgICAyNTYgU1RVCiAgICAyNTYg" +
+ "U1RVCiAgICBPTkUgSEFTSEVYVF9TSEEyNTYgLy8gb2J0YWlucyBoYXNoIHBhcnQgKGFjY291bnQgaWQpIG9mIHRoZSBhZGRyZXNzCiAgICAvLyDihpIgU3RhY2sgc3Rh" +
+ "dGUKICAgIC8vIHMwOiBkZXN0QWRkcihoYXNoIHBhcnQpCiAgICAvLyBzMTogYGluaXQuZGF0YWAKICAgIC8vIHMyOiBgaW5pdC5jb2RlYAogICAgLy8gczMgYW5kIGJl" +
+ "bG93OiBgYm91bmNlYCwgYHZhbHVlYCwgYGJvZHlgLCBgbW9kZWAKCiAgICAvLyBHcm91cCAzOiBCdWlsZGluZyBhIG1lc3NhZ2UgKENvbW1vbk1zZ0luZm9SZWxheGVk" +
+ "KQogICAgczMgWENIRzAgICAgICAgICAgIC8vIHN3YXBzIGBib3VuY2VgIHdpdGggZGVzdEFkZHIoaGFzaCBwYXJ0KQogICAgTkVXQwogICAgYnswMX0gU1RTTElDRUNP" +
+ "TlNUIC8vIHN0b3JlIHRhZyA9ICQwIGFuZCBpaHJfZGlzYWJsZWQgPSB0cnVlCiAgICAxIFNUSSAgICAgICAgICAgICAgLy8gc3RvcmUgYGJvdW5jZWAKICAgIHMxIHMy" +
+ "IFhDSEcgICAgICAgICAvLyBzd2FwIGBpbml0LmRhdGFgIHdpdGggYGluaXQuY29kZWAsIHBsYWNpbmcgY29kZSBvbiBzMQogICAgU1RSRUYgICAgICAgICAgICAgIC8v" +
+ "IHN0b3JlIGBpbml0LmNvZGVgCiAgICBTVFJFRiAgICAgICAgICAgICAgLy8gc3RvcmUgYGluaXQuZGF0YWAKICAgIC8vIElubGluZSBTdGF0ZUluaXQ6CiAgICBiezAw" +
+ "MDEwMDAwMDAwMDAwfSBTVFNMSUNFQ09OU1QKICAgIC8vIDAgKyAwMCArIDEwICsgMCArIDAwMDAwMDAwCiAgICAvLyAxKSAwIC0gYm91bmNlZCA9IGZhbHNlCiAgICAv" +
+ "LyAyKSAwMCAtIHNyYyA9IGFkZHJfbm9uZQogICAgLy8gMykgMTAgLSB0YWcgb2YgYWRkcl9zdGQgKHBhcnQgb2YgZGVzdCkKICAgIC8vIDQpIDAgLSBNYXliZSBBbnlj" +
+ "YXN0ID0gZmFsc2UKICAgIC8vIDUpIDAwMDAwMDAwIC0gd29ya2NoYWluX2lkIChwYXJ0IG9mIGRlc3QpCiAgICAvLwogICAgMjU2IFNUVSAgICAgLy8gc3RvcmUgZGVz" +
+ "dEFkZHIoaGFzaCBwYXJ0KQogICAgU1dBUCAgICAgICAgLy8gQnVpbGRlciBvbiB0b3AsIGB2YWx1ZWAgYmVsb3cKICAgIFNUR1JBTVMgICAgIC8vIHN0b3JlIGB2YWx1" +
+ "ZWAKICAgIDEwNSBQVVNISU5UIC8vIDEgKyA0ICsgNCArIDY0ICsgMzIKICAgIFNUWkVST0VTICAgIC8vIHN0b3JlIGN1cnJlbmN5X2NvbGxlY3Rpb24sIGlocl9mZWUs" +
+ "IGZ3ZF9mZWUsIGNyZWF0ZWRfbHQgYW5kIGNyZWF0ZWRfYXQKCiAgICAvLyBHcm91cCA0OiBDb250aW51ZSBidWlsZGluZyBhIG1lc3NhZ2UgKENvbW1vbk1zZ0luZm9S" +
+ "ZWxheGVkIGludG8gTWVzc2FnZVJlbGF4ZWQpCiAgICAvLyBSZW1haW5pbmcgYml0cyBvZiBNZXNzYWdlUmVsYXhlZDoKICAgIGJ7MTAwMDExMH0gU1RTTElDRUNPTlNU" +
+ "CiAgICAvLyAxMCArIDAgKyAwICsgMSArIDEgKyAwCiAgICAvLyAxMCAtIE1heWJlIChFaXRoZXIgU3RhdGVJbml0IF5TdGF0ZUluaXQpID0gdHJ1ZSBmYWxzZQogICAg" +
+ "Ly8gMCAtIHNwbGl0X2RlcHRoOihNYXliZSAoIyMgNSkpID0gZmFsc2UKICAgIC8vIDAgPSBzcGVjaWFsOihNYXliZSBUaWNrVG9jaykgPSBmYWxzZQogICAgLy8gMSA9" +
+ "IGNvZGU6KE1heWJlIF5DZWxsKSA9IHRydWUKICAgIC8vIDEgPSBkYXRhOihNYXliZSBeQ2VsbCkgPSB0cnVlCiAgICAvLyAwID0gbGlicmFyeTooTWF5YmUgXkNlbGwp" +
+ "ID0gZmFsc2UKICAgIC8vCiAgICBTVERJQ1QgLy8gc3RvcmUgYGJvZHlgIGFzIHJlZiB3aXRoIGFuIGV4dHJhIE1heWJlIGJpdCwgc2luY2UgYGJvZHlgIG1pZ2h0IGJl" +
+ "IG51bGwKICAgIEVOREMgICAvLyBmaW5hbGl6ZSB0aGUgbWVzc2FnZQogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQ2VsbAogICAgLy8gczE6IHBhcmFt" +
+ "cy5gbW9kZWAKCiAgICAvLyBHcm91cCA1OiBTZW5kaW5nIHRoZSBtZXNzYWdlLCB3aXRoIGBtb2RlYCBvbiB0b3AKICAgIFNXQVAKICAgIFNFTkRSQVdNU0cKfQoKLy8v" +
+ "IEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBEZXBsb3lQYXJhbWV0ZXJzYCBzdHJ1Y3QuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNy4wLgovLy8KLy8vIFF1ZXVl" +
+ "cyB0aGUgY29udHJhY3QgZGVwbG95bWVudCBtZXNzYWdlIHRvIGJlIHNlbnQgdXNpbmcgdGhlIGBEZXBsb3lQYXJhbWV0ZXJzYCBzdHJ1Y3QuIEFsbG93cyBmb3IgY2hl" +
+ "YXBlciBvbi1jaGFpbiBkZXBsb3ltZW50cyBjb21wYXJlZCB0byB0aGUgYHNlbmQoKWAgZnVuY3Rpb24uCi8vLwovLy8gVGhlIGBEZXBsb3lQYXJhbWV0ZXJzYCBzdHJ1" +
+ "Y3QgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHM6Ci8vLyAqIGBtb2RlOiBJbnRgLCBhbiA4LWJpdCB2YWx1ZSB0aGF0IGNvbmZpZ3VyZXMgaG93IHRvIHNl" +
+ "bmQgYSBtZXNzYWdlLCBkZWZhdWx0cyB0byAwLgovLy8gKiBgYm9keTogQ2VsbD9gLCBvcHRpb25hbCBtZXNzYWdlIGJvZHkgYXMgYSBgQ2VsbGAuCi8vLyAqIGB2YWx1" +
+ "ZTogSW50YCwgdGhlIGFtb3VudCBvZiBuYW5vVG9uY29pbnMgeW91IHdhbnQgdG8gc2VuZCB3aXRoIHRoZSBtZXNzYWdlLgovLy8gICBUaGlzIHZhbHVlIGlzIHVzZWQg" +
+ "dG8gY292ZXIgZm9yd2FyZCBmZWVzLCB1bmxlc3MgdGhlIG9wdGlvbmFsIGZsYWcgYFNlbmRQYXlGd2RGZWVzU2VwYXJhdGVseWAgaXMgdXNlZC4KLy8vICogYGJvdW5j" +
+ "ZTogQm9vbGAsIHdoZW4gc2V0IHRvIGB0cnVlYCAoZGVmYXVsdCkgbWVzc2FnZSBib3VuY2VzIGJhY2sgdG8gdGhlIHNlbmRlcgovLy8gICAgaWYgdGhlIHJlY2lwaWVu" +
+ "dCBjb250cmFjdCBkb2Vzbid0IGV4aXN0IG9yIHdhc24ndCBhYmxlIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UuCi8vLyAqIGBpbml0OiBTdGF0ZUluaXRgLCBpbml0IHBh" +
+ "Y2thZ2Ugb2YgdGhlIGNvbnRyYWN0IChpbml0aWFsIGNvZGUgYW5kIGluaXRpYWwgZGF0YSkuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAg" +
+ "ICAgRGVwbG95UGFyYW1ldGVyc3sKLy8vICAgICAgICAgaW5pdDogaW5pdE9mIFNvbWVDb250cmFjdCgpLCAvLyB3aXRoIGluaXRpYWwgY29kZSBhbmQgZGF0YSBvZiBT" +
+ "b21lQ29udHJhY3QKLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm8gYWRkaXRpb25hbCBtZXNzYWdlIGJvZHkKLy8vICAgICAg" +
+ "ICAgbW9kZTogU2VuZElnbm9yZUVycm9ycywgICAgICAvLyBza2lwIHRoZSBtZXNzYWdlIGluIGNhc2Ugb2YgZXJyb3JzCi8vLyAgICAgICAgIHZhbHVlOiB0b24oIjEi" +
+ "KSwgICAgICAgICAgICAgLy8gc2VuZCAxIFRvbmNvaW4gKDFfMDAwXzAwMF8wMDAgbmFub1RvbmNvaW4pCi8vLyAgICAgfS5zZW5kKCk7Ci8vLyB9Ci8vLyBgYGAKLy8v" +
+ "Ci8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVl" +
+ "IG1vcmUgdGhhbiAyNTUgbWVzc2FnZXMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI2RlcGxveQovLy8g" +
+ "KiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL21lc3NhZ2UtbW9kZQovLy8KLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ106IGh0dHBzOi8vZG9jcy50" +
+ "YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8KZXh0ZW5kcyBpbmxpbmUgZnVuIHNlbmQoc2VsZjogRGVwbG95UGFyYW1ldGVycykgewogICAgZGVwbG95" +
+ "KHNlbGYpOwp9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMS4KLy8vCi8vLyBRdWV1ZXMgYW4gZW1wdHkgbWVzc2FnZSB0byBi" +
+ "ZSBzZW50IHdpdGggdGhlIGBTZW5kUmVtYWluaW5nVmFsdWVgIG1vZGUgYW5kIHRoZSBgU2VuZElnbm9yZUVycm9yc2AgZmxhZyB0byB0aGUgZGVzdGluYXRpb24gYWRk" +
+ "cmVzcyBgdG9gLgovLy8gVGhpcyBpcyB0aGUgbW9zdCBnYXMtZWZmaWNpZW50IHdheSB0byBzZW5kIHRoZSByZW1haW5pbmcgdmFsdWUgZnJvbSB0aGUgaW5jb21pbmcg" +
+ "bWVzc2FnZSB0byB0aGUgZ2l2ZW4gYWRkcmVzcy4KLy8vCi8vLyBUaGlzIGZ1bmN0aW9uIHdvbid0IGZvcndhcmQgZXhjZXNzIHZhbHVlcyBpZiBhbnkgb3RoZXIgbWVz" +
+ "c2FnZS1zZW5kaW5nIGZ1bmN0aW9ucyB3ZXJlIGNhbGxlZCBpbiB0aGUgc2FtZSByZWNlaXZlciBiZWZvcmUuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGVz" +
+ "KCkgewovLy8gICAgIC8vIEZvcndhcmQgdGhlIHJlbWFpbmluZyB2YWx1ZSBiYWNrIHRvIHRoZSBzZW5kZXIKLy8vICAgICBjYXNoYmFjayhzZW5kZXIoKSk7Ci8vLwov" +
+ "Ly8gICAgIC8vIFRoZSBjYXNoYmFjaygpIGZ1bmN0aW9uIGFib3ZlIGlzIGNoZWFwZXIsIGJ1dCBmdW5jdGlvbmFsbHkKLy8vICAgICAvLyBlcXVpdmFsZW50IHRvIHRo" +
+ "ZSBmb2xsb3dpbmcgY2FsbCB0byB0aGUgbWVzc2FnZSgpIGZ1bmN0aW9uCi8vLyAgICAgTWVzc2FnZVBhcmFtZXRlcnN7Ci8vLyAgICAgICAgIG1vZGU6IFNlbmRSZW1h" +
+ "aW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJvcnMsCi8vLyAgICAgICAgIGJvZHk6IG51bGwsCi8vLyAgICAgICAgIHZhbHVlOiAwLAovLy8gICAgICAgICB0bzogc2Vu" +
+ "ZGVyKCksCi8vLyAgICAgICAgIGJvdW5jZTogZmFsc2UsCi8vLyAgICAgfS5zZW5kKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8v" +
+ "LyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVlIG1vcmUgdGhhbiAyNTUgbWVzc2FnZXMuCi8v" +
+ "LwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI2Nhc2hiYWNrCi8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTog" +
+ "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwphc20gZnVuIGNhc2hiYWNrKHRvOiBBZGRyZXNzKSB7CiAgICBORVdDCiAgICB4" +
+ "ezQyX30gU1RTTElDRUNPTlNUIC8vIC5zdG9yZVVpbnQoMHgxMCwgNikKICAgIFNUU0xJQ0UgICAgICAgICAgLy8gLnN0b3JlQWRkcmVzcyh0bykKICAgIDAgUFVTSElO" +
+ "VCAgICAgICAgLy8gMAogICAgMTExIFNUVVIgICAgICAgICAvLyAuc3RvcmVVaW50KDAsIDExMSkKICAgICAgICAgICAgICAgICAgICAgLy8gNCB6ZXJvcyBmb3IgY29p" +
+ "bnMgYW5kIDEwNyB6ZXJvcyBmb3IgbHQsIGZlZXMsIGV0Yy4KICAgIEVOREMKICAgIDY2IFBVU0hJTlQgICAgICAgLy8gU2VuZFJlbWFpbmluZ1ZhbHVlIHwgU2VuZEln" +
+ "bm9yZUVycm9ycwogICAgU0VORFJBV01TRwp9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiAqKkRlcHJlY2F0ZWQqKiBzaW5jZSBUYWN0IDEuNi42LiBVc2UgYHNlbmRSYXdN" +
+ "ZXNzYWdlKClgIGluc3RlYWQuCi8vLwovLy8gUXVldWVzIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgYnkgc3BlY2lmeWluZyB0aGUgY29tcGxldGUgYG1zZ2AgY2VsbCBh" +
+ "bmQgdGhlIG1lc3NhZ2UgYG1vZGVgLgovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogMzM6IFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRocm93" +
+ "biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBtZXNzYWdlcy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" +
+ "L3JlZi9jb3JlLXNlbmQjc2VuZHJhd21lc3NhZ2UKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNuYXRpdmVzZW5kbWVzc2FnZQov" +
+ "Ly8KLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8KYXNtIGZ1biBuYXRp" +
+ "dmVTZW5kTWVzc2FnZShtc2c6IENlbGwsIG1vZGU6IEludCkgeyBTRU5EUkFXTVNHIH0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEu" +
+ "Ni42LgovLy8KLy8vIFF1ZXVlcyB0aGUgbWVzc2FnZSB0byBiZSBzZW50IGJ5IHNwZWNpZnlpbmcgdGhlIGNvbXBsZXRlIGBtc2dgIGNlbGwgYW5kIHRoZSBtZXNzYWdl" +
+ "IGBtb2RlYC4KLy8vCi8vLyBQcmVmZXIgdXNpbmcgdGhlIG1vcmUgdXNlci1mcmllbmRseSBgbWVzc2FnZSgpYCwgYGRlcGxveSgpYCwgb3IgYHNlbmQoKWAgZnVuY3Rp" +
+ "b25zIHVubGVzcyB5b3UgaGF2ZSBhIGNvbXBsZXggbG9naWMgdGhhdCBjYW5ub3QgYmUgZXhwcmVzc2VkIG90aGVyd2lzZS4KLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMK" +
+ "Ly8vCi8vLyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVlIG1vcmUgdGhhbiAyNTUgbWVzc2Fn" +
+ "ZXMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmRyYXdtZXNzYWdlCi8vLyAqIGh0dHBzOi8vZG9j" +
+ "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjbWVzc2FnZQovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI2RlcGxveQovLy8g" +
+ "KiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmQKLy8vCi8vLyBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddOiBodHRwczovL2RvY3Mu" +
+ "dGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjMzMKLy8vCmFzbSBmdW4gc2VuZFJhd01lc3NhZ2UobXNnOiBDZWxsLCBtb2RlOiBJbnQpIHsgU0VORFJBV01TRyB9" +
+ "CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiAqKkRlcHJlY2F0ZWQqKiBzaW5jZSBUYWN0IDEuNi42LiBVc2UgYHNlbmRSYXdNZXNzYWdlUmV0dXJuRm9yd2FyZEZlZSgpYCBp" +
+ "bnN0ZWFkLgovLy8KLy8vIFNpbWlsYXIgdG8gYHNlbmRSYXdNZXNzYWdlKClgLCBidXQgYWxzbyBjYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBmb3J3YXJkIGZlZSBp" +
+ "biBuYW5vVG9uY29pbi4KLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6IFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV0gLSBUaHJvd24gaWYg" +
+ "dGhlIG1lc3NhZ2UgbW9kZSBpcyBpbnZhbGlkLgovLy8gKiA3OiBbVHlwZSBjaGVjayBlcnJvcl0gLSBUaHJvd24gaWYgYW55IG9mIHRoZSBibG9ja2NoYWluIGNvbmZp" +
+ "ZywgY29udHJhY3QgYmFsYW5jZSBvciBpbmNvbWluZyBtZXNzYWdlIHZhbHVlIGFyZSBpbnZhbGlkLgovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIC0gVGhyb3duIGlm" +
+ "IHRoZSBibG9ja2NoYWluIGNvbmZpZyBpcyBpbnZhbGlkLgovLy8gKiAxMTogWyJVbmtub3duIiBlcnJvcl0gLSBUaHJvd24gaWYgdGhlIG1lc3NhZ2UgY2VsbCBpcyBp" +
+ "bGwtZm9ybWVkIG9yIHRoZSBibG9ja2NoYWluIGNvbmZpZyBpcyBpbnZhbGlkLgovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdo" +
+ "ZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" +
+ "L2NvcmUtc2VuZCNuYXRpdmVzZW5kbWVzc2FnZXJldHVybmZvcndhcmRmZWUKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNzZW5k" +
+ "cmF3bWVzc2FnZQovLy8KLy8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1" +
+ "Ci8vLyBbVHlwZSBjaGVjayBlcnJvcl06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM3Ci8vLyBbQ2VsbCB1bmRlcmZsb3ddOiBodHRw" +
+ "czovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8gWyJVbmtub3duIiBlcnJvcl06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" +
+ "ZXhpdC1jb2RlcyMxMQovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwph" +
+ "c20gZnVuIG5hdGl2ZVNlbmRNZXNzYWdlUmV0dXJuRm9yd2FyZEZlZShtc2c6IENlbGwsIG1vZGU6IEludCk6IEludCB7IFNFTkRNU0cgfQoKLy8vIEdsb2JhbCBmdW5j" +
+ "dGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjYuCi8vLwovLy8gU2ltaWxhciB0byBgc2VuZFJhd01lc3NhZ2UoKWAsIGJ1dCBhbHNvIGNhbGN1bGF0ZXMgYW5k" +
+ "IHJldHVybnMgdGhlIGZvcndhcmQgZmVlIGluIG5hbm9Ub25jb2luLgovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogNTogW0ludGVnZXIgb3V0IG9mIGV4" +
+ "cGVjdGVkIHJhbmdlXSAtIFRocm93biBpZiB0aGUgbWVzc2FnZSBtb2RlIGlzIGludmFsaWQuCi8vLyAqIDc6IFtUeXBlIGNoZWNrIGVycm9yXSAtIFRocm93biBpZiBh" +
+ "bnkgb2YgdGhlIGJsb2NrY2hhaW4gY29uZmlnLCBjb250cmFjdCBiYWxhbmNlIG9yIGluY29taW5nIG1lc3NhZ2UgdmFsdWUgYXJlIGludmFsaWQuCi8vLyAqIDExOiBb" +
+ "IlVua25vd24iIGVycm9yXSAtIFRocm93biBpZiB0aGUgbWVzc2FnZSBjZWxsIGlzIGlsbC1mb3JtZWQgb3IgdGhlIFRWTSBjb25maWcgaXMgaW52YWxpZC4KLy8vICog" +
+ "MzM6IFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBtZXNzYWdlcy4KLy8vCi8v" +
+ "LyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjc2VuZHJhd21lc3NhZ2VyZXR1cm5mb3J3YXJkZmVlCi8vLyAqIGh0dHBz" +
+ "Oi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjc2VuZHJhd21lc3NhZ2UKLy8vCi8vLyBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRw" +
+ "czovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW1R5cGUgY2hlY2sgZXJyb3JdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29r" +
+ "L2V4aXQtY29kZXMjNwovLy8gWyJVbmtub3duIiBlcnJvcl06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMxMQovLy8gW0FjdGlvbiBs" +
+ "aXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwphc20gZnVuIHNlbmRNZXNzYWdlUmV0dXJuRm9y" +
+ "d2FyZEZlZShtc2c6IENlbGwsIG1vZGU6IEludCk6IEludCB7IFNFTkRNU0cgfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4KLy8vCi8vLyBRdWV1ZXMgdGhlIG1lc3NhZ2Ug" +
+ "YGJvZHlgIHRvIGJlIHNlbnQgdG8gdGhlIG91dGVyIHdvcmxkIHdpdGggdGhlIHB1cnBvc2Ugb2YgbG9nZ2luZyBhbmQgYW5hbHl6aW5nIGl0IGxhdGVyIG9mZi1jaGFp" +
+ "bi4gVGhlIG1lc3NhZ2UgZG9lcyBub3QgaGF2ZSBhIHJlY2lwaWVudCBhbmQgaXMgbW9yZSBnYXMtZWZmaWNpZW50IGNvbXBhcmVkIHRvIHVzaW5nIGFueSBvdGhlciBt" +
+ "ZXNzYWdlLXNlbmRpbmcgZnVuY3Rpb25zIG9mIFRhY3QuCi8vLwovLy8gVGhlIG1lc3NhZ2UgaXMgc2VudCB3aXRoIHRoZSBkZWZhdWx0IG1vZGU6IGBTZW5kRGVmYXVs" +
+ "dE1vZGVgICgwKS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBlbWl0KCJDYXRjaCBtZSBpZiB5b3UgY2FuLCBNci4gSG9sbWVzIi5h" +
+ "c0NvbW1lbnQoKSk7IC8vIGFzQ29tbWVudCgpIGNvbnZlcnRzIGEgU3RyaW5nIHRvIGEgQ2VsbAovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8v" +
+ "LwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2Vz" +
+ "LgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNlbWl0Ci8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTog" +
+ "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwppbmxpbmUgZnVuIGVtaXQoYm9keTogQ2VsbCkgewogICAgLy8gZXh0X291dF9t" +
+ "c2dfaW5mbyQxMSBzcmM6TXNnQWRkcmVzc0ludCBkZXN0Ok1zZ0FkZHJlc3NFeHQgY3JlYXRlZF9sdDp1aW50NjQgY3JlYXRlZF9hdDp1aW50MzIKICAgIC8vICAgICAg" +
+ "ICAgICAgICAgICAgICAgbWF5YmU6IHN0YXRlSW5pdCAoZmFsc2UpIGJvZHlSZWY6IGJvb2wgKHRydWUpCiAgICBsZXQgYzogQ2VsbCA9IGJlZ2luQ2VsbCgpCiAgICAg" +
+ "ICAgLnN0b3JlVWludCgxNTIxMTgwNzIwMjczODc1MjgxNzk2MDQzODQ2NDUxMywgMTA0KQogICAgICAgIC5zdG9yZVJlZihib2R5KQogICAgICAgIC5lbmRDZWxsKCk7" +
+ "CiAgICBzZW5kUmF3TWVzc2FnZShjLCAwKTsKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4KLy8vCi8vLyBBZ3JlZXMgdG8gYnV5IHNvbWUgZ2FzIHRvIGZpbmlzaCB0aGUg" +
+ "Y3VycmVudCB0cmFuc2FjdGlvbiBieSBzZXR0aW5nIHRoZSBgZ2FzX2xpbWl0YCB0byBpdHMgbWF4aW11bSBhbGxvd2VkIHZhbHVlIG9mIDJeNjMgLSAxIGFuZCByZXNl" +
+ "dHRpbmcgdGhlIGBnYXNfY3JlZGl0YCB0byAwLiBUaGlzIGFjdGlvbiBpcyByZXF1aXJlZCB0byBwcm9jZXNzIGV4dGVybmFsIG1lc3NhZ2VzLCB3aGljaCBicmluZyBu" +
+ "byB2YWx1ZSAoaGVuY2Ugbm8gZ2FzKSB3aXRoIHRoZW1zZWx2ZXMuCi8vLwovLy8gYGBgdGFjdAovLy8gY29udHJhY3QgVGltZW91dCB7Ci8vLyAgICAgdGltZW91dDog" +
+ "SW50OwovLy8KLy8vICAgICBpbml0KCkgewovLy8gICAgICAgICBzZWxmLnRpbWVvdXQgPSBub3coKSArIDUgKiA2MDsgLy8gNSBtaW51dGVzIGZyb20gbm93Ci8vLyAg" +
+ "ICAgfQovLy8KLy8vICAgICBleHRlcm5hbCgidGltZW91dCIpIHsKLy8vICAgICAgICAgaWYgKG5vdygpID4gc2VsZi50aW1lb3V0KSB7Ci8vLyAgICAgICAgICAgICBh" +
+ "Y2NlcHRNZXNzYWdlKCk7IC8vIHN0YXJ0IGFjY2VwdGluZyBleHRlcm5hbCBtZXNzYWdlcyBvbmNlIHRpbWVvdXQgd2VudCBvdXQKLy8vICAgICAgICAgfQovLy8gICAg" +
+ "IH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtZ2FzI2FjY2VwdG1lc3NhZ2UKLy8vCmFzbSBmdW4g" +
+ "YWNjZXB0TWVzc2FnZSgpIHsgQUNDRVBUIH0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uCi8vLwovLy8gQ29tbWl0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiByZWdpc3RlcnMg" +
+ "YGM0YCAocGVyc2lzdGVudCBkYXRhKSBhbmQgYGM1YCAoYWN0aW9ucyksIHNvIHRoYXQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGlzIGNvbnNpZGVyZWQgInN1Y2Nlc3Nm" +
+ "dWwiIHdpdGggdGhlIHNhdmVkIHZhbHVlcyBldmVuIGlmIGFuIGV4Y2VwdGlvbiBpbiBjb21wdXRlIHBoYXNlIGlzIHRocm93biBsYXRlci4KLy8vCi8vLyBgYGB0YWN0" +
+ "Ci8vLyBjb250cmFjdCBXYWxsZXRWNCgKLy8vICAgICBzZXFubzogSW50IGFzIHVpbnQzMiwKLy8vICAgICAvLyAuLi5vdGhlciBwYXJhbWV0ZXJzLi4uCi8vLyApIHsK" +
+ "Ly8vICAgICAvLyAuLi4KLy8vICAgICBleHRlcm5hbChfOiBTbGljZSkgewovLy8gICAgICAgICAvLyAuLi52YXJpb3VzIHByaW9yIGNoZWNrcy4uLgovLy8KLy8vICAg" +
+ "ICAgICAgYWNjZXB0TWVzc2FnZSgpOwovLy8gICAgICAgICBzZWxmLnNlcW5vICs9IDE7Ci8vLyAgICAgICAgIHNldERhdGEoc2VsZi50b0NlbGwoKSk7Ci8vLyAgICAg" +
+ "ICAgIGNvbW1pdCgpOyAvLyAgbm93LCB0cmFuc2FjdGlvbiBpcyBjb25zaWRlcmVkICJzdWNjZXNzZnVsIgovLy8gICAgICAgICB0aHJvdyg0Mik7IC8vIGFuZCB0aGlz" +
+ "IHdvbid0IGZhaWwgaXQKLy8vICAgICB9Ci8vLyB9Ci8vLwovLy8gYXNtIGZ1biBzZXREYXRhKGRhdGE6IENlbGwpIHsgYzQgUE9QIH0KLy8vIGBgYAovLy8KLy8vIFNl" +
+ "ZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY29udGV4dHN0YXRlI2NvbW1pdAovLy8KYXNtIGZ1biBjb21taXQoKSB7IENPTU1JVCB9Cg==";
files["std/internal/text.tact"] =
"Ly8KLy8gU3RyaW5nIGJ1aWxkZXIKLy8KCi8vLyBHbG9iYWwgZnVuY3Rpb24uCi8vLwovLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBlbXB0eSBgU3RyaW5nQnVpbGRl" +
"cmAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKTogU3RyaW5nIHsKLy8vICAgICBsZXQgZml6ejogU3RyaW5nQnVpbGRlciA9IGJlZ2luU3RyaW5nKCk7" +
diff --git a/src/stdlib/stdlib/std/internal/base.tact b/src/stdlib/stdlib/std/internal/base.tact
index 4454446b3f..d038d4d932 100644
--- a/src/stdlib/stdlib/std/internal/base.tact
+++ b/src/stdlib/stdlib/std/internal/base.tact
@@ -45,25 +45,25 @@ trait BaseTrait {
let balanceBeforeMessage: Int = balance - context().value;
if (balanceBeforeMessage < self.storageReserve) {
nativeReserve(self.storageReserve, ReserveExact);
- message(MessageParameters {
+ MessageParameters {
bounce,
to,
value: 0,
mode: SendRemainingBalance | SendIgnoreErrors,
body,
- });
+ }.send();
return;
}
}
// Just send with remaining balance
- message(MessageParameters {
+ MessageParameters {
bounce,
to,
value: 0,
mode: SendRemainingValue | SendIgnoreErrors,
body,
- });
+ }.send();
}
/// Sends a non-bounceable message back to the sender of the current message.
@@ -89,25 +89,25 @@ trait BaseTrait {
let balanceBeforeMessage: Int = balance - context().value;
if (balanceBeforeMessage < self.storageReserve) {
nativeReserve(self.storageReserve, ReserveExact);
- message(MessageParameters {
+ MessageParameters {
bounce,
to,
value: 0,
mode: SendRemainingBalance | SendIgnoreErrors,
body,
- });
+ }.send();
return;
}
}
// Just send with remaining balance
- message(MessageParameters {
+ MessageParameters {
bounce,
to,
value: 0,
mode: SendRemainingValue | SendIgnoreErrors,
body,
- });
+ }.send();
}
/// Queues the message (bounceable or non-bounceable) to be sent to the specified address `to`.
@@ -134,25 +134,25 @@ trait BaseTrait {
let balanceBeforeMessage: Int = balance - ctx.value;
if (balanceBeforeMessage < self.storageReserve) {
nativeReserve(self.storageReserve, ReserveExact);
- message(MessageParameters {
+ MessageParameters {
bounce,
to,
value: 0,
mode: SendRemainingBalance | SendIgnoreErrors,
body,
- });
+ }.send();
return;
}
}
// Just send with remaining balance
- message(MessageParameters {
+ MessageParameters {
bounce,
to,
value: 0,
mode: SendRemainingValue | SendIgnoreErrors,
body,
- });
+ }.send();
return;
}
@@ -163,7 +163,7 @@ trait BaseTrait {
let balanceBeforeMessage: Int = balance - ctx.value;
if (balanceBeforeMessage < self.storageReserve) {
nativeReserve(self.storageReserve, ReserveExact);
- send(SendParameters {
+ SendParameters {
to,
mode: SendRemainingBalance | SendIgnoreErrors,
body,
@@ -171,13 +171,13 @@ trait BaseTrait {
bounce,
code: init!!.code,
data: init!!.data,
- });
+ }.send();
return;
}
}
// Just send with remaining balance
- send(SendParameters {
+ SendParameters {
bounce,
to,
value: 0,
@@ -185,6 +185,6 @@ trait BaseTrait {
body,
code: init!!.code,
data: init!!.data,
- });
+ }.send();
}
}
diff --git a/src/stdlib/stdlib/std/internal/send.tact b/src/stdlib/stdlib/std/internal/send.tact
index 148aee5ce7..aa4f682988 100644
--- a/src/stdlib/stdlib/std/internal/send.tact
+++ b/src/stdlib/stdlib/std/internal/send.tact
@@ -129,11 +129,11 @@ struct MessageParameters {
///
/// ```tact
/// fun example() {
-/// message(MessageParameters{
+/// MessageParameters{
/// to: sender(), // back to the sender,
/// value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin),
/// // and no message body
-/// });
+/// }.send();
/// }
/// ```
///
@@ -167,15 +167,45 @@ asm fun message(params: MessageParameters) {
SENDRAWMSG
}
+/// Extension function for the `MessageParameters` struct. Available since Tact 1.7.0.
+///
+/// Queues the message to be sent using the `MessageParameters` struct. Allows for cheaper non-deployment, regular messages compared to the `send()` function.
+///
+/// The `MessageParameters` struct is similar to `SendParameters` struct, but without the `code` and `data` fields.
+///
+/// ```tact
+/// fun example() {
+/// MessageParameters{
+/// to: sender(), // back to the sender,
+/// value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin),
+/// // and no message body
+/// }.send();
+/// }
+/// ```
+///
+/// #### Exit codes
+///
+/// * 33: [Action list is too long] — Thrown when attempting to queue more than 255 messages.
+///
+/// See:
+/// * https://docs.tact-lang.org/ref/core-send#message
+/// * https://docs.tact-lang.org/book/message-mode
+///
+/// [Action list is too long]: https://docs.tact-lang.org/book/exit-codes#33
+///
+extends inline fun send(self: MessageParameters) {
+ message(self);
+}
+
/// Global function. Queues the message to be sent using a `SendParameters` struct.
///
/// ```tact
/// fun example() {
-/// send(SendParameters{
+/// SendParameters{
/// to: sender(), // back to the sender,
/// value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin),
/// // and no message body
-/// });
+/// }.send()
/// }
/// ```
///
@@ -281,6 +311,32 @@ asm fun send(params: SendParameters) {
SENDRAWMSG // https://github.com/tact-lang/tact/issues/1558
}
+/// Extension function for the `SendParameters` struct. Available since Tact 1.7.0.
+///
+/// Queues the message to be sent using a `SendParameters` struct.
+///
+/// ```tact
+/// fun example() {
+/// SendParameters{
+/// to: sender(), // back to the sender,
+/// value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin),
+/// // and no message body
+/// }.send();
+/// }
+/// ```
+///
+/// #### Exit codes
+///
+/// * 33: [Action list is too long] — Thrown when attempting to queue more than 255 messages.
+///
+/// See: https://docs.tact-lang.org/ref/core-send#send
+///
+/// [Action list is too long]: https://docs.tact-lang.org/book/exit-codes#33
+///
+extends inline fun send(self: SendParameters) {
+ send(self);
+}
+
/// Struct for specifying the deployment message parameters of the `deploy()` function. Available since Tact 1.6.0.
///
/// See: https://docs.tact-lang.org/ref/core-send#deploy
@@ -322,12 +378,12 @@ struct DeployParameters {
///
/// ```tact
/// fun example() {
-/// deploy(DeployParameters{
+/// DeployParameters{
/// init: initOf SomeContract(), // with initial code and data of SomeContract
/// // and no additional message body
/// mode: SendIgnoreErrors, // skip the message in case of errors
/// value: ton("1"), // send 1 Toncoin (1_000_000_000 nanoToncoin)
-/// });
+/// }.send();
/// }
/// ```
///
@@ -427,6 +483,44 @@ asm fun deploy(params: DeployParameters) {
SENDRAWMSG
}
+/// Extension function for the `DeployParameters` struct. Available since Tact 1.7.0.
+///
+/// Queues the contract deployment message to be sent using the `DeployParameters` struct. Allows for cheaper on-chain deployments compared to the `send()` function.
+///
+/// The `DeployParameters` struct consists of the following fields:
+/// * `mode: Int`, an 8-bit value that configures how to send a message, defaults to 0.
+/// * `body: Cell?`, optional message body as a `Cell`.
+/// * `value: Int`, the amount of nanoToncoins you want to send with the message.
+/// This value is used to cover forward fees, unless the optional flag `SendPayFwdFeesSeparately` is used.
+/// * `bounce: Bool`, when set to `true` (default) message bounces back to the sender
+/// if the recipient contract doesn't exist or wasn't able to process the message.
+/// * `init: StateInit`, init package of the contract (initial code and initial data).
+///
+/// ```tact
+/// fun example() {
+/// DeployParameters{
+/// init: initOf SomeContract(), // with initial code and data of SomeContract
+/// // and no additional message body
+/// mode: SendIgnoreErrors, // skip the message in case of errors
+/// value: ton("1"), // send 1 Toncoin (1_000_000_000 nanoToncoin)
+/// }.send();
+/// }
+/// ```
+///
+/// #### Exit codes
+///
+/// * 33: [Action list is too long] — Thrown when attempting to queue more than 255 messages.
+///
+/// See:
+/// * https://docs.tact-lang.org/ref/core-send#deploy
+/// * https://docs.tact-lang.org/book/message-mode
+///
+/// [Action list is too long]: https://docs.tact-lang.org/book/exit-codes#33
+///
+extends inline fun send(self: DeployParameters) {
+ deploy(self);
+}
+
/// Global function. Available since Tact 1.6.1.
///
/// Queues an empty message to be sent with the `SendRemainingValue` mode and the `SendIgnoreErrors` flag to the destination address `to`.
@@ -441,13 +535,13 @@ asm fun deploy(params: DeployParameters) {
///
/// // The cashback() function above is cheaper, but functionally
/// // equivalent to the following call to the message() function
-/// message(MessageParameters{
+/// MessageParameters{
/// mode: SendRemainingValue | SendIgnoreErrors,
/// body: null,
/// value: 0,
/// to: sender(),
/// bounce: false,
-/// });
+/// }.send();
/// }
/// ```
///
diff --git a/src/test/codegen/empty-message.tact b/src/test/codegen/empty-message.tact
index 71a4f7ab1f..b781dcded9 100644
--- a/src/test/codegen/empty-message.tact
+++ b/src/test/codegen/empty-message.tact
@@ -3,12 +3,12 @@ message MyMessage {
contract Issue74 {
receive("send") {
- send(SendParameters {
+ SendParameters {
to: context().sender,
value: 0,
bounce: false,
mode: SendIgnoreErrors,
body: MyMessage {}.toCell()
- });
+ }.send();
}
}
\ No newline at end of file
diff --git a/src/test/e2e-emulated/contract-children/deep.tact b/src/test/e2e-emulated/contract-children/deep.tact
index 6f86578270..0f8464e096 100644
--- a/src/test/e2e-emulated/contract-children/deep.tact
+++ b/src/test/e2e-emulated/contract-children/deep.tact
@@ -5,13 +5,13 @@ contract A {
}
receive("Message") {
- deploy(DeployParameters{
+ DeployParameters{
init: initOf B(myAddress()),
value: 0,
mode: SendRemainingValue | SendIgnoreErrors,
bounce: true,
body: "Message".asComment()
- });
+ }.send();
}
get fun getNext(): StateInit {
@@ -30,7 +30,7 @@ contract B {
// to also test this way of deploying contracts
let init: StateInit = initOf C(myAddress());
let address: Address = contractAddress(init);
- send(SendParameters{
+ SendParameters{
value: 0,
to: address,
mode: SendRemainingValue | SendIgnoreErrors,
@@ -38,7 +38,7 @@ contract B {
code: init.code,
data: init.data,
body: "Message".asComment()
- });
+ }.send();
}
get fun getNext(): StateInit {
@@ -55,7 +55,7 @@ contract C {
receive("Message") {
let init: StateInit = initOf C(self.parent);
let address: Address = contractAddress(init);
- send(SendParameters{
+ SendParameters{
value: 0,
to: address,
mode: SendRemainingValue | SendIgnoreErrors,
@@ -63,7 +63,7 @@ contract C {
code: init.code,
data: init.data,
body: "Message2".asComment()
- });
+ }.send();
}
receive("Message2") {
diff --git a/src/test/e2e-emulated/contract-children/initof-2.tact b/src/test/e2e-emulated/contract-children/initof-2.tact
index 0c7a570a32..b892cf38d6 100644
--- a/src/test/e2e-emulated/contract-children/initof-2.tact
+++ b/src/test/e2e-emulated/contract-children/initof-2.tact
@@ -11,14 +11,14 @@ contract TestInit with Deployable {
try {
let init: StateInit = initOf TestNested();
dump("init@TestInit-1");
- send(SendParameters {
+ SendParameters {
to: contractAddress(init),
value: 0,
mode: SendIgnoreErrors | SendRemainingValue,
code: init.code,
data: init.data,
body: Deploy { queryId: 0 }.toCell(),
- });
+ }.send();
dump("init@TestInit-SUCCESS");
} catch (e) {
dump("ERROR@TestInit");
diff --git a/src/test/e2e-emulated/contract-children/initof.tact b/src/test/e2e-emulated/contract-children/initof.tact
index 25c9a51f18..5254ea6078 100644
--- a/src/test/e2e-emulated/contract-children/initof.tact
+++ b/src/test/e2e-emulated/contract-children/initof.tact
@@ -26,13 +26,13 @@ contract Child {
}
receive() {
- message(MessageParameters {
+ MessageParameters {
to: sender(),
value: 0,
mode: SendRemainingValue | SendIgnoreErrors,
bounce: false,
body: ChildAddress { address: myAddress() }.toCell(),
- });
+ }.send();
}
}
@@ -46,7 +46,7 @@ contract Parent {
receive() {
let ci = initOf Child(myAddress());
- send(SendParameters {
+ SendParameters {
to: contractAddress(ci),
value: 0,
mode: SendRemainingValue | SendIgnoreErrors,
@@ -54,7 +54,7 @@ contract Parent {
body: beginCell().endCell(),
code: ci.code,
data: ci.data,
- });
+ }.send();
}
receive(msg: ChildAddress) {
diff --git a/src/test/e2e-emulated/contract-receivers/bounced-routing.tact b/src/test/e2e-emulated/contract-receivers/bounced-routing.tact
index 9676f710a0..da7b745b14 100644
--- a/src/test/e2e-emulated/contract-receivers/bounced-routing.tact
+++ b/src/test/e2e-emulated/contract-receivers/bounced-routing.tact
@@ -52,24 +52,24 @@ contract SampleContract {
receive(msg: EntryFirst) {
self.a = self.a - msg.amountToAdd;
- message(MessageParameters{
+ MessageParameters{
to: msg.toAddress,
value: ton("1"),
mode: SendIgnoreErrors,
bounce: true,
body: First{amount: msg.amountToAdd, myCoins: 3, myBool3: false, anAddress: sender()}.toCell()
- });
+ }.send();
}
receive(msg: EntrySecond) {
self.a = self.a - msg.amountToAdd;
- message(MessageParameters{
+ MessageParameters{
to: msg.toAddress,
value: ton("1"),
mode: SendIgnoreErrors,
bounce: true,
body: Second{amount_bigger: msg.amountToAdd, myBool: false, thisDoesNotFit: 1, myAddress: sender(), myBool2: false, myStruct: MyStruct{amount: 1}, myStruct2: MyStruct{amount: 2}}.toCell()
- });
+ }.send();
}
receive(msg: First) {
diff --git a/src/test/e2e-emulated/contract-receivers/receiver-precedence.tact b/src/test/e2e-emulated/contract-receivers/receiver-precedence.tact
index 82d374aaed..335e4359b6 100644
--- a/src/test/e2e-emulated/contract-receivers/receiver-precedence.tact
+++ b/src/test/e2e-emulated/contract-receivers/receiver-precedence.tact
@@ -28,12 +28,12 @@ contract Calculator {
receive(request: BinaryIntOperation) {
require(request.op == "/", "Only divisions are currently supported.");
let result = request.val1 / request.val2;
- message(MessageParameters{
+ MessageParameters{
to: sender(),
bounce: false,
value: ton("1"),
body: BinaryIntResult{val: result}.toCell(),
- });
+ }.send();
}
}
@@ -77,46 +77,46 @@ contract ReceiverTester {
// Initiate a request to the calculator, with an unsupported arithmetic operation: 1 + 1
receive("do_unsupported_op") {
let addr = contractAddress(initOf Calculator());
- message(MessageParameters{
+ MessageParameters{
to: addr,
bounce: true,
value: ton("1"),
body: BinaryIntOperation{op: "+", val1: 1, val2: 1}.toCell(),
- });
+ }.send();
}
// Initiate a request to the calculator, with a division by zero: 10/0
receive("do_div_by_zero") {
let addr = contractAddress(initOf Calculator());
- message(MessageParameters{
+ MessageParameters{
to: addr,
bounce: true,
value: ton("1"),
body: BinaryIntOperation{op: "/", val1: 10, val2: 0}.toCell(),
- });
+ }.send();
}
// Initiate a request to the calculator: 10/2
receive("do_success_div") {
let addr = contractAddress(initOf Calculator());
- message(MessageParameters{
+ MessageParameters{
to: addr,
bounce: true,
value: ton("1"),
body: BinaryIntOperation{op: "/", val1: 10, val2: 2}.toCell(),
- });
+ }.send();
}
// Initiate a non-arithmetic request to the calculator.
// The calculator will reject the request
receive("do_unknown_request") {
let addr = contractAddress(initOf Calculator());
- message(MessageParameters{
+ MessageParameters{
to: addr,
bounce: true,
value: ton("1"),
body: "do_something".asComment(),
- });
+ }.send();
}
bounced(msg: Slice) {
@@ -167,12 +167,12 @@ contract ReceiverTester {
// Initiate a request to the specified address with the specified cell as message body
receive(msg: SendCellToAddress) {
- send(SendParameters {
+ SendParameters {
to: msg.address,
bounce: false,
value: ton("5"),
body: msg.body,
- });
+ }.send();
}
get fun receiverKind(): String {
@@ -1338,12 +1338,12 @@ contract EmptyBouncedTester {
// Initiate a request to the specified address with the specified cell as message body
receive(msg: SendCellToAddress) {
- send(SendParameters {
+ SendParameters {
to: msg.address,
bounce: true,
value: ton("5"),
body: msg.body,
- });
+ }.send();
}
receive("reset") {
@@ -1369,12 +1369,12 @@ contract BinaryBouncedTester {
// Initiate a request to the specified address with the specified cell as message body
receive(msg: SendCellToAddress) {
- send(SendParameters {
+ SendParameters {
to: msg.address,
bounce: true,
value: ton("5"),
body: msg.body,
- });
+ }.send();
}
receive("reset") {
@@ -1396,12 +1396,12 @@ contract SliceBouncedTester {
// Initiate a request to the specified address with the specified cell as message body
receive(msg: SendCellToAddress) {
- send(SendParameters {
+ SendParameters {
to: msg.address,
bounce: true,
value: ton("5"),
body: msg.body,
- });
+ }.send();
}
receive("reset") {
@@ -1431,12 +1431,12 @@ contract AllBouncedTester {
// Initiate a request to the specified address with the specified cell as message body
receive(msg: SendCellToAddress) {
- send(SendParameters {
+ SendParameters {
to: msg.address,
bounce: true,
value: ton("5"),
body: msg.body,
- });
+ }.send();
}
receive("reset") {
diff --git a/src/test/e2e-emulated/contract-receivers/storage-write-analysis.tact b/src/test/e2e-emulated/contract-receivers/storage-write-analysis.tact
index 8049f8c1c6..ad81b6fc1c 100644
--- a/src/test/e2e-emulated/contract-receivers/storage-write-analysis.tact
+++ b/src/test/e2e-emulated/contract-receivers/storage-write-analysis.tact
@@ -4,7 +4,7 @@ contract Tester {
// if storage write analysis is implemented correctly, this will send
// just one message back to self, otherwise it will spam with messages
// until it runs out of gas
- message(MessageParameters { to: myAddress(), value: 0, mode: SendRemainingValue })
+ MessageParameters { to: myAddress(), value: 0, mode: SendRemainingValue }.send()
}
receive() { } // does not modify the contract state
diff --git a/src/test/e2e-emulated/exit-codes/tact-reserved-contract-errors.tact b/src/test/e2e-emulated/exit-codes/tact-reserved-contract-errors.tact
index cf921b1b70..80eee80349 100644
--- a/src/test/e2e-emulated/exit-codes/tact-reserved-contract-errors.tact
+++ b/src/test/e2e-emulated/exit-codes/tact-reserved-contract-errors.tact
@@ -60,12 +60,12 @@ contract ReservedContractErrorsTester with Ownable, Stoppable {
/// Exit code TactExitCodeInvalidIncomingMessage
receive("TactExitCodeInvalidIncomingMessage") {
- message(MessageParameters {
+ MessageParameters {
to: myAddress(), // Send a message back to this contract
value: 0,
mode: SendRemainingValue | SendIgnoreErrors,
body: SpanishInquisition {}.toCell(), // Nobody expects it!
- });
+ }.send();
}
/// Exit code TactExitCodeAccessDenied
diff --git a/src/test/e2e-emulated/message-sending/message.tact b/src/test/e2e-emulated/message-sending/message.tact
index 7074d7d241..f1c86b324e 100644
--- a/src/test/e2e-emulated/message-sending/message.tact
+++ b/src/test/e2e-emulated/message-sending/message.tact
@@ -22,32 +22,32 @@ contract MessageTester with Deployable {
nativeReserve(ton("0.05"), ReserveAtMost | ReserveAddOriginalBalance);
- message(MessageParameters{
+ MessageParameters{
to: sender(),
value: 0,
mode: SendRemainingBalance,
body: "I give you my all! Well, all that's not mine!".asComment(),
- });
+ }.send();
}
/// Sends a message to our "topup" receiver via send(),
/// keeps the original balance,
/// then sends the rest in the next message via send()
receive("ReserveAtMost_2") {
- message(MessageParameters{
+ MessageParameters{
to: myAddress(),
value: 0,
mode: SendDefaultMode | SendPayFwdFeesSeparately,
body: "topup".asComment(),
- });
+ }.send();
nativeReserve(ton("0.05"), ReserveAtMost | ReserveAddOriginalBalance);
- message(MessageParameters{
+ MessageParameters{
to: sender(),
value: 0,
mode: SendRemainingBalance,
body: "I give almost all that's not mine!".asComment(),
- });
+ }.send();
}
}
diff --git a/src/test/e2e-emulated/message-sending/send-modes/message-mode-tester.tact b/src/test/e2e-emulated/message-sending/send-modes/message-mode-tester.tact
index 570911431f..51ee302d18 100644
--- a/src/test/e2e-emulated/message-sending/send-modes/message-mode-tester.tact
+++ b/src/test/e2e-emulated/message-sending/send-modes/message-mode-tester.tact
@@ -31,13 +31,13 @@ contract Calculator {
count += 1;
}
let result = sum / n;
- message(MessageParameters{
+ MessageParameters{
to: sender(),
bounce: false,
// SendDefaultMode with no flags is default
value: request.amountToPayInResponse,
body: AverageResult{res: result}.toCell(),
- });
+ }.send();
}
}
@@ -80,13 +80,13 @@ contract MessageModeTester {
// Using default mode, no flags
receive(msg: DoCalculatorRequest) {
let addr = contractAddress(initOf Calculator());
- message(MessageParameters{
+ MessageParameters{
to: addr,
bounce: true,
value: msg.amountToPayInRequest,
mode: SendDefaultMode,
body: AverageRequest{from: msg.from, to: msg.to, amountToPayInResponse: msg.amountToPayInCalculatorResponse}.toCell(),
- });
+ }.send();
self.val = -3;
}
}
diff --git a/src/test/e2e-emulated/message-sending/send-modes/send-default-mode-no-flag.spec.ts b/src/test/e2e-emulated/message-sending/send-modes/send-default-mode-no-flag.spec.ts
index 554573e690..8e6afc59e5 100644
--- a/src/test/e2e-emulated/message-sending/send-modes/send-default-mode-no-flag.spec.ts
+++ b/src/test/e2e-emulated/message-sending/send-modes/send-default-mode-no-flag.spec.ts
@@ -193,11 +193,11 @@ describe("SendDefaultMode with no flags", () => {
/* In SendDefaultMode with no flags, outbound messages must pay for forward fees. The forward fees are deducted from the
initial "value" passed as parameter to the send function. So that if we execute:
- send(SendParameters{
+ SendParameters{
......
value: V,
......
- });
+ }.send();
the message final value is: V - msg_fwd_fee
diff --git a/src/test/e2e-emulated/message-sending/send.tact b/src/test/e2e-emulated/message-sending/send.tact
index 28ee42a9a1..4b46865474 100644
--- a/src/test/e2e-emulated/message-sending/send.tact
+++ b/src/test/e2e-emulated/message-sending/send.tact
@@ -22,32 +22,32 @@ contract SendTester with Deployable {
nativeReserve(ton("0.05"), ReserveAtMost | ReserveAddOriginalBalance);
- message(MessageParameters{
+ MessageParameters{
to: sender(),
value: 0,
mode: SendRemainingBalance,
body: "I give you my all! Well, all that's not mine!".asComment(),
- });
+ }.send();
}
/// Sends a message to our "topup" receiver via send(),
/// keeps the original balance,
/// then sends the rest in the next message via send()
receive("ReserveAtMost_2") {
- message(MessageParameters{
+ MessageParameters{
to: myAddress(),
value: 0,
mode: SendDefaultMode | SendPayFwdFeesSeparately,
body: "topup".asComment(),
- });
+ }.send();
nativeReserve(ton("0.05"), ReserveAtMost | ReserveAddOriginalBalance);
- message(MessageParameters{
+ MessageParameters{
to: sender(),
value: 0,
mode: SendRemainingBalance,
body: "I give almost all that's not mine!".asComment(),
- });
+ }.send();
}
}
diff --git a/src/test/e2e-emulated/stdlib/deploy.tact b/src/test/e2e-emulated/stdlib/deploy.tact
index 2ab7df290f..761a057ac2 100644
--- a/src/test/e2e-emulated/stdlib/deploy.tact
+++ b/src/test/e2e-emulated/stdlib/deploy.tact
@@ -30,13 +30,13 @@ contract DeployContract {
}
receive(msg: DeployParamsMsg) {
- deploy(DeployParameters{
+ DeployParameters{
mode: msg.mode,
body: msg.body.asCell(),
value: 0,
bounce: msg.bounce,
init: initOf DeployContract(msg.contractNum)
- });
+ }.send();
}
// In this test we do not care if the contracts are already deployed,
@@ -44,14 +44,14 @@ contract DeployContract {
// produce indistinguishable messages.
receive(msg: DeployComparisonMsg) {
let initInfo = initOf DeployContract(msg.contractNum);
- deploy(DeployParameters{
+ DeployParameters{
mode: msg.mode,
body: msg.body.asCell(),
value: msg.value,
bounce: msg.bounce,
init: initInfo
- });
- send(SendParameters{
+ }.send();
+ SendParameters{
mode: msg.mode,
body: msg.body.asCell(),
code: initInfo.code,
@@ -59,26 +59,26 @@ contract DeployContract {
value: msg.value,
bounce: msg.bounce,
to: contractAddress(initInfo)
- });
+ }.send();
}
// Do the same, but with no body, since it is the only
// optional parameter common to both functions.
receive(msg: DeployComparisonNoBodyMsg) {
let initInfo = initOf DeployContract(msg.contractNum);
- deploy(DeployParameters{
+ DeployParameters{
mode: msg.mode,
value: msg.value,
bounce: msg.bounce,
init: initInfo
- });
- send(SendParameters{
+ }.send();
+ SendParameters{
mode: msg.mode,
code: initInfo.code,
data: initInfo.data,
value: msg.value,
bounce: msg.bounce,
to: contractAddress(initInfo)
- });
+ }.send();
}
}
\ No newline at end of file
diff --git a/src/test/e2e-emulated/structs-and-messages/structs.tact b/src/test/e2e-emulated/structs-and-messages/structs.tact
index d7566e6013..20e75844da 100644
--- a/src/test/e2e-emulated/structs-and-messages/structs.tact
+++ b/src/test/e2e-emulated/structs-and-messages/structs.tact
@@ -386,13 +386,13 @@ contract StructsTester {
receive(msg: Foo) {
let d = Dict.fromSlice(msg.s);
- message(MessageParameters{
+ MessageParameters{
bounce: false,
to: sender(),
value: ton("0.01"),
mode: SendPayFwdFeesSeparately,
body: d.toCell()
- });
+ }.send();
}
get fun structInitializerTest(): Bool {
diff --git a/src/test/e2e-emulated/traits/base-trait/test-base-trait.tact b/src/test/e2e-emulated/traits/base-trait/test-base-trait.tact
index 7398c3a656..5147beeabc 100644
--- a/src/test/e2e-emulated/traits/base-trait/test-base-trait.tact
+++ b/src/test/e2e-emulated/traits/base-trait/test-base-trait.tact
@@ -51,12 +51,12 @@ trait TestBaseTrait with BaseTrait{
}
receive(msg: MessageAndForward) {
- message(MessageParameters {
+ MessageParameters {
mode: msg.mode,
to: msg.to,
body: msg.body,
value: msg.value,
- });
+ }.send();
self.forward(msg.to, msg.body, msg.bounce, msg.init);
}
diff --git a/src/test/e2e-emulated/uncategorized/sample-jetton.tact b/src/test/e2e-emulated/uncategorized/sample-jetton.tact
index c29171720d..fd06eb1137 100644
--- a/src/test/e2e-emulated/uncategorized/sample-jetton.tact
+++ b/src/test/e2e-emulated/uncategorized/sample-jetton.tact
@@ -67,7 +67,7 @@ trait Jetton with Ownable {
self.totalSupply = self.totalSupply - msg.amount; // Update supply
if (msg.response_destination != null) { // Cashback
- message(MessageParameters{
+ MessageParameters{
to: msg.response_destination!!,
value: 0,
bounce: false,
@@ -75,7 +75,7 @@ trait Jetton with Ownable {
body: TokenExcesses{
queryId: msg.queryId
}.toCell()
- });
+ }.send();
}
}
@@ -88,7 +88,7 @@ trait Jetton with Ownable {
require(self.totalSupply + amount <= self.max_supply, "The total supply will be overlapping.");
self.totalSupply = self.totalSupply + amount; // Update total supply
- deploy(DeployParameters{
+ DeployParameters{
init: self.getJettonWalletInit(to),
value: 0,
bounce: false,
@@ -101,7 +101,7 @@ trait Jetton with Ownable {
forward_ton_amount: 0,
forward_payload: emptySlice()
}.toCell(),
- });
+ }.send();
}
fun requireWallet(owner: Address) {
@@ -210,7 +210,7 @@ contract JettonDefaultWallet {
self.balance = self.balance - msg.amount; // Update balance
require(self.balance >= 0, "Invalid balance");
- deploy(DeployParameters{
+ DeployParameters{
init: initOf JettonDefaultWallet(self.master, msg.destination),
value: 0,
mode: SendRemainingValue,
@@ -223,7 +223,7 @@ contract JettonDefaultWallet {
forward_ton_amount: msg.forward_ton_amount,
forward_payload: msg.forward_payload
}.toCell(),
- });
+ }.send();
}
receive(msg: TokenTransferInternal) { // 0x178d4519
@@ -238,7 +238,7 @@ contract JettonDefaultWallet {
require(self.balance >= 0, "Invalid balance"); // Update balance
if (msg.forward_ton_amount > 0) {
- message(MessageParameters{
+ MessageParameters{
to: self.owner,
value: msg.forward_ton_amount,
bounce: false,
@@ -248,7 +248,7 @@ contract JettonDefaultWallet {
from: msg.from,
forward_payload: msg.forward_payload
}.toCell()
- });
+ }.send();
}
let msgValue: Int = self.msgValue(ctx.value); // Get value for gas
@@ -257,7 +257,7 @@ contract JettonDefaultWallet {
// msgValue = msgValue - msg.forward_ton_amount - min(fwdFee, ton("0.01"));
if (msg.response_destination != null) { // Cashback
- message(MessageParameters {
+ MessageParameters {
to: msg.response_destination!!,
value: msgValue,
bounce: false,
@@ -265,7 +265,7 @@ contract JettonDefaultWallet {
queryId: msg.queryId
}.toCell(),
mode: SendIgnoreErrors
- });
+ }.send();
}
}
@@ -286,7 +286,7 @@ contract JettonDefaultWallet {
let fwdFee: Int = ctx.readForwardFee(); // Gas checks
require(ctx.value > fwdFee + 2 * self.gasConsumption + self.minTonsForStorage, "Invalid value - Burn");
- message(MessageParameters{ // Burn tokens
+ MessageParameters{ // Burn tokens
to: self.master,
value: 0,
mode: SendRemainingValue,
@@ -297,7 +297,7 @@ contract JettonDefaultWallet {
owner: self.owner,
response_destination: self.owner
}.toCell()
- });
+ }.send();
}
bounced(msg: Slice) {