Repository: tact-lang/tact

Issue:
Add `sqrt` microbenchmarks
These microbenchmarks can be added to https://github.com/tact-lang/tact/blob/main/src/test/gas-consumption/gas.spec.ts.

See https://github.com/tact-lang/tact/issues/770#issuecomment-2481863626

#### TonoxDeFi/open-contracts/math.func

https://github.com/TonoxDeFi/open-contracts/blob/ebbb877e5ee6a9e506605c455c44b2b5223956f1/contracts/math/math.func#L26

```func
int math::sqrt(int x) inline {
  if (x == 0) { return x; }

  int r = 181;
  int xx = x;
  if (xx >= 0x100000000000000000000000000000000) {
    xx >>= 128;
    r <<= 64;
  }
  if (xx >= 0x10000000000000000) {
    xx >>= 64;
    r <<= 32;
  }
  if (xx >= 0x100000000) {
    xx >>= 32;
    r <<= 16;
  }
  if (xx >= 0x10000) {
    xx >>= 16;
    r <<= 8;
  }

  r = (r * (xx + 65536)) >> 18;

  repeat(7) {
    r = (r + x / r) >> 1;
  }

  int r1 = x / r;

  return (r < r1 ? r : r1);
}
```

#### mathlib.fc

https://github.com/ton-blockchain/ton/blob/ed4682066978f69ffa38dd98912ca77d4f660f66/crypto/smartcont/mathlib.fc#L205

```func
;; computes sqrt(a*b) exactly rounded to the nearest integer
;; for all 0 <= a, b <= 2^256-1
;; may be used with b=1 or b=scale of fixed-point numbers
int geom_mean(int a, int b) inline_ref {
  ifnot (min(a, b)) {
    return 0;
  }
  int s = log2_floor_p1(a);   ;; throws out of range error if a < 0 or b < 0
  int t = log2_floor_p1(b);
  ;; NB: (a-b)/2+b == (a+b)/2, but without overflow for large a and b
  int x = (s == t ? (a - b) / 2 + b : 1 << ((s + t) / 2));
  do {
    ;; if always used with b=2^const, may be optimized to "const LSHIFTDIVC#"
    ;; it is important to use `muldivc` here, not `muldiv` or `muldivr`
    int q = (muldivc(a, b, x) - x) / 2;
    x += q;
  } until (q == 0);
  return x;
}

;; integer square root, computes round(sqrt(a)) for all a>=0.
;; note: `inline` is better than `inline_ref` for such simple functions
int sqrt(int a) inline {
  return geom_mean(a, 1);
}
```

Discussion:

Solution patch:
diff --git a/.eslintignore b/.eslintignore
index 34fb1330..40086ae5 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -11,6 +11,7 @@ jest.globalSetup.js
 jest.teardown.js
 /docs
 version.build.ts
+format.build.ts
 bin/*
 **/.testing/
 src/fmt/cst/cst-parser.ts
diff --git a/README.md b/README.md
index 9ab03a61..61741104 100644
--- a/README.md
+++ b/README.md
@@ -130,7 +130,10 @@ Alternatively, you can install it globally as such:
 npm i -g @tact-lang/compiler
 ```
 
-It will make the `tact` compiler available on your PATH, as well as a convenient `unboc` disassembler of a contract's code compiled into a [Bag of Cells](https://docs.tact-lang.org/book/cells/#cells-boc) `.boc` format.
+It will make the `tact` compiler available on your PATH, as well as:
+
+- a convenient `unboc` disassembler of a contract's code compiled into a [Bag of Cells](https://docs.tact-lang.org/book/cells/#cells-boc) `.boc` format.
+- a formatter `tact-fmt`, which can format or check the formatting of individual Tact files and directories.
 
 ### Tooling
 
@@ -150,6 +153,11 @@ It will make the `tact` compiler available on your PATH, as well as a convenient
 - [Misti](https://github.com/nowarp/misti) - Static smart contract analyzer.
 - [TON Symbolic Analyzer (TSA)](https://github.com/espritoxyz/tsa) - Static smart contract analysis tool based on symbolic execution.
 
+###### Utility
+
+- Formatter (`tact-fmt`) — The official formatter. It ships with the Tact Language Server, VS Code extension, and as a standalone binary with the compiler. You can invoke it by running `npx tact-fmt` in your Tact projects.
+- BoC Disassembler (`unboc`) — Disassembler for [`.boc`](https://docs.tact-lang.org/book/cells/#cells-boc) files. Ships as a standalone binary with the compiler. You can invoke it by running `npx unboc` in your Tact projects.
+
 ### Getting started
 
 For a quick start, read the ["Let's start!"](https://docs.tact-lang.org/#start) mini-guide in the Tact documentation. It uses the [Blueprint](https://github.com/ton-community/blueprint) development environment for writing, testing, and deploying smart contracts on TON Blockchain.
diff --git a/cspell.json b/cspell.json
index 4acf3719..3c7f440d 100644
--- a/cspell.json
+++ b/cspell.json
@@ -57,6 +57,7 @@
     "src/benchmarks/contracts/func/notcoin/stdlib-custom.fc",
     "src/benchmarks/contracts/func/notcoin/gas.fc",
     "src/utils/change-case/*",
-    "src/fmt/cst/cst-parser.ts"
+    "src/fmt/cst/cst-parser.ts",
+    "coverage"
   ]
 }
diff --git a/dev-docs/CHANGELOG.md b/dev-docs/CHANGELOG.md
index 438d773b..6d597321 100644
--- a/dev-docs/CHANGELOG.md
+++ b/dev-docs/CHANGELOG.md
@@ -9,6 +9,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Language features
 
+- Compiler now generates more efficient code for structure fields serialization: PR [#2836](https://github.com/tact-lang/tact/pull/2836)
+- Compiler now generates more efficient code for `Address?` fields deserialization: PR [#2834](https://github.com/tact-lang/tact/pull/2834)
+
+### Release contributors
+
+- [Petr Makhnev](https://github.com/i582)
+
+## [1.6.6] - 2025-04-16
+
+### Language features
+
 - Optimized message deserialization with native loading of `Maybe Cell` fields: PR [#2661](https://github.com/tact-lang/tact/pull/2661)
 - Optimized message serialization with native stores of `Maybe Cell` fields: PR [#2647](https://github.com/tact-lang/tact/pull/2647)
 - Zero inequality comparison optimization: PR [#2655](https://github.com/tact-lang/tact/pull/2655)
@@ -25,15 +36,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - [fix] Compiler now checks that "override" functions and constants have a virtual or abstract modifier in the parent trait: PR [#2700](https://github.com/tact-lang/tact/pull/2700)
 - [fix] Compiler now throws an error if a non-optional method is called on an optional type: PR [#2770](https://github.com/tact-lang/tact/pull/2770)
 - [fix] Compiler now throws an error when inheriting from two traits that have methods with the same name: PR [#2773](https://github.com/tact-lang/tact/pull/2773)
+- [fix] Compiler now correctly generates code for the unary plus operator: PR [#2807](https://github.com/tact-lang/tact/pull/2807)
+- [fix] Compiler now shows a full error message for maps with optional value: PR [#2810](https://github.com/tact-lang/tact/pull/2810)
+- [fix] Compiler now correctly detects mutually recursive types: PR [#2814](https://github.com/tact-lang/tact/pull/2814)
 - [fix] Generated TypeScript wrappers now export all functions for serialization/deserialization: PR [#2706](https://github.com/tact-lang/tact/pull/2706)
 - [fix] Processing of `null` values of optional types in the `dump` builtin: PR [#2730](https://github.com/tact-lang/tact/pull/2730)
+- [fix] Support constants as the second parameter of the `require()` function: PR [#2808](https://github.com/tact-lang/tact/pull/2808)
 
 ### Standard Library
 
 - Added compute phase exit code constants reserved by the Tact compiler: `TactExitCodeNullReferenceException`, `TactExitCodeInvalidSerializationPrefix`, `TactExitCodeInvalidIncomingMessage`, `TactExitCodeConstraintsError`, `TactExitCodeAccessDenied`, `TactExitCodeContractStopped`, `TactExitCodeInvalidArgument`, `TactExitCodeContractCodeNotFound`, `TactExitCodeInvalidStandardAddress`, `TactExitCodeNotBasechainAddress`: PR [#2527](https://github.com/tact-lang/tact/pull/2527)
 - Added the `SignedBundle` struct and the corresponding `verifySignature` method: PR [#2627](https://github.com/tact-lang/tact/pull/2627)
 - Added the `sendRawMessage` and `sendRawMessageReturnForwardFee` functions instead of the deprecated `nativeSendMessage` and `nativeSendMessageReturnForwardFee` functions correspondingly: PR [#2755](https://github.com/tact-lang/tact/pull/2755)
-- Optimized the `sha256()` function to about ~270 less gas used per call, and added the `keccak256()` function: PR [#2775](https://github.com/tact-lang/tact/pull/2775)
+- Optimized the `sha256()` function to about ~270 less gas used per call and added the `keccak256()` function: PR [#2775](https://github.com/tact-lang/tact/pull/2775)
+
+### Tooling
+
+- Added source code formatter: PR [#2768](https://github.com/tact-lang/tact/pull/2768)
+  - Show a better error if a file cannot be parsed by the formatter: PR [#2796](https://github.com/tact-lang/tact/pull/2796)
+  - Added `--check` flag to formatter: PR [#2788](https://github.com/tact-lang/tact/pull/2788)
+  - Support directory formatting: PR [#2787](https://github.com/tact-lang/tact/pull/2787)
 
 ### TypeScript third-party API
 
@@ -49,6 +71,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Added generation of `llms.txt`, `llms-full.txt` (full version), and `llms-small.txt` (compact version, with non-essential content removed): PR [#2763](https://github.com/tact-lang/tact/pull/2763)
 - Added description of the specialized math functions, such as `pow2()` and `log2()`, to the gas best practices page: PR [#2771](https://github.com/tact-lang/tact/pull/2771)
 - Added `BasechainAddress` to the gas best practices page: PR [#2802](https://github.com/tact-lang/tact/pull/2802)
+- Applied suggestions from the gas best practices page to the security best practices page: PR [#2811](https://github.com/tact-lang/tact/pull/2811)
 
 ### Release contributors
 
diff --git a/dev-docs/CONTRIBUTING.md b/dev-docs/CONTRIBUTING.md
index 727ce30c..fb67c90a 100644
--- a/dev-docs/CONTRIBUTING.md
+++ b/dev-docs/CONTRIBUTING.md
@@ -177,6 +177,21 @@ yarn test -u spec-name-pattern1 spec-name-pattern2
 
 Beware that updating snapshots from Javascript Debug Terminal in VSCode might lead to unexpected results. E2E CLI tests check `stderr` of child `tact` processes, but JS Debug Terminal adds "Debugger attached" messages into it.
 
+## Coverage
+
+To compute coverage, run
+
+```shell
+yarn istanbul
+```
+
+The log will be generated into `/coverage` folder. For better UX, serve its contents locally with
+
+```shell
+cd coverage
+npx http-server . -p 3000
+```
+
 ## Benchmarks
 
 The benchmark system tracks gas consumption changes after making changes to the compiler.
diff --git a/dev-docs/RELEASE.md b/dev-docs/RELEASE.md
index b11c75cb..5dcd3472 100644
--- a/dev-docs/RELEASE.md
+++ b/dev-docs/RELEASE.md
@@ -3,6 +3,7 @@
 - [ ] Improve the changelog for `vX.Y.Z`: grammar, wording, polishing
 - [ ] Make sure there are no open issues for the [vX.Y.Z milestone](https://github.com/tact-lang/tact/issues?q=is%3Aopen+is%3Aissue+milestone%3AvX.Y.Z) (except for the current one, of course)
 - [ ] Remove `(not released yet)` from docs:
+- [ ] Update test snapshots with Tact version
 - [ ] Bump Tact version in [`package.json`](../package.json) file
 - [ ] Bump Tact version in [CHANGELOG.md](./CHANGELOG.md): `Unreleased` -> `vX.Y.Z`
 - [ ] Tag the new `vX.Y.Z` release in Git
diff --git a/docs/src/content/docs/book/exit-codes.mdx b/docs/src/content/docs/book/exit-codes.mdx
index f2032d41..0d2b1997 100644
--- a/docs/src/content/docs/book/exit-codes.mdx
+++ b/docs/src/content/docs/book/exit-codes.mdx
@@ -288,7 +288,7 @@ From the [Cells, Builders and Slices page](/book/cells#cells) of the Book:
 
 To construct a [`Cell{:tact}`][cell], a [`Builder{:tact}`][builder] is used. If you try to store more than 1023 bits of data or more than 4 references to other cells, an error with exit code $8$ is thrown: `Cell overflow`.
 
-This error can be triggered by [manual construction](/book/cells#cnp-manually) of the cells via [relevant `.loadSomething()` methods](/ref/core-cells) or when [using Structs and Messages and their convenience methods](/book/cells#cnp-structs).
+This error can be triggered by [manual construction](/book/cells#cnp-manually) of the cells via [relevant `.storeSomething()` methods](/ref/core-cells#builder) or when [using Structs and Messages and their convenience methods](/book/cells#cnp-structs).
 
 ```tact
 // Too many bits
@@ -326,7 +326,7 @@ From the [Cells, Builders and Slices page](/book/cells#cells) of the Book:
 
 To parse a [`Cell{:tact}`][cell], a [`Slice{:tact}`][slice] is used. If you try to load more data or references than a `Slice{:tact}` contains, an error with exit code 9 is thrown: `Cell underflow`.
 
-The most common cause of this error is a mismatch between the expected and actual memory layouts of the cells, so it's recommended to [use Structs and Messages for parsing](/book/cells#cnp-structs) the cells instead of [manual parsing](/book/cells#cnp-manually) via [relevant `.loadSomething()` methods](/ref/core-cells).
+The most common cause of this error is a mismatch between the expected and actual memory layouts of the cells, so it's recommended to [use Structs and Messages for parsing](/book/cells#cnp-structs) the cells instead of [manual parsing](/book/cells#cnp-manually) via [relevant `.loadSomething()` methods](/ref/core-cells#slice).
 
 ```tact
 // Too few bits
diff --git a/docs/src/content/docs/book/gas-best-practices.mdx b/docs/src/content/docs/book/gas-best-practices.mdx
index 25108875..18310567 100644
--- a/docs/src/content/docs/book/gas-best-practices.mdx
+++ b/docs/src/content/docs/book/gas-best-practices.mdx
@@ -114,9 +114,9 @@ To ensure that a certain [`Address{:tact}`][p] is in the basechain and can be re
 
 See other functions related to the `BasechainAddress{:tact}` struct:
 
-* [`emptyBasechainAddress{:tact}`](/ref/core-addresses#emptybasechainaddress)
-* [`newBasechainAddress{:tact}`](/ref/core-addresses#newbasechainaddress)
-* [`contractBasechainAddress{:tact}`](/ref/core-addresses#contractbasechainaddress)
+* [`emptyBasechainAddress(){:tact}`](/ref/core-addresses#emptybasechainaddress)
+* [`newBasechainAddress(){:tact}`](/ref/core-addresses#newbasechainaddress)
+* [`contractBasechainAddress(){:tact}`](/ref/core-addresses#contractbasechainaddress)
 
 ### Pay attention to "Gas-expensive" badge
 
@@ -248,9 +248,38 @@ fun example() {
 }
 ```
 
+### Use `SignedBundle` to verify signatures in external message receivers
+
+When handling [external messages](/book/external), the [`SignedBundle{:tact}`](/ref/core-crypto#signedbundle) [struct][struct] provides a gas-efficient way to verify message signatures. This approach is particularly useful for wallet contracts and other contracts that need secure user authorization.
+
+The `SignedBundle{:tact}` contains both the signature and the non-serialized data of the enclosing struct or message struct that is being signed, allowing for convenient verification with the [`SignedBundle.verifySignature(){:tact}`](/ref/core-crypto#signedbundleverifysignature) extension function.
+
+```tact
+contract Wallet(publicKey: Int as uint256) {
+    external(msg: SomeWalletOperation) {
+        // Verifying the signature before accepting the message
+        require(msg.bundle.verifySignature(self.publicKey), "Invalid signature");
+
+        // Now it's safe to accept it
+        acceptMessage();
+
+        // ...and proceed further...
+    }
+}
+
+message SomeWalletOperation {
+    // You must set the SignedBundle as the first field
+    bundle: SignedBundle;
+
+    // Some data to be signed
+    walletId: Int as int32;
+    seqno: Int as uint32;
+}
+```
+
 ## Sending messages
 
-### Prefer `message` and `cashback` to `self.forward`, `self.reply`, and `self.notify`
+### Prefer `message()` and `cashback()` to `self.forward()`, `self.reply()`, and `self.notify()`
 
 Every [contract](/book/contracts) in Tact implicitly [inherits](/book/contracts#traits) the `BaseTrait{:tact}` trait, which contains a number of [internal functions](/book/contracts#internal-functions) for any contract. Those internal functions are gas-expensive for the same reasons as stated earlier.
 
diff --git a/docs/src/content/docs/book/security-best-practices.mdx b/docs/src/content/docs/book/security-best-practices.mdx
index fd34a98a..cf310709 100644
--- a/docs/src/content/docs/book/security-best-practices.mdx
+++ b/docs/src/content/docs/book/security-best-practices.mdx
@@ -32,16 +32,16 @@ message Login {
     data: Slice;
 }
 
-contract Test {
-    // Empty receiver for the deployment,
-    // which forwards the remaining value back to the sender
-    receive() { cashback(sender()) }
-
+contract Test() {
     receive(msg: Login) {
         let publicKey = getPublicKey(msg.privateKey);
 
         require(checkDataSignature(msg.data, msg.signature, publicKey), "Invalid signature!");
     }
+
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
@@ -60,18 +60,22 @@ The following is an example of the incorrect use of a signed integer. In the `Vo
 ```tact
 message Vote { votes: Int as int32 }
 
-contract Sample {
-    votes: Int as uint32 = 0;
-
+contract VoteCounter(
+    votes: Int as uint32,
+) {
     receive(msg: Vote) {
         self.votes += msg.votes;
     }
+
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
 ## Invalid throw values
 
-[Exit codes](/book/exit-codes) $0$ and $1$ indicate normal execution of the compute phase of the transaction. Execution can be unexpectedly aborted by calling a [`throw(){:tact}`](/ref/core-debug#throw) or [similar functions](/ref/core-debug) directly with exit codes $0$ and $1$. This can make debugging very difficult since such aborted execution would be indistinguishable from a normal one.
+[Exit codes](/book/exit-codes) 0 and 1 indicate normal execution of the compute phase of the transaction. Execution can be unexpectedly aborted by calling a [`throw(){:tact}`](/ref/core-debug#throw) or [similar functions](/ref/core-debug) directly with exit codes 0 and 1. This can make debugging very difficult since such aborted execution would be indistinguishable from a normal one.
 
 ##### Do's ✅
 
@@ -83,7 +87,7 @@ require(isDataValid(msg.data), "Invalid data!");
 
 ##### Don'ts ❌
 
-Don't throw $0$ or $1$ directly.
+Don't throw 0 or 1 directly.
 
 ```tact
 throw(0);
@@ -113,11 +117,11 @@ Don't rely on the [`random(){:tact}`](/ref/core-random#random) function.
 
 ```tact
 if (random(1, 10) == 7) {
-  ... send reward ...
+    // ...subsequent logic...
 }
 ```
 
-Don't use randomization in `external_message` receivers, as it remains vulnerable even with randomized logical time.
+Don't use randomization in [`external(){:tact}`](/book/external) message receivers, as it remains vulnerable even with randomized logical time.
 
 ## Optimized message handling
 
@@ -128,14 +132,16 @@ String parsing from human-friendly formats into machine-readable binary structur
 Perform string parsing from human-readable formats into machine-readable binary structures **off-chain** to keep the contract efficient.
 
 ```tact
-message Sample {
-    parsedField: Slice;
-}
+message Sample { parsedField: Slice }
 
-contract Example {
+contract Example() {
     receive(msg: Sample) {
         // Process msg.parsedField directly
     }
+
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
@@ -151,6 +157,10 @@ contract Example {
         // Parsing occurs on-chain, which is inefficient
         let parsed = field.fromBase64();
     }
+
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
@@ -163,12 +173,17 @@ Be careful with the `Out of gas error`. It cannot be handled, so try to pre-calc
 ```tact
 message Vote { votes: Int as int32 }
 
-contract Example {
+contract VoteCounter() {
     const voteGasUsage = 10000; // precompute with tests
 
     receive(msg: Vote) {
         require(context().value > getComputeFee(self.voteGasUsage, false), "Not enough gas!");
+        // ...subsequent logic...
     }
+
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
@@ -183,19 +198,25 @@ Use the [`Ownable{:tact}`](/ref/stdlib-ownable) trait.
 ```tact
 import "@stdlib/ownable";
 
+message Inc { amount: Int as uint32 }
+
 contract Counter with Ownable {
     owner: Address;
     val: Int as uint32;
 
     init() {
-        self.owner = address("OWNER_ADDRESS");
+        self.owner = address("...SOME ADDRESS...");
         self.val = 0;
     }
 
-    receive("admin-double") {
+    receive(msg: Inc) {
         self.requireOwner();
-        self.val = self.val * 2;
+        self.val += msg.amount;
     }
+
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
@@ -204,7 +225,7 @@ contract Counter with Ownable {
 Do not execute a message without validating the sender's identity!
 
 ```tact
-contract Example {
+contract Jetton {
     myJettonWalletAddress: Address;
     myJettonAmount: Int as coins = 0;
 
@@ -216,13 +237,14 @@ contract Example {
         );
     }
 
-    // Empty receiver for the deployment,
-    // which forwards the remaining value back to the sender
-    receive() { cashback(sender()) }
-
     receive(msg: JettonTransferNotification) {
+        // There's no check of the ownership here!
         self.myJettonAmount += msg.amount;
     }
+
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
@@ -237,34 +259,26 @@ To differentiate messages, always include and validate a unique identifier, such
 Alternatively, you can implement replay protection similar to the one in the [highload v3 wallet](https://github.com/ton-blockchain/highload-wallet-contract-v3/blob/main/contracts/highload-wallet-v3.func#L60), which is not based on `seqno`.
 
 ```tact
-message Msg {
-    newMessage: Cell;
-    signature: Slice;
-}
-
-struct DataToVerify {
+message MsgWithSignedData {
+    bundle: SignedBundle;
     seqno: Int as uint64;
-    message: Cell;
+    rawMsg: Cell;
 }
 
-contract Sample {
-    publicKey: Int as uint256;
-    seqno: Int as uint64;
-
-    init(publicKey: Int, seqno: Int) {
-        self.publicKey = publicKey;
-        self.seqno = seqno;
-    }
-
-    external(msg: Msg) {
-        require(checkDataSignature(DataToVerify{
-            seqno: self.seqno,
-            message: msg.newMessage
-        }.toSlice(), msg.signature, self.publicKey), "Invalid signature");
+contract Sample(
+    publicKey: Int as uint256,
+    seqno: Int as uint64,
+) {
+    external(msg: MsgWithSignedData) {
+        require(msg.bundle.verifySignature(self.publicKey), "Invalid signature");
         acceptMessage();
         self.seqno += 1;
-        sendRawMessage(msg.newMessage, 0);
+        sendRawMessage(msg.rawMsg, 0);
     }
+
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
@@ -278,18 +292,21 @@ message Msg {
     signature: Slice;
 }
 
-contract Sample {
-    publicKey: Int as uint256;
-
-    init(publicKey: Int, seqno: Int) {
-        self.publicKey = publicKey;
-    }
-
+contract Sample(
+    publicKey: Int as uint256,
+) {
     external(msg: Msg) {
-        require(checkDataSignature(msg.toSlice(), msg.signature, self.publicKey), "Invalid signature");
+        require(
+            checkDataSignature(msg.toSlice(), msg.signature, self.publicKey),
+            "Invalid signature",
+        );
         acceptMessage();
         sendRawMessage(msg.newMessage, 0);
     }
+
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
@@ -299,27 +316,21 @@ A message cascade can be processed over many blocks. Assume that while one messa
 
 ## Handle/Send bounced messages
 
-Send messages with the bounce flag set to `true{:tact}`, which is the default for the [`send(){:tact}`](/ref/core-send#send) function. Messages bounce when the execution of a contract fails. You may want to handle this by rolling back the state of the contract using [`try...catch{:tact}`](/book/statements#try-catch) statements and performing additional processing depending on your logic.
+Send messages with the bounce flag set to `true{:tact}`, which is the default for the [`send(){:tact}`](/ref/core-send#send), [`message(){:tact}`](/ref/core-send#message), and [`deploy(){:tact}`](/ref/core-send#deploy) functions. Messages bounce when the execution of a contract fails. You may want to handle this by rolling back the state of the contract using [`try...catch{:tact}`](/book/statements#try-catch) statements and performing additional processing depending on your logic.
 
 ##### Do's ✅
 
 Handle bounced messages via a [bounced message receiver](/book/bounced/#bounced-message-receiver) to correctly react to failed messages.
 
 ```tact
-contract JettonDefaultWallet {
+contract JettonWalletSample(
+    owner: Address,
+    master: Address,
+    balance: Int,
+) {
     const minTonsForStorage: Int = ton("0.01");
     const gasConsumption: Int = ton("0.01");
 
-    balance: Int;
-    owner: Address;
-    master: Address;
-
-    init(master: Address, owner: Address) {
-        self.balance = 0;
-        self.owner = owner;
-        self.master = master;
-    }
-
     receive(msg: TokenBurn) {
         let ctx: Context = context();
         require(ctx.sender == self.owner, "Invalid sender");
@@ -328,25 +339,33 @@ contract JettonDefaultWallet {
         require(self.balance >= 0, "Invalid balance");
 
         let fwdFee: Int = ctx.readForwardFee();
-        require(ctx.value > fwdFee + 2 * self.gasConsumption + self.minTonsForStorage, "Invalid value - Burn");
+        require(
+            ctx.value >
+            fwdFee + 2 * self.gasConsumption + self.minTonsForStorage,
+            "Invalid value - Burn",
+        );
 
-        send(SendParameters{
+        message(MessageParameters {
             to: self.master,
             value: 0,
             mode: SendRemainingValue,
             bounce: true,
-            body: TokenBurnNotification{
+            body: TokenBurnNotification {
                 queryId: msg.queryId,
                 amount: msg.amount,
                 owner: self.owner,
-                response_destination: self.owner
-            }.toCell()
+                response_destination: self.owner,
+            }.toCell(),
         });
     }
 
     bounced(src: bounced<TokenBurnNotification>) {
         self.balance = self.balance + src.amount;
     }
+
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
@@ -370,36 +389,23 @@ Return excesses using a [Message][message] with the `0xd53276db` opcode.
 message(0xd53276db) Excesses {}
 message Vote { votes: Int as int32 }
 
-contract Sample {
-    votes: Int as uint32 = 0;
-
+contract Sample(
+    votes: Int as uint32,
+) {
     receive(msg: Vote) {
         self.votes += msg.votes;
 
-        send(SendParameters{
+        message(MessageParameters{
             to: sender(),
             value: 0,
             mode: SendRemainingValue | SendIgnoreErrors,
             body: Excesses{}.toCell(),
         });
     }
-}
-```
 
-Alternatively, you can leverage the standard [`notify(){:tact}`](/ref/core-base/#self-notify) or [`forward(){:tact}`](/ref/core-base/#self-forward) functions.
-
-```tact
-message(0xd53276db) Excesses {}
-message Vote { votes: Int as int32 }
-
-contract Sample {
-    votes: Int as uint32 = 0;
-
-    receive(msg: Vote) {
-        self.votes += msg.votes;
-
-        self.notify(Excesses{}.toCell());
-    }
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
@@ -414,36 +420,48 @@ Thus, any on-chain communication is asynchronous and done by sending and receivi
 Exchange messages to pull data from another contract.
 
 ```tact
+message GetMoney {}
 message ProvideMoney {}
 message TakeMoney { money: Int as coins }
 
-contract OneContract {
-    money: Int as coins;
-
-    init(money: Int) {
-        self.money = money;
-    }
-
+contract OneContract(
+    money: Int as coins,
+) {
     receive(msg: ProvideMoney) {
-        self.reply(TakeMoney{money: self.money}.toCell());
+        message(MessageParameters{
+            to: sender(),
+            value: 0,
+            mode: SendRemainingValue | SendIgnoreErrors,
+            body: TakeMoney{money: self.money}.toCell(),
+        });
     }
-}
 
-contract AnotherContract {
-    oneContractAddress: Address;
-
-    init(oneContractAddress: Address) {
-        self.oneContractAddress = oneContractAddress;
-    }
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
+}
 
-    receive("get money") {
-        self.forward(self.oneContractAddress, ProvideMoney{}.toCell(), false, null);
+contract AnotherContract(
+    oneContractAddress: Address,
+) {
+    receive(_: GetMoney) {
+        message(MessageParameters{
+            to: self.oneContractAddress,
+            value: 0,
+            mode: SendRemainingValue | SendIgnoreErrors,
+            bounce: false,
+            body: ProvideMoney{}.toCell(),
+        });
     }
 
     receive(msg: TakeMoney) {
         require(sender() == self.oneContractAddress, "Invalid money provider!");
-        // Money processing
+        // ...further processing...
     }
+
+    // Empty receiver for the deployment,
+    // which forwards the remaining value back to the sender
+    receive() { cashback(sender()) }
 }
 ```
 
diff --git a/docs/src/content/docs/ref/core-cells.mdx b/docs/src/content/docs/ref/core-cells.mdx
index 59b429a1..973d3d1f 100644
--- a/docs/src/content/docs/ref/core-cells.mdx
+++ b/docs/src/content/docs/ref/core-cells.mdx
@@ -216,6 +216,8 @@ Stores an unsigned `bits`-bit `value` into the copy of the [`Builder{:tact}`][bu
 
 Attempts to store a negative `value` or provide an insufficient or out-of-bounds `bits` number throw an exception with [exit code 5](/book/exit-codes#5): `Integer out of expected range`.
 
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
 Usage example:
 
 ```tact
@@ -235,6 +237,8 @@ Stores a signed `bits`-bit `value` into the copy of the [`Builder{:tact}`][build
 
 Attempts to provide an insufficient or out-of-bounds `bits` number throw an exception with [exit code 5](/book/exit-codes#5): `Integer out of expected range`.
 
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
 Usage example:
 
 ```tact
@@ -250,7 +254,9 @@ extends fun storeBool(self: Builder, value: Bool): Builder;
 
 Extension function for the [`Builder{:tact}`][builder] type.
 
-Stores a [`Bool{:tact}`][bool] `value` into the copy of the [`Builder{:tact}`][builder]. Writes $1$ as a single bit if `value` is `true{:tact}`, and writes $0$ otherwise. Returns that copy of the [`Builder{:tact}`][builder].
+Stores a [`Bool{:tact}`][bool] `value` into the copy of the [`Builder{:tact}`][builder]. Writes 1 as a single bit if `value` is `true{:tact}`, and writes 0 otherwise. Returns that copy of the [`Builder{:tact}`][builder].
+
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
 
 Usage example:
 
@@ -272,6 +278,8 @@ Extension function for the [`Builder{:tact}`][builder] type.
 
 An alias to [`Builder.storeBool(){:tact}`](#builderstorebool).
 
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
 Usage example:
 
 ```tact
@@ -290,6 +298,8 @@ Extension function for the [`Builder{:tact}`][builder] type.
 
 Appends all data from the `other` builder to the copy of the `self` builder. Returns that copy.
 
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
 Usage example:
 
 ```tact
@@ -311,6 +321,8 @@ Extension function for the [`Builder{:tact}`][builder] type.
 
 Stores a `slice` into a copy of the [`Builder{:tact}`][builder]. Returns that copy.
 
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
 Usage example:
 
 ```tact
@@ -331,6 +343,8 @@ Stores (serializes) an unsigned [`Int{:tact}`][int] `value` in the range from $0
 
 Attempts to store an out-of-bounds `value` throw an exception with [exit code 5](/book/exit-codes#5): `Integer out of expected range`.
 
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
 This is the most common way of storing [nanoToncoins](/book/integers#nanotoncoin).
 
 Usage example:
@@ -358,6 +372,8 @@ Extension function for the [`Builder{:tact}`][builder] type.
 
 An alias to [`Builder.storeCoins(){:tact}`](#builderstorecoins).
 
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
 Usage example:
 
 ```tact
@@ -385,6 +401,8 @@ Similar to [`Builder.storeCoins(){:tact}`](#builderstorecoins), but with a diffe
 
 Attempts to store an out-of-bounds `value` throw an exception with [exit code 5](/book/exit-codes#5): `Integer out of expected range`.
 
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
 Usage example:
 
 ```tact
@@ -412,6 +430,8 @@ Stores (serializes) an unsigned [`Int{:tact}`][int] `value` in the range from $0
 
 Attempts to store an out-of-bounds `value` throw an exception with [exit code 5](/book/exit-codes#5): `Integer out of expected range`.
 
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
 Usage example:
 
 ```tact
@@ -439,6 +459,8 @@ Similar to [`Builder.storeVarUint32(){:tact}`](#builderstorevaruint32), but with
 
 Attempts to store an out-of-bounds `value` throw an exception with [exit code 5](/book/exit-codes#5): `Integer out of expected range`.
 
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
 Usage example:
 
 ```tact
@@ -464,6 +486,8 @@ Stores the `address` in a copy of the [`Builder{:tact}`][builder]. Returns that
 
 Attempts to store an `address` into the [`Builder{:tact}`][builder] `self{:tact}`, if `self{:tact}` cannot fit it, throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
 
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
+
 Usage example:
 
 ```tact
@@ -483,8 +507,9 @@ Extension function for the [`Builder{:tact}`][builder] type.
 
 Stores the basechain `address` in the copy of the [`Builder{:tact}`][builder] and returns that copy.
 
-If the address has a `null` hash, stores $0b00$ (`addr_none`).
-Otherwise, store the full address with prefix $0b100$ followed by workchain ($0$) and the 256-bit hash.
+If the address has a `null{:tact}` hash, stores two zero bits `0b00` (`addr_none`). Otherwise, stores the full address with the three-bit prefix `0b100`, followed by the 8-bit workchain ID set to 0 and the 256-bit hash.
+
+Attempts to store more data than the [`Builder{:tact}`][builder] `self{:tact}` can fit throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
 
 Usage example:
 
@@ -819,8 +844,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Loads a single bit and returns a [`Bool{:tact}`][bool] value from the [`Slice{:tact}`][slice]. Reads `true{:tact}` if the loaded bit is equal to $1$, and reads `false{:tact}` otherwise.
 
-Attempts to load such [`Bool{:tact}`][bool] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to load more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -842,8 +865,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Skips a single bit from the [`Slice{:tact}`][slice]. Similar to discarding the return value of `Slice.loadBool()`.
 
-Attempts to skip such [`Bool{:tact}`][bool] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to skip more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -887,8 +908,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Loads and returns a [serialized](#builderstorecoins) unsigned [`Int{:tact}`][int] value in the range from $0$ to $2^{120} - 1$ inclusive from the [`Slice{:tact}`][slice]. This value usually represents the amount in [nanoToncoins](/book/integers#nanotoncoin).
 
-Attempts to load such [`Int{:tact}`][int] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to load more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -916,8 +935,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Skips a serialized unsigned [`Int{:tact}`][int] value in the range from $0$ to $2^{120} - 1$ inclusive from the [`Slice{:tact}`][slice]. Similar to discarding the return value of `Slice.loadCoins()`.
 
-Attempts to skip such [`Int{:tact}`][int] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to skip more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -993,8 +1010,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Similar to [`Slice.loadCoins(){:tact}`](#sliceloadcoins), but with a different `value` range: from $-2^{119}$ to $2^{119} - 1$ inclusive.
 
-Attempts to load such [`Int{:tact}`][int] when [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to load more data than [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -1022,8 +1037,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Similar to `Slice.skipCoins()`, but with a different `value` range: from $-2^{119}$ to $2^{119} - 1$ inclusive.
 
-Attempts to skip such [`Int{:tact}`][int] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to skip more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -1048,8 +1061,6 @@ extends mutates fun loadVarUint32(self: Slice): Int;
 
 Loads and returns a [serialized](#builderstorevaruint32) unsigned [`Int{:tact}`][int] value in the range from $0$ to $2^{248} - 1$ inclusive from the [`Slice{:tact}`][slice].
 
-Attempts to load such [`Int{:tact}`][int] when [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to load more data than [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -1077,8 +1088,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Skips a serialized unsigned [`Int{:tact}`][int] value in the range from $0$ to $2^{248} - 1$ inclusive from the [`Slice{:tact}`][slice]. Similar to discarding the return value of `Slice.loadVarUint32()`.
 
-Attempts to skip such [`Int{:tact}`][int] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to skip more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -1103,8 +1112,6 @@ extends mutates fun loadVarInt32(self: Slice): Int;
 
 Similar to [`Slice.loadVarUint32(){:tact}`](#sliceloadvaruint32), but with a different `value` range: from $-2^{247}$ to $2^{247} - 1$ inclusive.
 
-Attempts to load such [`Int{:tact}`][int] when [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to load more data than [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -1132,8 +1139,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Similar to `Slice.skipVarUint32()`, but with a different `value` range: from $-2^{247}$ to $2^{247} - 1$ inclusive.
 
-Attempts to skip such [`Int{:tact}`][int] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to skip more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -1158,8 +1163,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Loads and returns an [`Address{:tact}`][p] from the [`Slice{:tact}`][slice].
 
-Attempts to load such [`Address{:tact}`][p] when [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to load more data than [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -1181,8 +1184,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Skips an [`Address{:tact}`][p] from the [`Slice{:tact}`][slice].
 
-Attempts to skip such [`Address{:tact}`][p] when [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to skip more data than [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -1207,8 +1208,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Loads the next reference from the [`Slice{:tact}`][slice] as a [`Cell{:tact}`][cell].
 
-Attempts to load such reference [`Cell{:tact}`][cell] when [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to load more data than [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage examples:
@@ -1236,8 +1235,6 @@ Extension function for the [`Slice{:tact}`][slice] type.
 
 Preloads the next reference from the [`Slice{:tact}`][slice] as a [`Cell{:tact}`][cell]. Doesn't modify the original [`Slice{:tact}`][slice].
 
-Attempts to preload such a reference [`Cell{:tact}`][cell] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to preload more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage examples:
@@ -1268,8 +1265,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Skips the next reference from the [`Slice{:tact}`][slice]. Similar to discarding the return value of `Slice.loadRef()`.
 
-Attempts to skip such reference [`Cell{:tact}`][cell] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to skip more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -1297,8 +1292,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Loads a single bit from the [`Slice{:tact}`][slice]: if it's $1$, the referenced [`Cell{:tact}`][cell] is loaded and returned. If the loaded bit is $0$, nothing else is loaded and `null{:tact}` is returned.
 
-Attempts to load such a reference [`Cell{:tact}`][cell] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to load more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
@@ -1325,8 +1318,6 @@ Extension function for the [`Slice{:tact}`][slice] type.
 
 Preloads a single bit from the [`Slice{:tact}`][slice]: if it's $1$, the referenced [`Cell{:tact}`][cell] is preloaded and returned. If the preloaded bit is $0$, `null{:tact}` is returned. Doesn't modify the original [`Slice{:tact}`][slice].
 
-Attempts to preload such a reference [`Cell{:tact}`][cell] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to preload more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage examples:
@@ -1358,8 +1349,6 @@ Extension mutation function for the [`Slice{:tact}`][slice] type.
 
 Skips `Cell?` from the [`Slice{:tact}`][slice]. Similar to discarding the return value of `Slice.loadMaybeRef()`.
 
-Attempts to skip such reference [`Cell{:tact}`][cell] when the [`Slice{:tact}`][slice] doesn't contain it throw an exception with [exit code 8](/book/exit-codes#8): `Cell overflow`.
-
 Attempts to skip more data than the [`Slice{:tact}`][slice] contains throw an exception with [exit code 9](/book/exit-codes#9): `Cell underflow`.
 
 Usage example:
diff --git a/format.build.ts b/format.build.ts
new file mode 100644
index 00000000..017a6afe
--- /dev/null
+++ b/format.build.ts
@@ -0,0 +1,85 @@
+import { spawnSync } from "child_process";
+
+const EXTENSIONS = ["js", "jsx", "ts", "tsx", "json", "css", "scss", "md"];
+const args = process.argv.slice(2);
+const checkOnly = args.includes("--check");
+const prettierFlag = checkOnly ? "--check" : "--write";
+
+const baseResult = spawnSync("git", ["merge-base", "HEAD", "main"], {
+    encoding: "utf8",
+});
+if (baseResult.error) {
+    console.error(baseResult.error);
+    process.exit(1);
+}
+const base = baseResult.stdout.trim();
+if (!base) {
+    console.error("Failed to find merge base with main");
+    process.exit(1);
+}
+
+const committed = spawnSync(
+    "git",
+    ["diff", "--name-only", "--diff-filter=ACM", base, "HEAD"],
+    { encoding: "utf8" },
+);
+if (committed.error) {
+    console.error(committed.error);
+    process.exit(1);
+}
+
+const staged = spawnSync("git", ["diff", "--name-only", "--cached"], {
+    encoding: "utf8",
+});
+if (staged.error) {
+    console.error(staged.error);
+    process.exit(1);
+}
+
+const unstaged = spawnSync("git", ["diff", "--name-only"], {
+    encoding: "utf8",
+});
+if (unstaged.error) {
+    console.error(unstaged.error);
+    process.exit(1);
+}
+
+const untracked = spawnSync(
+    "git",
+    ["ls-files", "--others", "--exclude-standard"],
+    { encoding: "utf8" },
+);
+if (untracked.error) {
+    console.error(untracked.error);
+    process.exit(1);
+}
+
+const fileSet = new Set<string>();
+for (const list of [
+    committed.stdout,
+    staged.stdout,
+    unstaged.stdout,
+    untracked.stdout,
+]) {
+    list.split("\n")
+        .filter(Boolean)
+        .forEach((f) => fileSet.add(f));
+}
+
+const files = Array.from(fileSet).filter((f) =>
+    EXTENSIONS.includes(f.split(".").pop() || ""),
+);
+if (files.length === 0) process.exit(0);
+
+const result = spawnSync(
+    "yarn",
+    ["prettier", prettierFlag, "--ignore-unknown", ...files],
+    { stdio: "inherit" },
+);
+if (result.error) {
+    console.error(result.error);
+    process.exit(1);
+}
+if (result.status && result.status !== 0) {
+    process.exit(result.status);
+}
diff --git a/jest-coverage.config.js b/jest-coverage.config.js
new file mode 100644
index 00000000..3b44c924
--- /dev/null
+++ b/jest-coverage.config.js
@@ -0,0 +1,15 @@
+const mainConfig = require("./jest.config");
+
+module.exports = {
+    ...mainConfig,
+
+    collectCoverage: true,
+    coverageDirectory: "coverage",
+    coverageReporters: ["text", "lcov", "html"],
+    coveragePathIgnorePatterns: [
+        "/node_modules/",
+        "/dist/",
+        "/output/",
+        "/func/",
+    ],
+};
diff --git a/package.json b/package.json
index 5e83dfa2..c18b6fbd 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "$schema": "https://raw.githubusercontent.com/SchemaStore/schemastore/refs/heads/master/src/schemas/json/package.json",
   "name": "@tact-lang/compiler",
-  "version": "1.6.5",
+  "version": "1.6.6",
   "repository": {
     "type": "git",
     "url": "git+https://github.com/tact-lang/tact.git"
@@ -48,13 +48,15 @@
     "bench:update": "yarn gen:contracts:benchmarks && cross-env PRINT_TABLE=true ts-node src/benchmarks/update.build.ts",
     "bench:add": "ts-node src/benchmarks/prompt.build.ts && yarn gen:contracts:benchmarks && cross-env PRINT_TABLE=true ADD=true ts-node src/benchmarks/update.build.ts",
     "coverage": "cross-env COVERAGE=true NODE_OPTIONS=--max_old_space_size=4096 jest --config=./jest-ci.config.js",
+    "istanbul": "jest --coverage",
     "type": "tsc --noEmit",
     "lint": "yarn eslint .",
-    "fmt": "yarn prettier -l -w .",
+    "fmt": "ts-node format.build.ts",
     "fmt:check": "yarn prettier --check .",
+    "fmt:check:fast": "ts-node format.build.ts",
     "spell": "yarn cspell --no-progress \"**\"",
     "knip": "knip",
-    "lint:all": "yarn to-absolute && yarn gen:stdlib && yarn lint && yarn fmt:check && yarn spell && yarn knip",
+    "lint:all": "yarn to-absolute && yarn gen:stdlib && yarn lint && yarn fmt:check:fast && yarn spell && yarn knip",
     "all": "yarn clean && yarn gen && yarn build && yarn coverage && yarn lint:all",
     "next-version": "ts-node version.build.ts",
     "random-ast": "ts-node ./src/ast/random-ast.ts",
diff --git a/src/abi/global.ts b/src/abi/global.ts
index 2715ca0a..7017c5dc 100644
--- a/src/abi/global.ts
+++ b/src/abi/global.ts
@@ -8,14 +8,15 @@ import {
 } from "@/generator/writers/writeConstant";
 import { writeExpression } from "@/generator/writers/writeExpression";
 import { idTextErr, throwCompilationError } from "@/error/errors";
-import { getErrorId } from "@/types/resolveErrors";
+import { evaluateRequireErrorString, getErrorId } from "@/types/resolveErrors";
 import type { AbiFunction } from "@/abi/AbiFunction";
 import path from "path";
 import { cwd } from "process";
 import { posixNormalize } from "@/utils/filePath";
 import { ensureString } from "@/optimizer/interpreter";
-import { isLiteral } from "@/ast/ast-helpers";
+import { getAstFactory, isLiteral } from "@/ast/ast-helpers";
 import { sha256 } from "@/utils/sha256";
+import { getAstUtil } from "@/ast/util";
 
 export const GlobalFunctions: Map<string, AbiFunction> = new Map([
     [
@@ -104,7 +105,12 @@ export const GlobalFunctions: Map<string, AbiFunction> = new Map([
                     );
                 }
                 const resolved1 = resolved[1]!;
-                const str = ensureString(resolved1).value;
+                const evaluated = evaluateRequireErrorString(
+                    resolved1,
+                    ctx.ctx,
+                    getAstUtil(getAstFactory()),
+                );
+                const str = ensureString(evaluated).value;
                 return `throw_unless(${getErrorId(str, ctx.ctx)}, ${writeExpression(resolved[0]!, ctx)})`;
             },
         },
diff --git a/src/benchmarks/contracts/nft-collection.tact b/src/benchmarks/contracts/nft-collection.tact
index cecfdf74..ddda7260 100644
--- a/src/benchmarks/contracts/nft-collection.tact
+++ b/src/benchmarks/contracts/nft-collection.tact
@@ -30,18 +30,7 @@ contract NFTCollection {
         self.royaltyParams = royaltyParams;
 
         self.commonCode = codeOf NFTItem;
-        self.commonData = beginCell().storeBit(false).storeAddress(myAddress()); // Use lazy bit 
-    }
-
-    inline fun deployNFTItem(itemIndex: Int, amount: Int, initNFTBody: Cell) {
-        let data: Cell = self.commonData.storeUint(itemIndex, 64).endCell(); // IndexSizeBits = 64
-
-        deploy(DeployParameters {
-            value: amount,
-            body: initNFTBody,
-            init: StateInit { code: self.commonCode, data: data },
-            mode: SendPayFwdFeesSeparately,
-        });
+        self.commonData = beginCell().storeBit(false).storeAddress(myAddress()); // Use lazy bit
     }
 
     receive() {} // ignore empty messages
@@ -63,7 +52,7 @@ contract NFTCollection {
         throwUnless(IncorrectSender, sender() == self.owner);
         throwUnless(IncorrectIndex, msg.itemIndex <= self.nextItemIndex);
 
-        self.deployNFTItem(msg.itemIndex, msg.amount, msg.initNFTBody);
+        deployNFTItem(self.commonCode, msg.itemIndex, msg.amount, msg.initNFTBody, self.commonData);
 
         if (msg.itemIndex == self.nextItemIndex) {
             self.nextItemIndex += 1;
@@ -83,7 +72,7 @@ contract NFTCollection {
 
             throwUnless(IncorrectIndexes + counter, currNFTItem.itemIndex!! <= self.nextItemIndex);
 
-            self.deployNFTItem(currNFTItem.itemIndex!!, currNFTItem.item!!.loadCoins(), currNFTItem.item!!.loadRef());
+            deployNFTItem(self.commonCode, currNFTItem.itemIndex!!, currNFTItem.item!!.loadCoins(), currNFTItem.item!!.loadRef(), self.commonData);
             if (currNFTItem.itemIndex!! == self.nextItemIndex) {
                 self.nextItemIndex += 1;
             }
@@ -120,9 +109,20 @@ contract NFTCollection {
         cs.skipRef();
         let commonContent = cs.loadRef().beginParse();
         return beginCell()
-            .storeUint(1, 8) // off-chain tag 
+            .storeUint(1, 8) // off-chain tag
             .storeSlice(commonContent)
             .storeRef(individualNFTContent)
             .endCell();
     }
 }
+
+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 {
+        value: amount,
+        body: initNFTBody,
+        init: StateInit { code: commonCode, data: data },
+        mode: SendPayFwdFeesSeparately,
+    });
+}
diff --git a/src/benchmarks/escrow/results_code_size.json b/src/benchmarks/escrow/results_code_size.json
index 003977d6..dfcbde5e 100644
--- a/src/benchmarks/escrow/results_code_size.json
+++ b/src/benchmarks/escrow/results_code_size.json
@@ -63,6 +63,22 @@
         "cells": "21",
         "bits": "11727"
       }
+    },
+    {
+      "label": "1.6.6 with optimized builder storage",
+      "pr": "https://github.com/tact-lang/tact/pull/2836",
+      "size": {
+        "cells": "20",
+        "bits": "11647"
+      }
+    },
+    {
+      "label": "1.6.6 with optimized __tact_store_address_opt",
+      "pr": "https://github.com/tact-lang/tact/pull/2834",
+      "size": {
+        "cells": "20",
+        "bits": "11575"
+      }
     }
   ]
 }
diff --git a/src/benchmarks/escrow/results_gas.json b/src/benchmarks/escrow/results_gas.json
index cf380128..f835cb1a 100644
--- a/src/benchmarks/escrow/results_gas.json
+++ b/src/benchmarks/escrow/results_gas.json
@@ -209,6 +209,26 @@
         "approveTon": "6738",
         "cancelTon": "4639"
       }
+    },
+    {
+      "label": "1.6.6 with optimized builder storage",
+      "pr": "https://github.com/tact-lang/tact/pull/2836",
+      "gas": {
+        "fundingTon": "4363",
+        "changeCode": "4454",
+        "approveTon": "6738",
+        "cancelTon": "4639"
+      }
+    },
+    {
+      "label": "1.6.6 with optimized __tact_store_address_opt",
+      "pr": "https://github.com/tact-lang/tact/pull/2834",
+      "gas": {
+        "fundingTon": "4325",
+        "changeCode": "4416",
+        "approveTon": "6738",
+        "cancelTon": "4639"
+      }
     }
   ]
 }
diff --git a/src/benchmarks/jetton/results_code_size.json b/src/benchmarks/jetton/results_code_size.json
index 383c2eae..09c32ad1 100644
--- a/src/benchmarks/jetton/results_code_size.json
+++ b/src/benchmarks/jetton/results_code_size.json
@@ -119,6 +119,16 @@
         "wallet cells": "16",
         "wallet bits": "8211"
       }
+    },
+    {
+      "label": "1.6.6 with optimized __tact_store_address_opt",
+      "pr": "https://github.com/tact-lang/tact/pull/2834",
+      "size": {
+        "minter cells": "30",
+        "minter bits": "14672",
+        "wallet cells": "16",
+        "wallet bits": "8203"
+      }
     }
   ]
 }
diff --git a/src/benchmarks/nft/results_code_size.json b/src/benchmarks/nft/results_code_size.json
index a06c9a98..c64a5ea2 100644
--- a/src/benchmarks/nft/results_code_size.json
+++ b/src/benchmarks/nft/results_code_size.json
@@ -79,6 +79,36 @@
         "item cells": "12",
         "item bits": "6530"
       }
+    },
+    {
+      "label": "1.6.6 with deployNFTItem outside contract",
+      "pr": null,
+      "size": {
+        "collection cells": "43",
+        "collection bits": "22786",
+        "item cells": "12",
+        "item bits": "6530"
+      }
+    },
+    {
+      "label": "1.6.6 with optimized builder storage",
+      "pr": "https://github.com/tact-lang/tact/pull/2836",
+      "size": {
+        "collection cells": "43",
+        "collection bits": "22386",
+        "item cells": "12",
+        "item bits": "6530"
+      }
+    },
+    {
+      "label": "1.6.6 with optimized __tact_store_address_opt",
+      "pr": "https://github.com/tact-lang/tact/pull/2834",
+      "size": {
+        "collection cells": "43",
+        "collection bits": "22322",
+        "item cells": "12",
+        "item bits": "6498"
+      }
     }
   ]
 }
diff --git a/src/benchmarks/nft/results_gas.json b/src/benchmarks/nft/results_gas.json
index 0e6e03c3..e7961f69 100644
--- a/src/benchmarks/nft/results_gas.json
+++ b/src/benchmarks/nft/results_gas.json
@@ -79,6 +79,26 @@
         "deploy nft": "11500",
         "batch deploy nft": "704448"
       }
+    },
+    {
+      "label": "1.6.6 with deployNFTItem outside contract",
+      "pr": null,
+      "gas": {
+        "transfer": "7634",
+        "get static data": "5763",
+        "deploy nft": "11328",
+        "batch deploy nft": "661073"
+      }
+    },
+    {
+      "label": "1.6.6 with optimized builder storage",
+      "pr": "https://github.com/tact-lang/tact/pull/2836",
+      "gas": {
+        "transfer": "7634",
+        "get static data": "5763",
+        "deploy nft": "10651",
+        "batch deploy nft": "660506"
+      }
     }
   ]
 }
diff --git a/src/benchmarks/notcoin/results_code_size.json b/src/benchmarks/notcoin/results_code_size.json
index 2541b2f2..604e5dc7 100644
--- a/src/benchmarks/notcoin/results_code_size.json
+++ b/src/benchmarks/notcoin/results_code_size.json
@@ -59,6 +59,16 @@
         "wallet cells": "14",
         "wallet bits": "8084"
       }
+    },
+    {
+      "label": "1.6.6 with optimized __tact_store_address_opt",
+      "pr": "https://github.com/tact-lang/tact/pull/2834",
+      "size": {
+        "minter cells": "30",
+        "minter bits": "16222",
+        "wallet cells": "14",
+        "wallet bits": "8076"
+      }
     }
   ]
 }
diff --git a/src/benchmarks/sbt/results_code_size.json b/src/benchmarks/sbt/results_code_size.json
index 5833c5e4..5fbcb711 100644
--- a/src/benchmarks/sbt/results_code_size.json
+++ b/src/benchmarks/sbt/results_code_size.json
@@ -15,6 +15,22 @@
         "item cells": "22",
         "item bits": "12899"
       }
+    },
+    {
+      "label": "1.6.6 with optimized builder storage",
+      "pr": "https://github.com/tact-lang/tact/pull/2836",
+      "size": {
+        "item cells": "22",
+        "item bits": "12803"
+      }
+    },
+    {
+      "label": "1.6.6 with optimized __tact_store_address_opt",
+      "pr": "https://github.com/tact-lang/tact/pull/2834",
+      "size": {
+        "item cells": "22",
+        "item bits": "12707"
+      }
     }
   ]
 }
diff --git a/src/benchmarks/sbt/results_gas.json b/src/benchmarks/sbt/results_gas.json
index d871d4f2..dcc3b204 100644
--- a/src/benchmarks/sbt/results_gas.json
+++ b/src/benchmarks/sbt/results_gas.json
@@ -25,6 +25,32 @@
         "revoke": "5253",
         "take excess": "8132"
       }
+    },
+    {
+      "label": "1.6.6 with optimized builder storage",
+      "pr": "https://github.com/tact-lang/tact/pull/2836",
+      "gas": {
+        "deploy": "4841",
+        "request owner": "7302",
+        "prove ownership": "7600",
+        "get static data": "7267",
+        "destroy": "7760",
+        "revoke": "5217",
+        "take excess": "8096"
+      }
+    },
+    {
+      "label": "1.6.6 with optimized __tact_store_address_opt",
+      "pr": "https://github.com/tact-lang/tact/pull/2834",
+      "gas": {
+        "deploy": "4841",
+        "request owner": "7302",
+        "prove ownership": "7600",
+        "get static data": "7267",
+        "destroy": "7684",
+        "revoke": "5217",
+        "take excess": "8096"
+      }
     }
   ]
 }
diff --git a/src/cli/colors.ts b/src/cli/colors.ts
index e7e3c272..1d4d934c 100644
--- a/src/cli/colors.ts
+++ b/src/cli/colors.ts
@@ -1,9 +1,6 @@
 import { release } from "os";
 
 export const isColorSupported = () => {
-    if (process.env.CI) {
-        return true;
-    }
     if (process.platform === "win32") {
         const [major, _, build] = release().split(".").map(Number);
         // Windows 10, Build 10586+
diff --git a/src/cli/tact-fmt/__snapshots__/e2e.spec.ts.snap b/src/cli/tact-fmt/__snapshots__/e2e.spec.ts.snap
index d90d19f0..1d7fc290 100644
--- a/src/cli/tact-fmt/__snapshots__/e2e.spec.ts.snap
+++ b/src/cli/tact-fmt/__snapshots__/e2e.spec.ts.snap
@@ -1,5 +1,40 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
+exports[`tact-fmt foo.tact Check and write flags simultaneously 1`] = `
+{
+  "code": 1,
+  "kind": "exited",
+  "stderr": "",
+  "stdout": "Cannot use '--check' and '--write' simultaneously
+",
+}
+`;
+
+exports[`tact-fmt foo.tact Check on directory with formatted files 1`] = `
+{
+  "code": 0,
+  "kind": "exited",
+  "stderr": "",
+  "stdout": "Checking formatting...
+All Tact files use Tact code style!
+",
+}
+`;
+
+exports[`tact-fmt foo.tact Check on directory with not formatted files 1`] = `
+{
+  "code": 1,
+  "kind": "exited",
+  "stderr": "",
+  "stdout": "Checking formatting...
+[warn] file1.tact
+[warn] file2.tact
+[warn] file3.tact
+Code style issues found in the above file. Run tact-fmt with --write to fix.
+",
+}
+`;
+
 exports[`tact-fmt foo.tact Default run 1`] = `
 {
   "code": 0,
diff --git a/src/cli/tact-fmt/e2e.spec.ts b/src/cli/tact-fmt/e2e.spec.ts
index 3a20c6b9..05b58585 100644
--- a/src/cli/tact-fmt/e2e.spec.ts
+++ b/src/cli/tact-fmt/e2e.spec.ts
@@ -48,6 +48,8 @@ describe("tact-fmt foo.tact", () => {
         writeFileSync(file, goodContract);
         const result = await tactFmt(file);
         expect(result).toMatchObject({ kind: "exited", code: 0 });
+
+        rmSync(file);
     });
 
     testExceptWindows("Default run", async () => {
@@ -56,6 +58,8 @@ describe("tact-fmt foo.tact", () => {
         writeFileSync(file, goodContract);
         const result = await tactFmt(file);
         expect(result).toMatchSnapshot();
+
+        rmSync(file);
     });
 
     testExceptWindows("Default run with write to file", async () => {
@@ -101,12 +105,73 @@ describe("tact-fmt foo.tact", () => {
         rmSync(innerDir, { recursive: true });
     });
 
+    testExceptWindows("Check on directory with formatted files", async () => {
+        const dir = outputDir;
+        const innerDir = join(dir, "inner");
+        const innerInnerDir = join(innerDir, "inner-2");
+
+        await mkdir(dir, { recursive: true });
+        await mkdir(innerDir, { recursive: true });
+        await mkdir(innerInnerDir, { recursive: true });
+
+        // inner
+        //   file1.tact
+        //   inner-2
+        //      file2.tact
+        //      file3.tact
+        const file1 = join(innerDir, "file1.tact");
+        const file2 = join(innerInnerDir, "file2.tact");
+        const file3 = join(innerInnerDir, "file3.tact");
+
+        writeFileSync(file1, "fun foo1() {}\n");
+        writeFileSync(file2, "fun foo2() {}\n");
+        writeFileSync(file3, "fun foo3() {}\n");
+
+        const result = await tactFmt(innerDir, "--check");
+        expect(result).toMatchSnapshot();
+
+        rmSync(innerDir, { recursive: true });
+    });
+
+    testExceptWindows(
+        "Check on directory with not formatted files",
+        async () => {
+            const dir = outputDir;
+            const innerDir = join(dir, "inner");
+            const innerInnerDir = join(innerDir, "inner-2");
+
+            await mkdir(dir, { recursive: true });
+            await mkdir(innerDir, { recursive: true });
+            await mkdir(innerInnerDir, { recursive: true });
+
+            // inner
+            //   file1.tact
+            //   inner-2
+            //      file2.tact
+            //      file3.tact
+            const file1 = join(innerDir, "file1.tact");
+            const file2 = join(innerInnerDir, "file2.tact");
+            const file3 = join(innerInnerDir, "file3.tact");
+
+            writeFileSync(file1, "fun foo1() {  }\n");
+            writeFileSync(file2, "fun foo2() {  }\n");
+            writeFileSync(file3, "fun foo3() {  }\n");
+
+            const result = await tactFmt(innerDir, "--check");
+            expect(result).toMatchSnapshot();
+
+            rmSync(innerDir, { recursive: true });
+        },
+    );
+
     testExceptWindows("With error", async () => {
         await mkdir(outputDir, { recursive: true });
         const file = join(outputDir, "contract.tact");
         writeFileSync(file, badContract);
         const result = await tactFmt(file);
         expect(result).toMatchObject({ kind: "exited", code: 1 });
+
+        rmSync(file);
     });
 
     testExceptWindows("With syntax error", async () => {
@@ -115,5 +180,17 @@ describe("tact-fmt foo.tact", () => {
         writeFileSync(file, contractWithSyntaxError);
         const result = await tactFmt(file, "-w");
         expect(result).toMatchSnapshot();
+
+        rmSync(file);
+    });
+
+    testExceptWindows("Check and write flags simultaneously", async () => {
+        await mkdir(outputDir, { recursive: true });
+        const file = join(outputDir, "contact.tact");
+        writeFileSync(file, contractWithSyntaxError);
+        const result = await tactFmt(file, "-w", "--check");
+        expect(result).toMatchSnapshot();
+
+        rmSync(file);
     });
 });
diff --git a/src/cli/tact-fmt/error-schema.ts b/src/cli/tact-fmt/error-schema.ts
index 976be577..1b5bc218 100644
--- a/src/cli/tact-fmt/error-schema.ts
+++ b/src/cli/tact-fmt/error-schema.ts
@@ -16,6 +16,9 @@ export const FormatterErrors = (log: (error: string) => void) => {
                 `Unexpected error: ${error instanceof Error ? error.toString() : String(error)}`,
             );
         },
+        checkAndWrite: () => {
+            log(`Cannot use '--check' and '--write' simultaneously`);
+        },
     };
 };
 
diff --git a/src/cli/tact-fmt/index.ts b/src/cli/tact-fmt/index.ts
index f72c21e4..249f778a 100644
--- a/src/cli/tact-fmt/index.ts
+++ b/src/cli/tact-fmt/index.ts
@@ -47,6 +47,7 @@ const processArgs = (Errors: FormatterErrors, argv: string[]) => {
 const ArgSchema = (Parser: ArgParser) => {
     return Parser.tokenizer
         .add(Parser.boolean("write", "w"))
+        .add(Parser.boolean("check", "c"))
         .add(Parser.boolean("version", "v"))
         .add(Parser.boolean("help", "h"))
         .add(Parser.immediate).end;
@@ -59,6 +60,7 @@ const showHelp = () => {
 
     Flags
       -w, --write                 Write result to same file
+      -c, --check                 Check if the given files are formatted
       -v, --version               Print tact-fmt version and exit
       -h, --help                  Display this text and exit
 
@@ -80,7 +82,9 @@ type Args = ArgConsumer<GetParserResult<ReturnType<typeof ArgSchema>>>;
 
 const markup = getAnsiMarkup(Boolean(isColorSupported()));
 
-function formatFile(filepath: string, write: boolean): boolean | undefined {
+type FormatMode = "format" | "format-and-write" | "check";
+
+function formatFile(filepath: string, mode: FormatMode): boolean | undefined {
     const content = readFileOrFail(filepath);
     if (typeof content === "undefined") return undefined;
 
@@ -94,8 +98,15 @@ function formatFile(filepath: string, write: boolean): boolean | undefined {
     }
 
     const alreadyFormatted = content === res.code;
+    if (mode === "check") {
+        if (alreadyFormatted) {
+            return true;
+        }
+        console.log(`[${markup.yellow("warn")}]`, path.basename(filepath));
+        return false;
+    }
 
-    if (write) {
+    if (mode === "format-and-write") {
         console.log(
             markup.gray(path.basename(filepath)),
             `${time.toFixed(0)}ms`,
@@ -144,6 +155,22 @@ const parseArgs = (Errors: FormatterErrors, Args: Args) => {
     const filePath = Args.single("immediate");
     if (filePath) {
         const write = Args.single("write") ?? false;
+        const onlyCheck = Args.single("check") ?? false;
+
+        if (write && onlyCheck) {
+            Errors.checkAndWrite();
+            process.exit(1);
+        }
+
+        const mode = onlyCheck
+            ? "check"
+            : write
+              ? "format-and-write"
+              : "format";
+
+        if (mode === "check") {
+            console.log("Checking formatting...");
+        }
 
         if (!fs.statSync(filePath).isFile()) {
             const files = globSync(["**/*.tact"], {
@@ -151,19 +178,34 @@ const parseArgs = (Errors: FormatterErrors, Args: Args) => {
             });
 
             let someFileCannotBeFormatted = false;
+            let allFormatted = true;
             for (const file of files) {
-                const res = formatFile(join(filePath, file), write);
+                const res = formatFile(join(filePath, file), mode);
                 if (typeof res === "undefined") {
                     someFileCannotBeFormatted = true;
+                } else {
+                    allFormatted &&= res;
+                }
+            }
+
+            if (onlyCheck) {
+                if (!allFormatted) {
+                    console.log(
+                        "Code style issues found in the above file. Run tact-fmt with --write to fix.",
+                    );
+                    process.exit(1);
+                } else {
+                    console.log("All Tact files use Tact code style!");
                 }
             }
+
             if (someFileCannotBeFormatted) {
                 process.exit(1);
             }
             return;
         }
 
-        const res = formatFile(filePath, write);
+        const res = formatFile(filePath, mode);
         if (typeof res === "undefined") {
             process.exit(1);
         }
diff --git a/src/error/display-to-string.ts b/src/error/display-to-string.ts
index d21ea8dc..1a0c5367 100644
--- a/src/error/display-to-string.ts
+++ b/src/error/display-to-string.ts
@@ -12,7 +12,7 @@ export const displayToString: ErrorDisplay<string> = {
     text: (text) => text,
     sub: (parts, ...subst) => {
         const [head, ...tail] = parts;
-        if (!head) {
+        if (typeof head === "undefined") {
             return "";
         }
         return tail.reduce((acc, part, index) => {
diff --git a/src/generator/writers/writeContract.ts b/src/generator/writers/writeContract.ts
index 674dd8be..8b0eec44 100644
--- a/src/generator/writers/writeContract.ts
+++ b/src/generator/writers/writeContract.ts
@@ -296,7 +296,7 @@ export function writeInit(
                     t.dependsOn.length > 0
                 ) {
                     ctx.append(
-                        `b = b.store_ref(begin_cell().store_dict(contracts).end_cell());`,
+                        `b = b.store_builder_ref(begin_cell().store_dict(contracts));`,
                     );
                 }
             }
diff --git a/src/generator/writers/writeExpression.spec.ts b/src/generator/writers/writeExpression.spec.ts
index 615ca374..e82332d8 100644
--- a/src/generator/writers/writeExpression.spec.ts
+++ b/src/generator/writers/writeExpression.spec.ts
@@ -63,7 +63,7 @@ const golden: string[] = [
     `$j'a`,
     "$A$_get_b($A$_constructor_a_b(1, $b))",
     `((- $j'b) + $a)`,
-    `(((- $j'b) + $a) + (+ $b))`,
+    `(((- $j'b) + $a) + $b)`,
     "null()",
     "($o + 1)",
     `$A$_store_cell(($j'a, $j'b))`,
diff --git a/src/generator/writers/writeExpression.ts b/src/generator/writers/writeExpression.ts
index 0b1d4d08..0206e1f4 100644
--- a/src/generator/writers/writeExpression.ts
+++ b/src/generator/writers/writeExpression.ts
@@ -447,7 +447,8 @@ export function writeExpression(
             }
 
             case "+": {
-                return "(+ " + writeExpression(f.operand, wCtx) + ")";
+                // FunC doesn't support unary plus so we just skip it
+                return writeExpression(f.operand, wCtx);
             }
 
             // NOTE: Assert function that ensures that the value is not null
diff --git a/src/generator/writers/writeSerialization.ts b/src/generator/writers/writeSerialization.ts
index d51b42bb..67a9ca6e 100644
--- a/src/generator/writers/writeSerialization.ts
+++ b/src/generator/writers/writeSerialization.ts
@@ -107,7 +107,7 @@ function writeSerializerCell(
         ctx.append(`var build_${gen + 1} = begin_cell();`);
         writeSerializerCell(cell.next, gen + 1, ctx);
         ctx.append(
-            `build_${gen} = store_ref(build_${gen}, build_${gen + 1}.end_cell());`,
+            `build_${gen} = store_builder_ref(build_${gen}, build_${gen + 1});`,
         );
     }
 }
@@ -219,11 +219,11 @@ function writeSerializerField(
                     {
                         if (op.optional) {
                             ctx.append(
-                                `build_${gen} = ~ null?(${fieldName}) ? build_${gen}.store_int(true, 1).store_ref(begin_cell().store_slice(${fieldName}).end_cell()) : build_${gen}.store_int(false, 1);`,
+                                `build_${gen} = build_${gen}.store_maybe_ref(begin_cell().store_slice(${fieldName}).end_cell());`,
                             );
                         } else {
                             ctx.append(
-                                `build_${gen} = build_${gen}.store_ref(begin_cell().store_slice(${fieldName}).end_cell());`,
+                                `build_${gen} = build_${gen}.store_builder_ref(begin_cell().store_slice(${fieldName}));`,
                             );
                         }
                     }
@@ -245,11 +245,11 @@ function writeSerializerField(
                     {
                         if (op.optional) {
                             ctx.append(
-                                `build_${gen} = ~ null?(${fieldName}) ? build_${gen}.store_int(true, 1).store_ref(begin_cell().store_slice(${fieldName}.end_cell().begin_parse()).end_cell()) : build_${gen}.store_int(false, 1);`,
+                                `build_${gen} = build_${gen}.store_maybe_ref(begin_cell().store_slice(${fieldName}).end_cell());`,
                             );
                         } else {
                             ctx.append(
-                                `build_${gen} = build_${gen}.store_ref(begin_cell().store_slice(${fieldName}.end_cell().begin_parse()).end_cell());`,
+                                `build_${gen} = build_${gen}.store_builder_ref(${fieldName});`,
                             );
                         }
                     }
@@ -268,11 +268,11 @@ function writeSerializerField(
         case "string": {
             if (op.optional) {
                 ctx.append(
-                    `build_${gen} = ~ null?(${fieldName}) ? build_${gen}.store_int(true, 1).store_ref(begin_cell().store_slice(${fieldName}).end_cell()) : build_${gen}.store_int(false, 1);`,
+                    `build_${gen} = build_${gen}.store_maybe_ref(begin_cell().store_slice(${fieldName}).end_cell());`,
                 );
             } else {
                 ctx.append(
-                    `build_${gen} = build_${gen}.store_ref(begin_cell().store_slice(${fieldName}).end_cell());`,
+                    `build_${gen} = build_${gen}.store_builder_ref(begin_cell().store_slice(${fieldName}));`,
                 );
             }
             return;
diff --git a/src/generator/writers/writeStdlib.ts b/src/generator/writers/writeStdlib.ts
index 328fe117..ddea2fb6 100644
--- a/src/generator/writers/writeStdlib.ts
+++ b/src/generator/writers/writeStdlib.ts
@@ -35,6 +35,12 @@ export function writeStdlib(ctx: WriterContext): void {
         });
     });
 
+    ctx.fun("__tact_store_addr_none", () => {
+        ctx.signature(`builder __tact_store_addr_none(builder b)`);
+        ctx.context("stdlib");
+        ctx.asm("", "b{00} STSLICECONST", true);
+    });
+
     ctx.fun("__tact_store_address_opt", () => {
         ctx.signature(
             `builder __tact_store_address_opt(builder b, slice address)`,
@@ -44,8 +50,7 @@ export function writeStdlib(ctx: WriterContext): void {
         ctx.body(() => {
             ctx.write(`
                 if (null?(address)) {
-                    b = b.store_uint(0, 2);
-                    return b;
+                    return ${ctx.used("__tact_store_addr_none")}(b);
                 } else {
                     return b.store_slice(address);
                 }
@@ -319,12 +324,12 @@ export function writeStdlib(ctx: WriterContext): void {
             ctx.write(`
                 slice chars = "4142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392D5F"s;
                 builder res = begin_cell();
-            
+
                 while (data.slice_bits() >= 24) {
                     (int bs1, int bs2, int bs3) = (data~load_uint(8), data~load_uint(8), data~load_uint(8));
-            
+
                     int n = (bs1 << 16) | (bs2 << 8) | bs3;
-            
+
                     res = res
                         .store_slice(${ctx.used(
                             "__tact_preload_offset",
@@ -339,7 +344,7 @@ export function writeStdlib(ctx: WriterContext): void {
                             "__tact_preload_offset",
                         )}(chars, ((n      ) & 63) * 8, 8));
                 }
-                
+
                 return res.end_cell().begin_parse();
             `);
         });
@@ -357,7 +362,7 @@ export function writeStdlib(ctx: WriterContext): void {
                     .store_uint((wc + 0x100) % 0x100, 8)
                     .store_uint(hash, 256)
                 .end_cell().begin_parse();
-            
+
                 slice checksum = ${ctx.used(
                     "__tact_crc16",
                 )}(user_friendly_address);
@@ -365,7 +370,7 @@ export function writeStdlib(ctx: WriterContext): void {
                     .store_slice(user_friendly_address)
                     .store_slice(checksum)
                 .end_cell().begin_parse();
-            
+
                 return ${ctx.used(
                     "__tact_base64_encode",
                 )}(user_friendly_address_with_checksum);
diff --git a/src/grammar/__snapshots__/grammar.spec.ts.snap b/src/grammar/__snapshots__/grammar.spec.ts.snap
index ee3d3288..357afd6e 100644
--- a/src/grammar/__snapshots__/grammar.spec.ts.snap
+++ b/src/grammar/__snapshots__/grammar.spec.ts.snap
@@ -677,6 +677,24 @@ exports[`should fail literal-underscore-after-leading-zero.fail 1`] = `
 "
 `;
 
+exports[`should fail optional-map-key.fail 1`] = `
+"<unknown>:2:12: map key types cannot be optional
+  1 | contract TestContract {
+> 2 |     m: map<Int?, Int>; // Int? is invalid for keys
+                 ^~~~
+  3 | 
+"
+`;
+
+exports[`should fail optional-map-value.fail 1`] = `
+"<unknown>:2:17: map value types cannot be optional
+  1 | contract TestContract {
+> 2 |     m: map<Int, Int?>; // Int? is invalid for values
+                      ^~~~
+  3 | 
+"
+`;
+
 exports[`should fail stmt-destructuring-fields-non-existing-underscore.fail 1`] = `
 "<unknown>:15:12: Wildcard not allowed here
   14 |     let s = S{ a: 1, b: 2, c: 3 };
diff --git a/src/grammar/index.ts b/src/grammar/index.ts
index e9511fc0..7681b718 100644
--- a/src/grammar/index.ts
+++ b/src/grammar/index.ts
@@ -871,7 +871,7 @@ const parseTypeOptional =
                 ctx.err.mapOnlyOneAs("key")(genericLoc);
             }
             if (key.type.optionals.length > 0) {
-                ctx.err.cannotBeOptional("key")(genericLoc);
+                ctx.err.cannotBeOptional("map key types")(key.loc);
             }
             if (key.type.type.$ !== "TypeRegular") {
                 ctx.err.onlyTypeId("key")(genericLoc);
@@ -882,7 +882,7 @@ const parseTypeOptional =
                 ctx.err.mapOnlyOneAs("value")(genericLoc);
             }
             if (value.type.optionals.length > 0) {
-                ctx.err.cannotBeOptional("value")(genericLoc);
+                ctx.err.cannotBeOptional("map value types")(value.loc);
             }
             if (value.type.type.$ !== "TypeRegular") {
                 ctx.err.onlyTypeId("value")(genericLoc);
diff --git a/src/grammar/parser-error.ts b/src/grammar/parser-error.ts
index f8716a38..57458bb5 100644
--- a/src/grammar/parser-error.ts
+++ b/src/grammar/parser-error.ts
@@ -146,7 +146,7 @@ export const syntaxErrorSchema = <T, U>(
                 sub`Cannot use several "as" on ${text(name)} of a map`,
             );
         },
-        cannotBeOptional: (name: "key" | "value") => {
+        cannotBeOptional: (name: "map value types" | "map key types") => {
             return handle(sub`${text(name)} cannot be optional`);
         },
         onlyTypeId: (name: "key" | "value") => {
diff --git a/src/pipeline/__snapshots__/packaging.spec.ts.snap b/src/pipeline/__snapshots__/packaging.spec.ts.snap
index 64ac0cd6..32583256 100644
--- a/src/pipeline/__snapshots__/packaging.spec.ts.snap
+++ b/src/pipeline/__snapshots__/packaging.spec.ts.snap
@@ -1,3 +1,3 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`should correctly generate .pkg file: Windows uses Unix-like paths 1`] = `"{"name":"Echo","code":"te6ccgECDAEAAgIAAij/AI6I9KQT9LzyyAvtUyDjA+1D2QECAgN44AMEA/Aw7aLt+wHQctch0gDSAPpAIRA0UGZvBPhhAvhi7UTQ0gAwkW2RbeICkVvgcCHXSSDCH463MSHXCx8gghB7og3Buo6mW4Ag1yFtMcgBMIIQe6INwQHLH8n4QgF/bds8MMh/AcoAye1U2zHgAd4BwACRMOMNyAHPFskLBwgBI7nT7tRNDSADCRbZFt4gHbPDGAUBI7g2LtRNDSADCRbZFt4gHbPDGAYACqoJgCCwAlLIbwABb4xtb4yLdIZWxsbywgjbPAHbPG8iAcmTIW6zlgFvIlnMyegx0AoKAjrCH48YgCDXIds8+EIBf23bPDDIfwHKAMntVNsx4AkLASD4QgF/bds8MMh/AcoAye1UCwFCyHAByx9vAAFvjG1vjAHbPG8iAcmTIW6zlgFvIlnMyegxCgC6INdKIddJlyDCACLCALGOSgNvIoB/Is8xqwKhBasCUVW2CCDCAJwgqgIV1xhQM88WQBTeWW8CU0GhwgCZyAFvAlBEoaoCjhIxM8IAmdQw0CDXSiHXSZJwIOLi6F8DAKBtbSJus5lbIG7y0IBvIgGRMuIQJHADBIBCUCMQNlUiEsjPhYDKAM+EQM4B+gKAac9AAlxuAW6wk1vPgZ1Yz4aAz4SA9AD0AM+B4vQAyQH7AA==","abi":"{\\"name\\":\\"Echo\\",\\"types\\":[{\\"name\\":\\"DataSize\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"cells\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"bits\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"refs\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}]},{\\"name\\":\\"SignedBundle\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"signature\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"fixed-bytes\\",\\"optional\\":false,\\"format\\":64}},{\\"name\\":\\"signedData\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false,\\"format\\":\\"remainder\\"}}]},{\\"name\\":\\"StateInit\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"code\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":false}},{\\"name\\":\\"data\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":false}}]},{\\"name\\":\\"Context\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"bounceable\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}},{\\"name\\":\\"sender\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"raw\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false}}]},{\\"name\\":\\"SendParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"code\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"data\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"to\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}}]},{\\"name\\":\\"MessageParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"to\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}}]},{\\"name\\":\\"DeployParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}},{\\"name\\":\\"init\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"StateInit\\",\\"optional\\":false}}]},{\\"name\\":\\"StdAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"workchain\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":8}},{\\"name\\":\\"address\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"uint\\",\\"optional\\":false,\\"format\\":256}}]},{\\"name\\":\\"VarAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"workchain\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":32}},{\\"name\\":\\"address\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false}}]},{\\"name\\":\\"BasechainAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"hash\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":true,\\"format\\":257}}]},{\\"name\\":\\"EchoMessage\\",\\"header\\":2074217921,\\"fields\\":[]},{\\"name\\":\\"Echo$Data\\",\\"header\\":null,\\"fields\\":[]}],\\"receivers\\":[{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"typed\\",\\"type\\":\\"EchoMessage\\"}},{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"text\\"}},{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"any\\"}}],\\"getters\\":[{\\"name\\":\\"hello\\",\\"methodId\\":115554,\\"arguments\\":[{\\"name\\":\\"src\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"string\\",\\"optional\\":false}}],\\"returnType\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"string\\",\\"optional\\":false}},{\\"name\\":\\"hello2\\",\\"methodId\\":105790,\\"arguments\\":[{\\"name\\":\\"src\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}],\\"returnType\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}],\\"errors\\":{\\"2\\":{\\"message\\":\\"Stack underflow\\"},\\"3\\":{\\"message\\":\\"Stack overflow\\"},\\"4\\":{\\"message\\":\\"Integer overflow\\"},\\"5\\":{\\"message\\":\\"Integer out of expected range\\"},\\"6\\":{\\"message\\":\\"Invalid opcode\\"},\\"7\\":{\\"message\\":\\"Type check error\\"},\\"8\\":{\\"message\\":\\"Cell overflow\\"},\\"9\\":{\\"message\\":\\"Cell underflow\\"},\\"10\\":{\\"message\\":\\"Dictionary error\\"},\\"11\\":{\\"message\\":\\"'Unknown' error\\"},\\"12\\":{\\"message\\":\\"Fatal error\\"},\\"13\\":{\\"message\\":\\"Out of gas error\\"},\\"14\\":{\\"message\\":\\"Virtualization error\\"},\\"32\\":{\\"message\\":\\"Action list is invalid\\"},\\"33\\":{\\"message\\":\\"Action list is too long\\"},\\"34\\":{\\"message\\":\\"Action is invalid or not supported\\"},\\"35\\":{\\"message\\":\\"Invalid source address in outbound message\\"},\\"36\\":{\\"message\\":\\"Invalid destination address in outbound message\\"},\\"37\\":{\\"message\\":\\"Not enough Toncoin\\"},\\"38\\":{\\"message\\":\\"Not enough extra currencies\\"},\\"39\\":{\\"message\\":\\"Outbound message does not fit into a cell after rewriting\\"},\\"40\\":{\\"message\\":\\"Cannot process a message\\"},\\"41\\":{\\"message\\":\\"Library reference is null\\"},\\"42\\":{\\"message\\":\\"Library change action error\\"},\\"43\\":{\\"message\\":\\"Exceeded maximum number of cells in the library or the maximum depth of the Merkle tree\\"},\\"50\\":{\\"message\\":\\"Account state size exceeded limits\\"},\\"128\\":{\\"message\\":\\"Null reference exception\\"},\\"129\\":{\\"message\\":\\"Invalid serialization prefix\\"},\\"130\\":{\\"message\\":\\"Invalid incoming message\\"},\\"131\\":{\\"message\\":\\"Constraints error\\"},\\"132\\":{\\"message\\":\\"Access denied\\"},\\"133\\":{\\"message\\":\\"Contract stopped\\"},\\"134\\":{\\"message\\":\\"Invalid argument\\"},\\"135\\":{\\"message\\":\\"Code of a contract was not found\\"},\\"136\\":{\\"message\\":\\"Invalid standard address\\"},\\"138\\":{\\"message\\":\\"Not a basechain address\\"}},\\"interfaces\\":[\\"org.ton.introspection.v0\\",\\"org.ton.abi.ipfs.v0\\",\\"org.ton.deploy.lazy.v0\\"]}","init":{"kind":"direct","args":[],"prefix":{"bits":1,"value":0},"deployment":{"kind":"system-cell","system":null}},"sources":{"packaging.tact":"bWVzc2FnZSgweDdiYTIwZGMxKSBFY2hvTWVzc2FnZSB7fQoKY29udHJhY3QgRWNobyB7CiAgICByZWNlaXZlKG1zZzogRWNob01lc3NhZ2UpIHsKICAgICAgICBzZWxmLnJlcGx5KG1zZy50b0NlbGwoKSk7CiAgICB9CiAgICAKICAgIHJlY2VpdmUobXNnOiBTdHJpbmcpIHsKICAgICAgICBzZWxmLnJlcGx5KG1zZy5hc0NvbW1lbnQoKSk7CiAgICB9CiAgICAKICAgIHJlY2VpdmUobXNnOiBTbGljZSkgewogICAgICAgIHNlbGYucmVwbHkobXNnLmFzQ2VsbCgpKTsKICAgIH0KCiAgICBnZXQgZnVuIGhlbGxvKHNyYzogU3RyaW5nKTogU3RyaW5nIHsKICAgICAgICBsZXQgYnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IGJlZ2luU3RyaW5nKCk7CiAgICAgICAgYnVpbGRlci5hcHBlbmQoIkhlbGxvLCAiKTsKICAgICAgICBidWlsZGVyLmFwcGVuZChzcmMpOwogICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiAgICB9CgogICAgZ2V0IGZ1biBoZWxsbzIoc3JjOiBJbnQpOiBJbnQgewogICAgICAgIHJldHVybiBzcmMgPDwgMTAgJiAzMjsKICAgIH0KfQ=="},"compiler":{"name":"tact","version":"1.6.5","parameters":"{\\"entrypoint\\":\\"./packaging.tact\\",\\"options\\":{}}"}}"`;
+exports[`should correctly generate .pkg file: Windows uses Unix-like paths 1`] = `"{"name":"Echo","code":"te6ccgECDAEAAgIAAij/AI6I9KQT9LzyyAvtUyDjA+1D2QECAgN44AMEA/Aw7aLt+wHQctch0gDSAPpAIRA0UGZvBPhhAvhi7UTQ0gAwkW2RbeICkVvgcCHXSSDCH463MSHXCx8gghB7og3Buo6mW4Ag1yFtMcgBMIIQe6INwQHLH8n4QgF/bds8MMh/AcoAye1U2zHgAd4BwACRMOMNyAHPFskLBwgBI7nT7tRNDSADCRbZFt4gHbPDGAUBI7g2LtRNDSADCRbZFt4gHbPDGAYACqoJgCCwAlLIbwABb4xtb4yLdIZWxsbywgjbPAHbPG8iAcmTIW6zlgFvIlnMyegx0AoKAjrCH48YgCDXIds8+EIBf23bPDDIfwHKAMntVNsx4AkLASD4QgF/bds8MMh/AcoAye1UCwFCyHAByx9vAAFvjG1vjAHbPG8iAcmTIW6zlgFvIlnMyegxCgC6INdKIddJlyDCACLCALGOSgNvIoB/Is8xqwKhBasCUVW2CCDCAJwgqgIV1xhQM88WQBTeWW8CU0GhwgCZyAFvAlBEoaoCjhIxM8IAmdQw0CDXSiHXSZJwIOLi6F8DAKBtbSJus5lbIG7y0IBvIgGRMuIQJHADBIBCUCMQNlUiEsjPhYDKAM+EQM4B+gKAac9AAlxuAW6wk1vPgZ1Yz4aAz4SA9AD0AM+B4vQAyQH7AA==","abi":"{\\"name\\":\\"Echo\\",\\"types\\":[{\\"name\\":\\"DataSize\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"cells\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"bits\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"refs\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}]},{\\"name\\":\\"SignedBundle\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"signature\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"fixed-bytes\\",\\"optional\\":false,\\"format\\":64}},{\\"name\\":\\"signedData\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false,\\"format\\":\\"remainder\\"}}]},{\\"name\\":\\"StateInit\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"code\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":false}},{\\"name\\":\\"data\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":false}}]},{\\"name\\":\\"Context\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"bounceable\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}},{\\"name\\":\\"sender\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"raw\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false}}]},{\\"name\\":\\"SendParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"code\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"data\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"to\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}}]},{\\"name\\":\\"MessageParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"to\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}}]},{\\"name\\":\\"DeployParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}},{\\"name\\":\\"init\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"StateInit\\",\\"optional\\":false}}]},{\\"name\\":\\"StdAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"workchain\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":8}},{\\"name\\":\\"address\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"uint\\",\\"optional\\":false,\\"format\\":256}}]},{\\"name\\":\\"VarAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"workchain\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":32}},{\\"name\\":\\"address\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false}}]},{\\"name\\":\\"BasechainAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"hash\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":true,\\"format\\":257}}]},{\\"name\\":\\"EchoMessage\\",\\"header\\":2074217921,\\"fields\\":[]},{\\"name\\":\\"Echo$Data\\",\\"header\\":null,\\"fields\\":[]}],\\"receivers\\":[{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"typed\\",\\"type\\":\\"EchoMessage\\"}},{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"text\\"}},{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"any\\"}}],\\"getters\\":[{\\"name\\":\\"hello\\",\\"methodId\\":115554,\\"arguments\\":[{\\"name\\":\\"src\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"string\\",\\"optional\\":false}}],\\"returnType\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"string\\",\\"optional\\":false}},{\\"name\\":\\"hello2\\",\\"methodId\\":105790,\\"arguments\\":[{\\"name\\":\\"src\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}],\\"returnType\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}],\\"errors\\":{\\"2\\":{\\"message\\":\\"Stack underflow\\"},\\"3\\":{\\"message\\":\\"Stack overflow\\"},\\"4\\":{\\"message\\":\\"Integer overflow\\"},\\"5\\":{\\"message\\":\\"Integer out of expected range\\"},\\"6\\":{\\"message\\":\\"Invalid opcode\\"},\\"7\\":{\\"message\\":\\"Type check error\\"},\\"8\\":{\\"message\\":\\"Cell overflow\\"},\\"9\\":{\\"message\\":\\"Cell underflow\\"},\\"10\\":{\\"message\\":\\"Dictionary error\\"},\\"11\\":{\\"message\\":\\"'Unknown' error\\"},\\"12\\":{\\"message\\":\\"Fatal error\\"},\\"13\\":{\\"message\\":\\"Out of gas error\\"},\\"14\\":{\\"message\\":\\"Virtualization error\\"},\\"32\\":{\\"message\\":\\"Action list is invalid\\"},\\"33\\":{\\"message\\":\\"Action list is too long\\"},\\"34\\":{\\"message\\":\\"Action is invalid or not supported\\"},\\"35\\":{\\"message\\":\\"Invalid source address in outbound message\\"},\\"36\\":{\\"message\\":\\"Invalid destination address in outbound message\\"},\\"37\\":{\\"message\\":\\"Not enough Toncoin\\"},\\"38\\":{\\"message\\":\\"Not enough extra currencies\\"},\\"39\\":{\\"message\\":\\"Outbound message does not fit into a cell after rewriting\\"},\\"40\\":{\\"message\\":\\"Cannot process a message\\"},\\"41\\":{\\"message\\":\\"Library reference is null\\"},\\"42\\":{\\"message\\":\\"Library change action error\\"},\\"43\\":{\\"message\\":\\"Exceeded maximum number of cells in the library or the maximum depth of the Merkle tree\\"},\\"50\\":{\\"message\\":\\"Account state size exceeded limits\\"},\\"128\\":{\\"message\\":\\"Null reference exception\\"},\\"129\\":{\\"message\\":\\"Invalid serialization prefix\\"},\\"130\\":{\\"message\\":\\"Invalid incoming message\\"},\\"131\\":{\\"message\\":\\"Constraints error\\"},\\"132\\":{\\"message\\":\\"Access denied\\"},\\"133\\":{\\"message\\":\\"Contract stopped\\"},\\"134\\":{\\"message\\":\\"Invalid argument\\"},\\"135\\":{\\"message\\":\\"Code of a contract was not found\\"},\\"136\\":{\\"message\\":\\"Invalid standard address\\"},\\"138\\":{\\"message\\":\\"Not a basechain address\\"}},\\"interfaces\\":[\\"org.ton.introspection.v0\\",\\"org.ton.abi.ipfs.v0\\",\\"org.ton.deploy.lazy.v0\\"]}","init":{"kind":"direct","args":[],"prefix":{"bits":1,"value":0},"deployment":{"kind":"system-cell","system":null}},"sources":{"packaging.tact":"bWVzc2FnZSgweDdiYTIwZGMxKSBFY2hvTWVzc2FnZSB7fQoKY29udHJhY3QgRWNobyB7CiAgICByZWNlaXZlKG1zZzogRWNob01lc3NhZ2UpIHsKICAgICAgICBzZWxmLnJlcGx5KG1zZy50b0NlbGwoKSk7CiAgICB9CiAgICAKICAgIHJlY2VpdmUobXNnOiBTdHJpbmcpIHsKICAgICAgICBzZWxmLnJlcGx5KG1zZy5hc0NvbW1lbnQoKSk7CiAgICB9CiAgICAKICAgIHJlY2VpdmUobXNnOiBTbGljZSkgewogICAgICAgIHNlbGYucmVwbHkobXNnLmFzQ2VsbCgpKTsKICAgIH0KCiAgICBnZXQgZnVuIGhlbGxvKHNyYzogU3RyaW5nKTogU3RyaW5nIHsKICAgICAgICBsZXQgYnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IGJlZ2luU3RyaW5nKCk7CiAgICAgICAgYnVpbGRlci5hcHBlbmQoIkhlbGxvLCAiKTsKICAgICAgICBidWlsZGVyLmFwcGVuZChzcmMpOwogICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiAgICB9CgogICAgZ2V0IGZ1biBoZWxsbzIoc3JjOiBJbnQpOiBJbnQgewogICAgICAgIHJldHVybiBzcmMgPDwgMTAgJiAzMjsKICAgIH0KfQ=="},"compiler":{"name":"tact","version":"1.6.6","parameters":"{\\"entrypoint\\":\\"./packaging.tact\\",\\"options\\":{}}"}}"`;
diff --git a/src/stdlib/stdlib.ts b/src/stdlib/stdlib.ts
index 55cc8656..862a571a 100644
--- a/src/stdlib/stdlib.ts
+++ b/src/stdlib/stdlib.ts
@@ -272,81 +272,85 @@ files["std/internal/address.tact"] =
     "QWRkcmVzcyhzbGljZTogU2xpY2UpOiBWYXJBZGRyZXNzIHsgUkVXUklURVZBUkFERFIgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBT" +
     "bGljZWAgdHlwZS4KLy8vCi8vLyBMb2FkcyBhbmQgcmV0dXJucyBhbiBgQWRkcmVzc2AgZnJvbSB0aGUgYFNsaWNlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhh" +
     "bXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUFkZHJlc3MobXlBZGRyZXNzKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6" +
-    "ejogQWRkcmVzcyA9IHMubG9hZEFkZHJlc3MoKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogODogW0NlbGwgb3ZlcmZsb3dd" +
-    "IOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgYW4gYEFkZHJlc3NgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQuCi8vLyAqIDk6IFtDZWxs" +
-    "IHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZTogaHR0" +
-    "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkYWRkcmVzcwovLy8KLy8vIFtDZWxsIG92ZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRh" +
-    "Y3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5" +
-    "Ci8vLwphc20oLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRBZGRyZXNzKHNlbGY6IFNsaWNlKTogQWRkcmVzcyB7IExETVNHQUREUiB9CgovLy8gRXh0ZW5z" +
-    "aW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMi4KLy8vCi8vLyBTa2lwcyBhbiBgQWRkcmVz" +
-    "c2AgZnJvbSB0aGUgYFNsaWNlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8v" +
-    "ICAgICAgICAgLnN0b3JlQWRkcmVzcyhteUFkZHJlc3MoKSkKLy8vICAgICAgICAgLnN0b3JlVWludCg0MiwgMzIpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwov" +
-    "Ly8gICAgIHMxLnNraXBBZGRyZXNzKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMxLmxvYWRVaW50KDMyKTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMj" +
-    "IyMgRXhpdCBjb2RlcwovLy8KLy8vICogODogW0NlbGwgb3ZlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHNraXAgYW4gYEFkZHJlc3NgIHdoZW4g" +
-    "YFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQuCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc2tpcCBtb3JlIGRh" +
-    "dGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwYWRkcmVz" +
-    "cwovLy8KLy8vIFtDZWxsIG92ZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0" +
-    "dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwQWRkcmVzcyhzZWxmOiBTbGljZSkg" +
-    "eyBMRE1TR0FERFIgTklQIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4KLy8vCi8vLyBTdG9yZXMgdGhlIGBhZGRyZXNzYCBp" +
-    "biB0aGUgY29weSBvZiB0aGUgYEJ1aWxkZXJgLiBSZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQg" +
-    "YjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBCdWlsZGVyID0gYi5zdG9yZUFkZHJlc3MobXlBZGRyZXNzKCkpOwovLy8gfQovLy8gYGBg" +
-    "Ci8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc3RvcmUgYW4gYGFk" +
-    "ZHJlc3NgIGludG8gdGhlIGBCdWlsZGVyYCB3aGVuIGl0IGNhbm5vdCBmaXQgaXQuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29y" +
-    "ZS1jZWxscyNidWlsZGVyc3RvcmVhZGRyZXNzCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMj" +
-    "OAovLy8KYXNtIGV4dGVuZHMgZnVuIHN0b3JlQWRkcmVzcyhzZWxmOiBCdWlsZGVyLCBhZGRyZXNzOiBBZGRyZXNzKTogQnVpbGRlciB7IFNUU0xJQ0VSIH0KCi8vLyBT" +
-    "dHJ1Y3QgcmVwcmVzZW50aW5nIGEgYmFzZWNoYWluIGFkZHJlc3MuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIEEgYmFzZWNoYWluIGFkZHJlc3Mg" +
-    "KHdvcmtjaGFpbiAwKSBjYW4gYmUgZWl0aGVyIGVtcHR5IChudWxsIGhhc2gpIG9yIGNvbnRhaW4gYSAyNTYtYml0IGhhc2ggdmFsdWUuCi8vLwpzdHJ1Y3QgQmFzZWNo" +
-    "YWluQWRkcmVzcyB7CiAgICBoYXNoOiBJbnQ/Owp9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBDcmVhdGVz" +
-    "IGFuZCByZXR1cm5zIGFuIGVtcHR5IGJhc2VjaGFpbiBhZGRyZXNzIHdpdGggYSBudWxsIGhhc2guCi8vLwovLy8gV2hlbiBzZXJpYWxpemVkLCBhbiBlbXB0eSBiYXNl" +
-    "Y2hhaW4gYWRkcmVzcyBpcyByZXByZXNlbnRlZCBhcyBgYWRkcl9ub25lYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgZW1w" +
-    "dHlBZGRyOiBCYXNlY2hhaW5BZGRyZXNzID0gZW1wdHlCYXNlY2hhaW5BZGRyZXNzKCk7Ci8vLyAgICAgZW1wdHlBZGRyLmhhc2ggPT0gbnVsbDsgLy8gdHJ1ZQovLy8g" +
-    "fQovLy8gYGBgCi8vLwppbmxpbmUgZnVuIGVtcHR5QmFzZWNoYWluQWRkcmVzcygpOiBCYXNlY2hhaW5BZGRyZXNzIHsKICAgIHJldHVybiBCYXNlY2hhaW5BZGRyZXNz" +
-    "IHsgaGFzaDogbnVsbCB9Owp9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBDcmVhdGVzIGFuZCByZXR1cm5z" +
-    "IGEgbmV3IGJhc2VjaGFpbiBhZGRyZXNzIHdpdGggdGhlIHNwZWNpZmllZCBoYXNoIHZhbHVlLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8g" +
-    "ICAgIGxldCBhZGRyOiBCYXNlY2hhaW5BZGRyZXNzID0gbmV3QmFzZWNoYWluQWRkcmVzcygweDgzZGZkNTUyZTYzNzI5YjQ3MmZjYmNjOGM0NWViY2M2NjkxNzAyNTU4" +
-    "YjY4ZWM3NTI3ZTFiYTQwM2EwZjMxYTgpOwovLy8gfQovLy8gYGBgCi8vLwppbmxpbmUgZnVuIG5ld0Jhc2VjaGFpbkFkZHJlc3MoaGFzaDogSW50KTogQmFzZWNoYWlu" +
-    "QWRkcmVzcyB7CiAgICByZXR1cm4gQmFzZWNoYWluQWRkcmVzcyB7IGhhc2ggfTsKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42" +
-    "LjAuCi8vLwovLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGJhc2VjaGFpbiBhZGRyZXNzIGRlcml2ZWQgZnJvbSBhIGNvbnRyYWN0J3MgYFN0YXRlSW5pdGAgKGNvZGUg" +
-    "YW5kIGRhdGEpLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBjb2RlOiBDZWxsID0gbG9hZENlbGwoKTsgLy8gbG9hZCBjb250" +
-    "cmFjdCBjb2RlCi8vLyAgICAgbGV0IGRhdGE6IENlbGwgPSBsb2FkQ2VsbCgpOyAvLyBsb2FkIGNvbnRyYWN0IGRhdGEKLy8vICAgICBsZXQgc3RhdGU6IFN0YXRlSW5p" +
-    "dCA9IFN0YXRlSW5pdCB7IGNvZGUsIGRhdGEgfTsKLy8vICAgICBsZXQgYWRkcjogQmFzZWNoYWluQWRkcmVzcyA9IGNvbnRyYWN0QmFzZWNoYWluQWRkcmVzcyhzdGF0" +
-    "ZSk7Ci8vLyB9Ci8vLyBgYGAKLy8vCmlubGluZSBmdW4gY29udHJhY3RCYXNlY2hhaW5BZGRyZXNzKHM6IFN0YXRlSW5pdCk6IEJhc2VjaGFpbkFkZHJlc3MgewogICAg" +
-    "bGV0IGhhc2ggPSBjb250cmFjdEhhc2gocy5jb2RlLCBzLmRhdGEpOwogICAgcmV0dXJuIG5ld0Jhc2VjaGFpbkFkZHJlc3MoaGFzaCk7Cn0KCi8vLyBFeHRlbnNpb24g" +
-    "ZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gU3RvcmVzIHRoZSBiYXNlY2hhaW4gYWRkcmVz" +
-    "cyBpbiB0aGUgY29weSBvZiB0aGUgQnVpbGRlciBhbmQgcmV0dXJucyB0aGF0IGNvcHkuCi8vLwovLy8gSWYgdGhlIGFkZHJlc3MgaGFzIGEgYG51bGxgIGhhc2gsIHN0" +
-    "b3JlcyAwYjAwIChgYWRkcl9ub25lYCkuIE90aGVyd2lzZSwgc3RvcmVzIHRoZSBmdWxsIGFkZHJlc3MKLy8vIHdpdGggcHJlZml4IDBiMTAwIGZvbGxvd2VkIGJ5IHdv" +
-    "cmtjaGFpbiAoMCkgYW5kIHRoZSAyNTYtYml0IGhhc2guCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGFkZHI6IEJhc2VjaGFp" +
-    "bkFkZHJlc3MgPSBuZXdCYXNlY2hhaW5BZGRyZXNzKDB4ODNkZmQ1NTJlNjM3MjliNDcyZmNiY2M4YzQ1ZWJjYzY2OTE3MDI1NThiNjhlYzc1MjdlMWJhNDAzYTBmMzFh" +
-    "OCk7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgYjI6IEJ1aWxkZXIgPSBiLnN0b3JlQmFzZWNoYWluQWRkcmVzcyhhZGRy" +
-    "KTsKLy8vIH0KLy8vIGBgYAovLy8KZXh0ZW5kcyBmdW4gc3RvcmVCYXNlY2hhaW5BZGRyZXNzKHNlbGY6IEJ1aWxkZXIsIGFkZHJlc3M6IEJhc2VjaGFpbkFkZHJlc3Mp" +
-    "OiBCdWlsZGVyIHsKICAgIGlmIChhZGRyZXNzLmhhc2ggPT0gbnVsbCkgewogICAgICAgIHJldHVybiBzZWxmLnN0b3JlVWludCgwLCAyKTsgLy8gMGIwMAogICAgfQoK" +
-    "ICAgIHJldHVybiBzZWxmCiAgICAgICAgLnN0b3JlVWludCgwYjEwXzBfMDAwMDAwMDAsIDMgKyA4KQogICAgICAgIC5zdG9yZVVpbnQoYWRkcmVzcy5oYXNoISEsIDI1" +
-    "Nik7Cn0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4zLgovLy8KLy8vIENoZWNrcyB3aGV0aGVyIHRoZSBgYWRkcmVzc2AgaXMg" +
-    "aW4gdGhlIGJhc2VjaGFpbiwgaS5lLiwgaXRzIGNoYWluIElEIGlzIDAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGVzKCkgewovLy8gICAgIGxldCBzb21l" +
-    "QmFzZWNoYWluQWRkcmVzczogQWRkcmVzcyA9Ci8vLyAgICAgICAgIG5ld0FkZHJlc3MoMCwgMHg4M2RmZDU1MmU2MzcyOWI0NzJmY2JjYzhjNDVlYmNjNjY5MTcwMjU1" +
-    "OGI2OGVjNzUyN2UxYmE0MDNhMGYzMWE4KTsKLy8vCi8vLyAgICAgbGV0IHNvbWVNYXN0ZXJjaGFpbkFkZHJlc3M6IEFkZHJlc3MgPQovLy8gICAgICAgICBuZXdBZGRy" +
-    "ZXNzKC0xLCAweDgzZGZkNTUyZTYzNzI5YjQ3MmZjYmNjOGM0NWViY2M2NjkxNzAyNTU4YjY4ZWM3NTI3ZTFiYTQwM2EwZjMxYTgpOwovLy8KLy8vICAgICAvLyBEb2Vz" +
-    "IG5vdCB0aHJvdyBiZWNhdXNlIHRoZSBjaGFpbiBJRCBpcyAwCi8vLyAgICAgZm9yY2VCYXNlY2hhaW4oc29tZUJhc2VjaGFpbkFkZHJlc3MpOwovLy8KLy8vICAgICB0" +
-    "cnkgewovLy8gICAgICAgICAvLyBUaHJvd3MgYmVjYXVzZSB0aGUgY2hhaW4gSUQgaXMgLTEgKG1hc3RlcmNoYWluKQovLy8gICAgICAgICBmb3JjZUJhc2VjaGFpbihz" +
-    "b21lTWFzdGVyY2hhaW5BZGRyZXNzKTsKLy8vICAgICB9IGNhdGNoIChleGl0Q29kZSkgewovLy8gICAgICAgICAvLyBleGl0Q29kZSBpcyAxMzgKLy8vICAgICB9Ci8v" +
-    "LyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDEzODogW05vdCBhIGJhc2VjaGFpbiBhZGRyZXNzXSDigJQgVGhyb3duIHdoZW4gdGhl" +
-    "IGdpdmVuIGBhZGRyZXNzYCBpcyBub3QgaW4gdGhlIGJhc2VjaGFpbiAoY2hhaW4gSUQgaXMgbm90IDApLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFu" +
-    "Zy5vcmcvcmVmL2NvcmUtYWRkcmVzc2VzI2ZvcmNlYmFzZWNoYWluCi8vLwovLy8gW05vdCBhIGJhc2VjaGFpbiBhZGRyZXNzXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFu" +
-    "Zy5vcmcvYm9vay9leGl0LWNvZGVzIzEzOAovLy8KYXNtIGZ1biBmb3JjZUJhc2VjaGFpbihhZGRyZXNzOiBBZGRyZXNzKSB7IFJFV1JJVEVTVERBRERSIERST1AgMTM4" +
-    "IFRIUk9XSUYgfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjQuCi8vLwovLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGBhZGRyZXNz" +
-    "YCBpcyBpbiB0aGUgYHdvcmtjaGFpbmAsIGkuZS4sIGl0cyBjaGFpbiBJRCBpcyBlcXVhbCB0byBgd29ya2NoYWluYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhh" +
-    "bXBsZXMoKSB7Ci8vLyAgICAgbGV0IHNvbWVCYXNlY2hhaW5BZGRyZXNzOiBBZGRyZXNzID0KLy8vICAgICAgICAgbmV3QWRkcmVzcygwLCAweDgzZGZkNTUyZTYzNzI5" +
-    "YjQ3MmZjYmNjOGM0NWViY2M2NjkxNzAyNTU4YjY4ZWM3NTI3ZTFiYTQwM2EwZjMxYTgpOwovLy8KLy8vICAgICBsZXQgc29tZU1hc3RlcmNoYWluQWRkcmVzczogQWRk" +
-    "cmVzcyA9Ci8vLyAgICAgICAgIG5ld0FkZHJlc3MoLTEsIDB4ODNkZmQ1NTJlNjM3MjliNDcyZmNiY2M4YzQ1ZWJjYzY2OTE3MDI1NThiNjhlYzc1MjdlMWJhNDAzYTBm" +
-    "MzFhOCk7Ci8vLwovLy8gICAgIC8vIERvZXMgbm90IHRocm93IGJlY2F1c2UgdGhlIGNoYWluIElEIG1hdGNoZXMgd29ya2NoYWluIHBhcmFtZXRlcgovLy8gICAgIGZv" +
-    "cmNlV29ya2NoYWluKHNvbWVCYXNlY2hhaW5BZGRyZXNzLCAwLCA1OTMpOwovLy8gICAgIGZvcmNlV29ya2NoYWluKHNvbWVNYXN0ZXJjaGFpbkFkZHJlc3MsIC0xLCA1" +
-    "OTMpOwovLy8KLy8vICAgICB0cnkgewovLy8gICAgICAgICAvLyBUaHJvd3MgYmVjYXVzZSB0aGUgY2hhaW4gSUQgaXMgMCB3aGljaCBkb2Vzbid0IG1hdGNoIHRoZSB3" +
-    "b3JrY2hhaW4gcGFyYW1ldGVyLCAtMQovLy8gICAgICAgICBmb3JjZVdvcmtjaGFpbihzb21lQmFzZWNoYWluQWRkcmVzcywgLTEsIDU5Myk7Ci8vLyAgICAgfSBjYXRj" +
-    "aCAoZXhpdENvZGUpIHsKLy8vICAgICAgICAgLy8gZXhpdENvZGUgaXMgNTkzCi8vLyAgICAgfQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3Mu" +
-    "dGFjdC1sYW5nLm9yZy9yZWYvY29yZS1hZGRyZXNzZXMjZm9yY2V3b3JrY2hhaW4KLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIGBlcnJvckNvZGVgIOKA" +
-    "lCBUaHJvd24gd2hlbiB0aGUgZ2l2ZW4gYGFkZHJlc3NgIGlzIG5vdCBpbiB0aGUgc3BlY2lmaWVkIGB3b3JrY2hhaW5gIChjaGFpbiBJRCBpcyBub3QgZXF1YWwgdG8g" +
-    "YHdvcmtjaGFpbmApLgovLy8KYXNtKGVycm9yQ29kZSB3b3JrY2hhaW4gYWRkcmVzcykgZnVuIGZvcmNlV29ya2NoYWluKGFkZHJlc3M6IEFkZHJlc3MsIHdvcmtjaGFp" +
-    "bjogSW50LCBlcnJvckNvZGU6IEludCkgewogICAgUkVXUklURVNUREFERFIKICAgIERST1AKICAgIENNUAogICAgVEhST1dBTllJRgp9Cg==";
+    "ejogQWRkcmVzcyA9IHMubG9hZEFkZHJlc3MoKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogOTogW0NlbGwgdW5kZXJmbG93" +
+    "XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3Mu" +
+    "dGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRhZGRyZXNzCi8vLwovLy8gW0NlbGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5v" +
+    "cmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZEFkZHJlc3Moc2VsZjogU2xpY2UpOiBBZGRyZXNzIHsgTERN" +
+    "U0dBRERSIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4yLgovLy8K" +
+    "Ly8vIFNraXBzIGFuIGBBZGRyZXNzYCBmcm9tIHRoZSBgU2xpY2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzMTogU2xp" +
+    "Y2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVBZGRyZXNzKG15QWRkcmVzcygpKQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCAzMikKLy8vICAgICAg" +
+    "ICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgczEuc2tpcEFkZHJlc3MoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gczEubG9hZFVpbnQoMzIpOyAvLyA0MgovLy8g" +
+    "fQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHNr" +
+    "aXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNl" +
+    "c2tpcGFkZHJlc3MKLy8vCi8vLyBbQ2VsbCB1bmRlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVu" +
+    "ZHMgbXV0YXRlcyBmdW4gc2tpcEFkZHJlc3Moc2VsZjogU2xpY2UpIHsgTERNU0dBRERSIE5JUCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxk" +
+    "ZXJgIHR5cGUuCi8vLwovLy8gU3RvcmVzIHRoZSBgYWRkcmVzc2AgaW4gdGhlIGNvcHkgb2YgdGhlIGBCdWlsZGVyYC4gUmV0dXJucyB0aGF0IGNvcHkuCi8vLwovLy8g" +
+    "YGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgZml6ejogQnVpbGRlciA9IGIu" +
+    "c3RvcmVBZGRyZXNzKG15QWRkcmVzcygpKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogODogW0NlbGwgb3ZlcmZsb3ddIOKA" +
+    "lCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHN0b3JlIGFuIGBhZGRyZXNzYCBpbnRvIHRoZSBgQnVpbGRlcmAgd2hlbiBpdCBjYW5ub3QgZml0IGl0LgovLy8KLy8v" +
+    "IFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcnN0b3JlYWRkcmVzcwovLy8KLy8vIFtDZWxsIG92ZXJmbG93XTogaHR0" +
+    "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vCmFzbSBleHRlbmRzIGZ1biBzdG9yZUFkZHJlc3Moc2VsZjogQnVpbGRlciwgYWRkcmVz" +
+    "czogQWRkcmVzcyk6IEJ1aWxkZXIgeyBTVFNMSUNFUiB9CgovLy8gU3RydWN0IHJlcHJlc2VudGluZyBhIGJhc2VjaGFpbiBhZGRyZXNzLiBBdmFpbGFibGUgc2luY2Ug" +
+    "VGFjdCAxLjYuMC4KLy8vCi8vLyBBIGJhc2VjaGFpbiBhZGRyZXNzICh3b3JrY2hhaW4gMCkgY2FuIGJlIGVpdGhlciBlbXB0eSAobnVsbCBoYXNoKSBvciBjb250YWlu" +
+    "IGEgMjU2LWJpdCBoYXNoIHZhbHVlLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWRkcmVzc2VzI2Jhc2VjaGFpbmFkZHJl" +
+    "c3MKLy8vCnN0cnVjdCBCYXNlY2hhaW5BZGRyZXNzIHsKICAgIGhhc2g6IEludD87Cn0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEu" +
+    "Ni4wLgovLy8KLy8vIENyZWF0ZXMgYW5kIHJldHVybnMgYW4gZW1wdHkgYmFzZWNoYWluIGFkZHJlc3Mgd2l0aCBhIG51bGwgaGFzaC4KLy8vCi8vLyBXaGVuIHNlcmlh" +
+    "bGl6ZWQsIGFuIGVtcHR5IGJhc2VjaGFpbiBhZGRyZXNzIGlzIHJlcHJlc2VudGVkIGFzIGBhZGRyX25vbmVgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxl" +
+    "KCkgewovLy8gICAgIGxldCBlbXB0eUFkZHI6IEJhc2VjaGFpbkFkZHJlc3MgPSBlbXB0eUJhc2VjaGFpbkFkZHJlc3MoKTsKLy8vICAgICBlbXB0eUFkZHIuaGFzaCA9" +
+    "PSBudWxsOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkZHJlc3NlcyNlbXB0eWJh" +
+    "c2VjaGFpbmFkZHJlc3MKLy8vCmlubGluZSBmdW4gZW1wdHlCYXNlY2hhaW5BZGRyZXNzKCk6IEJhc2VjaGFpbkFkZHJlc3MgewogICAgcmV0dXJuIEJhc2VjaGFpbkFk" +
+    "ZHJlc3MgeyBoYXNoOiBudWxsIH07Cn0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIENyZWF0ZXMgYW5kIHJl" +
+    "dHVybnMgYSBuZXcgYmFzZWNoYWluIGFkZHJlc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGhhc2ggdmFsdWUuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7" +
+    "Ci8vLyAgICAgbGV0IGFkZHI6IEJhc2VjaGFpbkFkZHJlc3MgPSBuZXdCYXNlY2hhaW5BZGRyZXNzKDB4ODNkZmQ1NTJlNjM3MjliNDcyZmNiY2M4YzQ1ZWJjYzY2OTE3" +
+    "MDI1NThiNjhlYzc1MjdlMWJhNDAzYTBmMzFhOCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFk" +
+    "ZHJlc3NlcyNuZXdiYXNlY2hhaW5hZGRyZXNzCi8vLwppbmxpbmUgZnVuIG5ld0Jhc2VjaGFpbkFkZHJlc3MoaGFzaDogSW50KTogQmFzZWNoYWluQWRkcmVzcyB7CiAg" +
+    "ICByZXR1cm4gQmFzZWNoYWluQWRkcmVzcyB7IGhhc2ggfTsKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8g" +
+    "Q3JlYXRlcyBhbmQgcmV0dXJucyBhIGJhc2VjaGFpbiBhZGRyZXNzIGRlcml2ZWQgZnJvbSBhIGNvbnRyYWN0J3MgYFN0YXRlSW5pdGAgKGNvZGUgYW5kIGRhdGEpLgov" +
+    "Ly8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBjb2RlOiBDZWxsID0gbG9hZENlbGwoKTsgLy8gbG9hZCBjb250cmFjdCBjb2RlCi8v" +
+    "LyAgICAgbGV0IGRhdGE6IENlbGwgPSBsb2FkQ2VsbCgpOyAvLyBsb2FkIGNvbnRyYWN0IGRhdGEKLy8vICAgICBsZXQgc3RhdGU6IFN0YXRlSW5pdCA9IFN0YXRlSW5p" +
+    "dCB7IGNvZGUsIGRhdGEgfTsKLy8vICAgICBsZXQgYWRkcjogQmFzZWNoYWluQWRkcmVzcyA9IGNvbnRyYWN0QmFzZWNoYWluQWRkcmVzcyhzdGF0ZSk7Ci8vLyB9Ci8v" +
+    "LyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWFkZHJlc3NlcyNjb250cmFjdGJhc2VjaGFpbmFkZHJlc3MKLy8vCmlu" +
+    "bGluZSBmdW4gY29udHJhY3RCYXNlY2hhaW5BZGRyZXNzKHM6IFN0YXRlSW5pdCk6IEJhc2VjaGFpbkFkZHJlc3MgewogICAgbGV0IGhhc2ggPSBjb250cmFjdEhhc2go" +
+    "cy5jb2RlLCBzLmRhdGEpOwogICAgcmV0dXJuIG5ld0Jhc2VjaGFpbkFkZHJlc3MoaGFzaCk7Cn0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRl" +
+    "cmAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gU3RvcmVzIHRoZSBiYXNlY2hhaW4gYWRkcmVzcyBpbiB0aGUgY29weSBvZiB0aGUgQnVp" +
+    "bGRlciBhbmQgcmV0dXJucyB0aGF0IGNvcHkuCi8vLwovLy8gSWYgdGhlIGFkZHJlc3MgaGFzIGEgYG51bGxgIGhhc2gsIHN0b3JlcyB0d28gemVybyBiaXRzIGAwYjAw" +
+    "YCAoYGFkZHJfbm9uZWApLiBPdGhlcndpc2UsCi8vLyBzdG9yZXMgdGhlIGZ1bGwgYWRkcmVzcyB3aXRoIHRoZSB0aHJlZS1iaXQgcHJlZml4IGAwYjEwMGAsCi8vLyBm" +
+    "b2xsb3dlZCBieSB0aGUgOC1iaXQgd29ya2NoYWluIElEIHNldCB0byAwIGFuZCB0aGUgMjU2LWJpdCBoYXNoLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxl" +
+    "KCkgewovLy8gICAgIGxldCBhZGRyOiBCYXNlY2hhaW5BZGRyZXNzID0gbmV3QmFzZWNoYWluQWRkcmVzcygweDgzZGZkNTUyZTYzNzI5YjQ3MmZjYmNjOGM0NWViY2M2" +
+    "NjkxNzAyNTU4YjY4ZWM3NTI3ZTFiYTQwM2EwZjMxYTgpOwovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IGIyOiBCdWlsZGVy" +
+    "ID0gYi5zdG9yZUJhc2VjaGFpbkFkZHJlc3MoYWRkcik7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDg6IFtDZWxsIG92ZXJm" +
+    "bG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzdG9yZSBhbiBgYWRkcmVzc2AgaW50byB0aGUgYEJ1aWxkZXJgIHdoZW4gaXQgY2Fubm90IGZpdCBpdC4K" +
+    "Ly8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZWJhc2VjaGFpbmFkZHJlc3MKLy8vCi8vLyBbQ2Vs" +
+    "bCBvdmVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLwpleHRlbmRzIGZ1biBzdG9yZUJhc2VjaGFpbkFkZHJlc3Mo" +
+    "c2VsZjogQnVpbGRlciwgYWRkcmVzczogQmFzZWNoYWluQWRkcmVzcyk6IEJ1aWxkZXIgewogICAgaWYgKGFkZHJlc3MuaGFzaCA9PSBudWxsKSB7CiAgICAgICAgcmV0" +
+    "dXJuIHNlbGYuc3RvcmVVaW50KDAsIDIpOyAvLyAwYjAwCiAgICB9CgogICAgcmV0dXJuIHNlbGYKICAgICAgICAuc3RvcmVVaW50KDBiMTBfMF8wMDAwMDAwMCwgMyAr" +
+    "IDgpCiAgICAgICAgLnN0b3JlVWludChhZGRyZXNzLmhhc2ghISwgMjU2KTsKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjMu" +
+    "Ci8vLwovLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGBhZGRyZXNzYCBpcyBpbiB0aGUgYmFzZWNoYWluLCBpLmUuLCBpdHMgY2hhaW4gSUQgaXMgMC4KLy8vCi8vLyBgYGB0" +
+    "YWN0Ci8vLyBmdW4gZXhhbXBsZXMoKSB7Ci8vLyAgICAgbGV0IHNvbWVCYXNlY2hhaW5BZGRyZXNzOiBBZGRyZXNzID0KLy8vICAgICAgICAgbmV3QWRkcmVzcygwLCAw" +
+    "eDgzZGZkNTUyZTYzNzI5YjQ3MmZjYmNjOGM0NWViY2M2NjkxNzAyNTU4YjY4ZWM3NTI3ZTFiYTQwM2EwZjMxYTgpOwovLy8KLy8vICAgICBsZXQgc29tZU1hc3RlcmNo" +
+    "YWluQWRkcmVzczogQWRkcmVzcyA9Ci8vLyAgICAgICAgIG5ld0FkZHJlc3MoLTEsIDB4ODNkZmQ1NTJlNjM3MjliNDcyZmNiY2M4YzQ1ZWJjYzY2OTE3MDI1NThiNjhl" +
+    "Yzc1MjdlMWJhNDAzYTBmMzFhOCk7Ci8vLwovLy8gICAgIC8vIERvZXMgbm90IHRocm93IGJlY2F1c2UgdGhlIGNoYWluIElEIGlzIDAKLy8vICAgICBmb3JjZUJhc2Vj" +
+    "aGFpbihzb21lQmFzZWNoYWluQWRkcmVzcyk7Ci8vLwovLy8gICAgIHRyeSB7Ci8vLyAgICAgICAgIC8vIFRocm93cyBiZWNhdXNlIHRoZSBjaGFpbiBJRCBpcyAtMSAo" +
+    "bWFzdGVyY2hhaW4pCi8vLyAgICAgICAgIGZvcmNlQmFzZWNoYWluKHNvbWVNYXN0ZXJjaGFpbkFkZHJlc3MpOwovLy8gICAgIH0gY2F0Y2ggKGV4aXRDb2RlKSB7Ci8v" +
+    "LyAgICAgICAgIC8vIGV4aXRDb2RlIGlzIDEzOAovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogMTM4OiBbTm90" +
+    "IGEgYmFzZWNoYWluIGFkZHJlc3NdIOKAlCBUaHJvd24gd2hlbiB0aGUgZ2l2ZW4gYGFkZHJlc3NgIGlzIG5vdCBpbiB0aGUgYmFzZWNoYWluIChjaGFpbiBJRCBpcyBu" +
+    "b3QgMCkuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1hZGRyZXNzZXMjZm9yY2ViYXNlY2hhaW4KLy8vCi8vLyBbTm90IGEg" +
+    "YmFzZWNoYWluIGFkZHJlc3NdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjMTM4Ci8vLwphc20gZnVuIGZvcmNlQmFzZWNoYWluKGFk" +
+    "ZHJlc3M6IEFkZHJlc3MpIHsgUkVXUklURVNUREFERFIgRFJPUCAxMzggVEhST1dJRiB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAx" +
+    "LjYuNC4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYGFkZHJlc3NgIGlzIGluIHRoZSBgd29ya2NoYWluYCwgaS5lLiwgaXRzIGNoYWluIElEIGlzIGVxdWFsIHRv" +
+    "IGB3b3JrY2hhaW5gLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlcygpIHsKLy8vICAgICBsZXQgc29tZUJhc2VjaGFpbkFkZHJlc3M6IEFkZHJlc3MgPQov" +
+    "Ly8gICAgICAgICBuZXdBZGRyZXNzKDAsIDB4ODNkZmQ1NTJlNjM3MjliNDcyZmNiY2M4YzQ1ZWJjYzY2OTE3MDI1NThiNjhlYzc1MjdlMWJhNDAzYTBmMzFhOCk7Ci8v" +
+    "LwovLy8gICAgIGxldCBzb21lTWFzdGVyY2hhaW5BZGRyZXNzOiBBZGRyZXNzID0KLy8vICAgICAgICAgbmV3QWRkcmVzcygtMSwgMHg4M2RmZDU1MmU2MzcyOWI0NzJm" +
+    "Y2JjYzhjNDVlYmNjNjY5MTcwMjU1OGI2OGVjNzUyN2UxYmE0MDNhMGYzMWE4KTsKLy8vCi8vLyAgICAgLy8gRG9lcyBub3QgdGhyb3cgYmVjYXVzZSB0aGUgY2hhaW4g" +
+    "SUQgbWF0Y2hlcyB3b3JrY2hhaW4gcGFyYW1ldGVyCi8vLyAgICAgZm9yY2VXb3JrY2hhaW4oc29tZUJhc2VjaGFpbkFkZHJlc3MsIDAsIDU5Myk7Ci8vLyAgICAgZm9y" +
+    "Y2VXb3JrY2hhaW4oc29tZU1hc3RlcmNoYWluQWRkcmVzcywgLTEsIDU5Myk7Ci8vLwovLy8gICAgIHRyeSB7Ci8vLyAgICAgICAgIC8vIFRocm93cyBiZWNhdXNlIHRo" +
+    "ZSBjaGFpbiBJRCBpcyAwIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggdGhlIHdvcmtjaGFpbiBwYXJhbWV0ZXIsIC0xCi8vLyAgICAgICAgIGZvcmNlV29ya2NoYWluKHNvbWVC" +
+    "YXNlY2hhaW5BZGRyZXNzLCAtMSwgNTkzKTsKLy8vICAgICB9IGNhdGNoIChleGl0Q29kZSkgewovLy8gICAgICAgICAvLyBleGl0Q29kZSBpcyA1OTMKLy8vICAgICB9" +
+    "Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIGBlcnJvckNvZGVgIOKAlCBUaHJvd24gd2hlbiB0aGUgZ2l2ZW4gYGFkZHJlc3Ng" +
+    "IGlzIG5vdCBpbiB0aGUgc3BlY2lmaWVkIGB3b3JrY2hhaW5gIChjaGFpbiBJRCBpcyBub3QgZXF1YWwgdG8gYHdvcmtjaGFpbmApLgovLy8KLy8vIFNlZTogaHR0cHM6" +
+    "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYWRkcmVzc2VzI2ZvcmNld29ya2NoYWluCi8vLwphc20oZXJyb3JDb2RlIHdvcmtjaGFpbiBhZGRyZXNzKSBmdW4g" +
+    "Zm9yY2VXb3JrY2hhaW4oYWRkcmVzczogQWRkcmVzcywgd29ya2NoYWluOiBJbnQsIGVycm9yQ29kZTogSW50KSB7CiAgICBSRVdSSVRFU1REQUREUgogICAgRFJPUAog" +
+    "ICAgQ01QCiAgICBUSFJPV0FOWUlGCn0K";
 files["std/internal/base.tact"] =
     "Ly8vIERlc2NyaWJlcyB0aGUgYmFzZSBsb2dpYyB0aGF0IGlzIGF2YWlsYWJsZSBpbiBhbGwgY29udHJhY3RzIGFuZCB0cmFpdHMgYnkgZGVmYXVsdC4KLy8vCi8vLyBU" +
     "aGlzIHRyYWl0IGlzIGltcGxpY2l0bHkgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGNvbnRyYWN0IGFuZCB0cmFpdC4KLy8vIEl0IGNvbnRhaW5zIGEgbnVtYmVyIG9m" +
@@ -405,529 +409,520 @@ files["std/internal/cells.tact"] =
     "c2Ag4omkIDI1Ny4KLy8vIFJldHVybnMgdGhhdCBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAg" +
     "bGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgZml6ejogQnVpbGRlciA9IGIuc3RvcmVJbnQoNDIsIDcpOwovLy8gfQovLy8gYGBgCi8vLwov" +
     "Ly8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHBy" +
-    "b3ZpZGUgYW4gaW5zdWZmaWNpZW50IG9yIG91dC1vZi1ib3VuZHMgYGJpdHNgIG51bWJlci4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3Jl" +
-    "Zi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZWludAovLy8KLy8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" +
-    "L2Jvb2svZXhpdC1jb2RlcyM1Ci8vLwpAbmFtZShzdG9yZV9pbnQpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3" +
-    "aXRoIGFzbSAiU1RJWCIKZXh0ZW5kcyBuYXRpdmUgc3RvcmVJbnQoc2VsZjogQnVpbGRlciwgdmFsdWU6IEludCwgYml0czogSW50KTogQnVpbGRlcjsKCi8vLyBFeHRl" +
-    "bnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4KLy8vCi8vLyBTdG9yZXMgYW4gdW5zaWduZWQgYGJpdHNgLWJpdCBgdmFsdWVgIGludG8gdGhlIGNv" +
-    "cHkgb2YgdGhlIGBCdWlsZGVyYCBmb3IgMCDiiaQgYGJpdHNgIOKJpCAyNTYuCi8vLyBSZXR1cm5zIHRoYXQgY29weSBvZiB0aGUgYEJ1aWxkZXJgLgovLy8KLy8vIGBg" +
-    "YHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJ1aWxkZXIgPSBiLnN0" +
-    "b3JlVWludCg0MiwgNik7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6IFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5n" +
-    "ZV0g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc3RvcmUgYSBuZWdhdGl2ZSBgdmFsdWVgIG9yIHByb3ZpZGUgYW4gaW5zdWZmaWNpZW50IG9yIG91dC1vZi1i" +
-    "b3VuZHMgYGJpdHNgIG51bWJlci4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZXVp" +
-    "bnQKLy8vCi8vLyBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8KQG5h" +
-    "bWUoc3RvcmVfdWludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJTVFVYIgpleHRlbmRzIG5h" +
-    "dGl2ZSBzdG9yZVVpbnQoc2VsZjogQnVpbGRlciwgdmFsdWU6IEludCwgYml0czogSW50KTogQnVpbGRlcjsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBg" +
-    "QnVpbGRlcmAgdHlwZS4KLy8vCi8vLyBTdG9yZXMgYSBgQm9vbGAgYHZhbHVlYCBpbnRvIHRoZSBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuCi8vLyBXcml0ZXMgMSBhcyBh" +
-    "IHNpbmdsZSBiaXQgaWYgYHZhbHVlYCBpcyBgdHJ1ZWAsIGFuZCB3cml0ZXMgMCBvdGhlcndpc2UuCi8vLyBSZXR1cm5zIHRoYXQgY29weSBvZiB0aGUgYEJ1aWxkZXJg" +
-    "LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJ1" +
-    "aWxkZXIgPSBiLnN0b3JlQm9vbCh0cnVlKTsgIC8vIHdyaXRlcyAxCi8vLyAgICAgbGV0IGJ1eno6IEJ1aWxkZXIgPSBiLnN0b3JlQm9vbChmYWxzZSk7IC8vIHdyaXRl" +
-    "cyAwCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZWJvb2wK" +
-    "Ly8vCmFzbSh2YWx1ZSBzZWxmKSBleHRlbmRzIGZ1biBzdG9yZUJvb2woc2VsZjogQnVpbGRlciwgdmFsdWU6IEJvb2wpOiBCdWlsZGVyIHsgMSBTVEkgfQoKLy8vIEV4" +
-    "dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBCdWlsZGVyYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjUuMC4KLy8vCi8vLyBBbGlhcyB0byBgQnVpbGRlci5z" +
-    "dG9yZUJvb2woKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBs" +
-    "ZXQgZml6ejogQnVpbGRlciA9IGIuc3RvcmVCaXQodHJ1ZSk7ICAvLyB3cml0ZXMgMQovLy8gICAgIGxldCBidXp6OiBCdWlsZGVyID0gYi5zdG9yZUJpdChmYWxzZSk7" +
-    "IC8vIHdyaXRlcyAwCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZWJp" +
-    "dAovLy8KYXNtKHZhbHVlIHNlbGYpIGV4dGVuZHMgZnVuIHN0b3JlQml0KHNlbGY6IEJ1aWxkZXIsIHZhbHVlOiBCb29sKTogQnVpbGRlciB7IDEgU1RJIH0KCi8vLyBF" +
-    "eHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4KLy8vCi8vLyBTdG9yZXMgKHNlcmlhbGl6ZXMpIGFuIHVuc2lnbmVkIGBJbnRgIGB2YWx1ZWAg" +
-    "aW4gdGhlIHJhbmdlIGZyb20gMCB0byAyXjEyMCDiiJIgMSBpbmNsdXNpdmUgaW50byB0aGUgY29weSBvZiB0aGUgYEJ1aWxkZXJgLiBUaGUgc2VyaWFsaXphdGlvbiBv" +
-    "ZiBgdmFsdWVgIGNvbnNpc3RzIG9mIGEgNC1iaXQgdW5zaWduZWQgYmlnLWVuZGlhbiBpbnRlZ2VyIGBsYCwgd2hpY2ggaXMgdGhlIHNtYWxsZXN0IGludGVnZXIgYGxg" +
-    "IOKJpSAwLCBzdWNoIHRoYXQgYHZhbHVlYCA8IDJeKDggKiBgbGApLCBmb2xsb3dlZCBieSBhbiA4ICogYGxgLWJpdCB1bnNpZ25lZCBiaWctZW5kaWFuIHJlcHJlc2Vu" +
-    "dGF0aW9uIG9mIGB2YWx1ZWAuIFJldHVybnMgdGhhdCBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuCi8vLwovLy8gVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gd2F5IG9mIHN0" +
-    "b3JpbmcgbmFub1RvbmNvaW5zLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8v" +
-    "LyAgICAgbGV0IGZpeno6IEJ1aWxkZXIgPSBiLnN0b3JlQ29pbnMoNDIpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBb" +
-    "SW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHN0b3JlIGFuIG91dC1vZi1ib3VuZHMgYHZhbHVlYC4KLy8v" +
-    "Ci8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZWNvaW5zCi8vLwovLy8gW0ludGVnZXIgb3V0IG9mIGV4" +
-    "cGVjdGVkIHJhbmdlXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vCmFzbSBleHRlbmRzIGZ1biBzdG9yZUNvaW5zKHNlbGY6" +
-    "IEJ1aWxkZXIsIHZhbHVlOiBJbnQpOiBCdWlsZGVyIHsgU1RWQVJVSU5UMTYgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBCdWlsZGVyYCB0eXBlLiBB" +
-    "dmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBBbGlhcyB0byBgQnVpbGRlci5zdG9yZUNvaW5zKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFt" +
-    "cGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJ1aWxkZXIgPSBiLnN0b3JlVmFyVWludDE2KDQyKTsK" +
-    "Ly8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcnN0b3JldmFydWludDE2" +
-    "Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZWNvaW5zCi8vLwphc20gZXh0ZW5kcyBmdW4gc3RvcmVWYXJV" +
-    "aW50MTYoc2VsZjogQnVpbGRlciwgdmFsdWU6IEludCk6IEJ1aWxkZXIgeyBTVFZBUlVJTlQxNiB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxk" +
-    "ZXJgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFNpbWlsYXIgdG8gYEJ1aWxkZXIuc3RvcmVDb2lucygpYCwgYnV0IHdpdGggYSBkaWZm" +
-    "ZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4xMTkgdG8gMl4xMTkgLSAxIGluY2x1c2l2ZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8v" +
-    "ICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBCdWlsZGVyID0gYi5zdG9yZVZhckludDE2KC00Mik7Ci8vLyB9Ci8vLyBg" +
-    "YGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6IFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV0g4oCUIFRocm93biB3aGVuIGF0dGVtcHRp" +
-    "bmcgdG8gc3RvcmUgYW4gb3V0LW9mLWJvdW5kcyBgdmFsdWVgLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVp" +
-    "bGRlcnN0b3JldmFyaW50MTYKLy8vCi8vLyBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQt" +
-    "Y29kZXMjNQovLy8KYXNtIGV4dGVuZHMgZnVuIHN0b3JlVmFySW50MTYoc2VsZjogQnVpbGRlciwgdmFsdWU6IEludCk6IEJ1aWxkZXIgeyBTVFZBUklOVDE2IH0KCi8v" +
-    "LyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gU3RvcmVzIChzZXJpYWxp" +
-    "emVzKSBhbiB1bnNpZ25lZCBgSW50YCBgdmFsdWVgIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gMl4yNDgg4oiSIDEgaW5jbHVzaXZlIGludG8gdGhlIGNvcHkgb2YgdGhl" +
-    "IGBCdWlsZGVyYC4gVGhlIHNlcmlhbGl6YXRpb24gb2YgYHZhbHVlYCBjb25zaXN0cyBvZiBhIDUtYml0IHVuc2lnbmVkIGJpZy1lbmRpYW4gaW50ZWdlciBgbGAsIHdo" +
-    "aWNoIGlzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIGBsYCDiiaUgMCwgc3VjaCB0aGF0IGB2YWx1ZWAgPCAyXjggKiBgbGAsIGZvbGxvd2VkIGJ5IGFuIDggKiBgbGAtYml0" +
-    "IHVuc2lnbmVkIGJpZy1lbmRpYW4gcmVwcmVzZW50YXRpb24gb2YgYHZhbHVlYC4gUmV0dXJucyB0aGF0IGNvcHkgb2YgdGhlIGBCdWlsZGVyYC4KLy8vCi8vLyBgYGB0" +
-    "YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBCdWlsZGVyID0gYi5zdG9y" +
-    "ZVZhclVpbnQzMig0MjAwMDApOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQg" +
-    "cmFuZ2VdIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHN0b3JlIGFuIG91dC1vZi1ib3VuZHMgYHZhbHVlYC4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50" +
-    "YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZXZhcnVpbnQzMgovLy8KLy8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBz" +
-    "Oi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLwphc20gZXh0ZW5kcyBmdW4gc3RvcmVWYXJVaW50MzIoc2VsZjogQnVpbGRlciwgdmFsdWU6" +
-    "IEludCk6IEJ1aWxkZXIgeyBTVFZBUlVJTlQzMiB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBU" +
-    "YWN0IDEuNi4wLgovLy8KLy8vIFNpbWlsYXIgdG8gYEJ1aWxkZXIuc3RvcmVWYXJVaW50MzIoKWAsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IGB2YWx1ZWAgcmFuZ2U6IGZy" +
-    "b20gLTJeMjQ3IHRvIDJeMjQ3IC0gMSBpbmNsdXNpdmUuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBi" +
-    "ZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgZml6ejogQnVpbGRlciA9IGIuc3RvcmVWYXJJbnQzMigtNDIwMDAwKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhp" +
-    "dCBjb2RlcwovLy8KLy8vICogNTogW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzdG9yZSBhbiBvdXQt" +
-    "b2YtYm91bmRzIGB2YWx1ZWAuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmV2YXJpbnQzMgov" +
-    "Ly8KLy8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLwphc20gZXh0" +
-    "ZW5kcyBmdW4gc3RvcmVWYXJJbnQzMihzZWxmOiBCdWlsZGVyLCB2YWx1ZTogSW50KTogQnVpbGRlciB7IFNUVkFSSU5UMzIgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlv" +
-    "biBmb3IgdGhlIGBCdWlsZGVyYCB0eXBlLgovLy8KLy8vIFN0b3JlcyBhIHJlZmVyZW5jZSBgY2VsbGAgaW50byBhIGNvcHkgb2YgdGhlIGBCdWlsZGVyYC4KLy8vIFJl" +
-    "dHVybnMgdGhhdCBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuCi8vLwovLy8gTm90ZSB0aGF0IGEgc2luZ2xlIGBDZWxsYCBjYW4gY29udGFpbiB1cCB0byA0IHJlZmVyZW5j" +
-    "ZXMuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgZml6ejog" +
-    "QnVpbGRlciA9IGIuc3RvcmVSZWYoZW1wdHlDZWxsKCkpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA4OiBbQ2VsbCBvdmVy" +
-    "Zmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc3RvcmUgbW9yZSB0aGFuIDQgcmVmZXJlbmNlcyBpbiBhIHNpbmdsZSBgQ2VsbGAuCi8vLwovLy8gU2Vl" +
-    "OgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmVyZWYKLy8vCi8vLyBbQ2VsbCBvdmVyZmxvd106IGh0dHBz" +
-    "Oi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLwphc20oY2VsbCBzZWxmKSBleHRlbmRzIGZ1biBzdG9yZVJlZihzZWxmOiBCdWlsZGVyLCBj" +
-    "ZWxsOiBDZWxsKTogQnVpbGRlciB7IFNUUkVGIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4KLy8vCi8vLyBTdG9yZXMgYSBg" +
-    "c2xpY2VgIGludG8gYSBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuCi8vLyBSZXR1cm5zIHRoYXQgY29weSBvZiB0aGUgYEJ1aWxkZXJgLgovLy8KLy8vIGBgYHRhY3QKLy8v" +
-    "IGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gZW1wdHlDZWxsKCkuYXNTbGlj" +
-    "ZSgpOwovLy8gICAgIGxldCBmaXp6OiBCdWlsZGVyID0gYi5zdG9yZVNsaWNlKHMpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3Mu" +
-    "dGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmVzbGljZQovLy8KYXNtIGV4dGVuZHMgZnVuIHN0b3JlU2xpY2Uoc2VsZjogQnVpbGRlciwgc2xp" +
-    "Y2U6IFNsaWNlKTogQnVpbGRlciB7IFNUU0xJQ0VSIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4gQXZhaWxhYmxlIHNpbmNl" +
-    "IFRhY3QgMS41LjAuCi8vLwovLy8gQXBwZW5kcyBhbGwgZGF0YSBmcm9tIHRoZSBgb3RoZXJgIGJ1aWxkZXIgdG8gdGhlIGNvcHkgb2YgdGhlIGBzZWxmYCBidWlsZGVy" +
-    "LiBSZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZShvcDogSW50LCBxdWVyeUlkOiBJbnQsIHBheWxvYWQ6IEJ1aWxkZXIpIHsK" +
-    "Ly8vICAgIGxldCBtc2dCb2R5ID0gYmVnaW5DZWxsKCkuc3RvcmVVaW50KG9wLCAzMikuc3RvcmVVaW50KHF1ZXJ5SWQsIDY0KTsKLy8vICAgIGlmIChwYXlsb2FkLmJp" +
-    "dHMoKSAhPSAwKSB7Ci8vLyAgICAgICAgbXNnQm9keSA9IG1zZ0JvZHkuc3RvcmVCdWlsZGVyKHBheWxvYWQpOyAvLyBhc3NpZ25tZW50IGlzIGltcG9ydGFudCBoZXJl" +
-    "Ci8vLyAgICB9Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZWJ1aWxk" +
-    "ZXIKLy8vCmFzbSBleHRlbmRzIGZ1biBzdG9yZUJ1aWxkZXIoc2VsZjogQnVpbGRlciwgb3RoZXI6IEJ1aWxkZXIpOiBCdWlsZGVyIHsgU1RCUiB9CgovLy8gRXh0ZW5z" +
-    "aW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgovLy8KLy8vIElmIHRoZSBgY2VsbGAgaXMgbm90IGBu" +
-    "dWxsYCwgc3RvcmVzIDEgYXMgYSBzaW5nbGUgYml0IGFuZCB0aGVuIHJlZmVyZW5jZSBgY2VsbGAgaW50byB0aGUgY29weSBvZiB0aGUgYEJ1aWxkZXJgLiBSZXR1cm5z" +
-    "IHRoYXQgY29weS4KLy8vCi8vLyBJZiB0aGUgYGNlbGxgIGlzIGBudWxsYCwgb25seSBzdG9yZXMgMCBhcyBhIHNpbmdsZSBiaXQgaW50byB0aGUgY29weSBvZiB0aGUg" +
-    "YEJ1aWxkZXJgLiBSZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBOb3RlIHRoYXQgYSBzaW5nbGUgYENlbGxgIGNhbiBjb250YWluIHVwIHRvIDQgcmVmZXJlbmNlcy4K" +
-    "Ly8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBCdWls" +
-    "ZGVyID0gYgovLy8gICAgICAgICAuc3RvcmVNYXliZVJlZihlbXB0eUNlbGwoKSkgLy8gMSwgdGhlbiBlbXB0eSBjZWxsCi8vLyAgICAgICAgIC5zdG9yZU1heWJlUmVm" +
-    "KG51bGwpOyAgICAgICAvLyAwCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDg6IFtDZWxsIG92ZXJmbG93XSDigJQgVGhyb3du" +
-    "IHdoZW4gYXR0ZW1wdGluZyB0byBzdG9yZSBtb3JlIHRoYW4gNCByZWZlcmVuY2VzIGluIGEgc2luZ2xlIGBDZWxsYC4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50" +
-    "YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZW1heWJlcmVmCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5n" +
-    "Lm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8KYXNtKGNlbGwgc2VsZikgZXh0ZW5kcyBmdW4gc3RvcmVNYXliZVJlZihzZWxmOiBCdWlsZGVyLCBjZWxsOiBDZWxsPyk6" +
-    "IEJ1aWxkZXIgeyBTVE9QVFJFRiB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuCi8vLwovLy8gQ29udmVydHMgYSBgQnVpbGRl" +
-    "cmAgaW50byBhbiBvcmRpbmFyeSBgQ2VsbGAuCi8vLwovLy8gTk9URTogKipHYXMgZXhwZW5zaXZlISoqIFRoaXMgZnVuY3Rpb24gdXNlcyA1MDAgZ2FzIHVuaXRzIG9y" +
-    "IG1vcmUuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgYzog" +
-    "Q2VsbCA9IGIuZW5kQ2VsbCgpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNi" +
-    "dWlsZGVyZW5kY2VsbAovLy8KYXNtIGV4dGVuZHMgZnVuIGVuZENlbGwoc2VsZjogQnVpbGRlcik6IENlbGwgeyBFTkRDIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24g" +
-    "Zm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4KLy8vCi8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2VsbCByZWZlcmVuY2VzIGFscmVhZHkgc3RvcmVkIGluIHRoZSBgQnVp" +
-    "bGRlcmAgYXMgYW4gYEludGAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8v" +
-    "ICAgICBsZXQgcmVmczogSW50ID0gYi5yZWZzKCk7IC8vIDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcv" +
-    "cmVmL2NvcmUtY2VsbHMjYnVpbGRlcnJlZnMKLy8vCmFzbSBleHRlbmRzIGZ1biByZWZzKHNlbGY6IEJ1aWxkZXIpOiBJbnQgeyBCUkVGUyB9CgovLy8gRXh0ZW5zaW9u" +
-    "IGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuCi8vLwovLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyBhbHJlYWR5IHN0b3JlZCBpbiB0aGUg" +
-    "YEJ1aWxkZXJgIGFzIGFuIGBJbnRgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7" +
-    "Ci8vLyAgICAgbGV0IGJpdHM6IEludCA9IGIuYml0cygpOyAvLyAwCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
-    "b3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJiaXRzCi8vLwphc20gZXh0ZW5kcyBmdW4gYml0cyhzZWxmOiBCdWlsZGVyKTogSW50IHsgQkJJVFMgfQoKLy8vIEV4dGVu" +
-    "c2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBCdWlsZGVyYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBDb21wdXRlcyBhbmQgcmV0dXJucyB0" +
-    "aGUgYEludGAgZGVwdGggb2YgdGhlIGBCdWlsZGVyYC4gUHJvZHVjZXMgMCBpZiB0aGUgYEJ1aWxkZXJgIGhhcyBubyByZWZlcmVuY2VzIHN0b3JlZCBzbyBmYXIsIG90" +
-    "aGVyd2lzZSAxIHBsdXMgdGhlIG1heGltdW0gb2YgdGhlIGRlcHRocyBvZiB0aGUgcmVmZXJlbmNlZCBjZWxscy4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBs" +
-    "ZSgpIHsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KTsKLy8vICAgICBsZXQgZGVwdGg6IEludCA9IGIuZGVwdGgoKTsg" +
-    "Ly8gMAovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyZGVwdGgKLy8vCmFzbSBl" +
-    "eHRlbmRzIGZ1biBkZXB0aChzZWxmOiBCdWlsZGVyKTogSW50IHsgQkRFUFRIIH0KCi8vCi8vIFNsaWNlCi8vCgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUg" +
-    "YENlbGxgIHR5cGUuCi8vLwovLy8gT3BlbnMgdGhlIGBDZWxsYCBmb3IgcGFyc2luZyBhbmQgcmV0dXJucyBpdCBhcyBhIGBTbGljZWAuCi8vLwovLy8gYGBgdGFjdAov" +
-    "Ly8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGM6IENlbGwgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgczogU2xpY2UgPSBjLmJlZ2luUGFyc2UoKTsKLy8v" +
-    "IH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjY2VsbGJlZ2lucGFyc2UKLy8vCmFzbSBl" +
-    "eHRlbmRzIGZ1biBiZWdpblBhcnNlKHNlbGY6IENlbGwpOiBTbGljZSB7IENUT1MgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGlj" +
-    "ZWAgdHlwZS4KLy8vCi8vLyBMb2FkcyB0aGUgbmV4dCByZWZlcmVuY2UgZnJvbSB0aGUgYFNsaWNlYCBhcyBhIGBDZWxsYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4g" +
-    "ZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6" +
-    "ejogQ2VsbCA9IHMxLmxvYWRSZWYoKTsKLy8vCi8vLyAgICAgbGV0IHMyOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVJlZihlbXB0eUNlbGwo" +
-    "KSkKLy8vICAgICAgICAgLnN0b3JlUmVmKHMxLmFzQ2VsbCgpKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8gICAgIGxldCByZWYxOiBDZWxsID0gczIubG9hZFJl" +
-    "ZigpOwovLy8gICAgIGxldCByZWYyOiBDZWxsID0gczIubG9hZFJlZigpOwovLy8gICAgIHJlZjEgPT0gcmVmMjsgLy8gZmFsc2UKLy8vIH0KLy8vIGBgYAovLy8KLy8v" +
-    "ICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogODogW0NlbGwgb3ZlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgYSByZWZlcmVuY2UgYENl" +
-    "bGxgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQuCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gbG9h" +
-    "ZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMj" +
-    "c2xpY2Vsb2FkcmVmCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW0NlbGwgdW5k" +
-    "ZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZFJl" +
-    "ZihzZWxmOiBTbGljZSk6IENlbGwgeyBMRFJFRiB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUg" +
-    "c2luY2UgVGFjdCAxLjYuMi4KLy8vCi8vLyBTa2lwcyB0aGUgbmV4dCByZWZlcmVuY2UgZnJvbSB0aGUgYFNsaWNlYC4gU2ltaWxhciB0byBkaXNjYXJkaW5nIHRoZSBy" +
-    "ZXR1cm4gdmFsdWUgb2YgYFNsaWNlLmxvYWRSZWYoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHMxOiBTbGljZSA9IGJl" +
-    "Z2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVJlZihlbXB0eUNlbGwoKSkKLy8vICAgICAgICAgLnN0b3JlVWludCg0MiwgMzIpCi8vLyAgICAgICAgIC5hc1NsaWNl" +
-    "KCk7Ci8vLwovLy8gICAgIHMxLnNraXBSZWYoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gczEubG9hZFVpbnQoMzIpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwov" +
-    "Ly8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc2tpcCBhIHJlZmVyZW5jZSBg" +
-    "Q2VsbGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdC4KLy8vICogOTogW0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBz" +
-    "a2lwIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxs" +
-    "cyNzbGljZXNraXByZWYKLy8vCi8vLyBbQ2VsbCBvdmVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbQ2VsbCB1" +
-    "bmRlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcFJlZihzZWxm" +
-    "OiBTbGljZSkgeyBMRFJFRiBOSVAgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAu" +
-    "Ci8vLwovLy8gUHJlbG9hZHMgdGhlIG5leHQgcmVmZXJlbmNlIGZyb20gdGhlIGBTbGljZWAgYXMgYSBgQ2VsbGAuIERvZXNuJ3QgbW9kaWZ5IHRoZSBvcmlnaW5hbCBg" +
-    "U2xpY2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlcygpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlD" +
-    "ZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogQ2VsbCA9IHMxLnByZWxvYWRSZWYoKTsgLy8gZGlkbid0IG1vZGlmeSBzMQovLy8KLy8vICAgICBsZXQg" +
-    "czI6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAgICAgLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKQovLy8gICAgICAgICAuc3RvcmVSZWYoczEuYXNDZWxsKCkpCi8v" +
-    "LyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIGxldCByZWYxOiBDZWxsID0gczIucHJlbG9hZFJlZigpOwovLy8gICAgIGxldCByZWYyOiBDZWxsID0gczIu" +
-    "cHJlbG9hZFJlZigpOwovLy8gICAgIHJlZjEgPT0gcmVmMjsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA4OiBb" +
-    "Q2VsbCBvdmVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcHJlbG9hZCBhIHJlZmVyZW5jZSBgQ2VsbGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29u" +
-    "dGFpbiBpdC4KLy8vICogOTogW0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAg" +
-    "Y29udGFpbnMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXByZWxvYWRyZWYKLy8vICogaHR0" +
-    "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29r" +
-    "L2V4aXQtY29kZXMjOAovLy8gW0NlbGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRz" +
-    "IGZ1biBwcmVsb2FkUmVmKHNlbGY6IFNsaWNlKTogQ2VsbCB7IFBMRFJFRiB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0" +
-    "eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBMb2FkcyBhIHNpbmdsZSBiaXQgZnJvbSB0aGUgYFNsaWNlYDogaWYgaXQncyAxLCB0aGVuIHRo" +
-    "ZSByZWZlcmVuY2VkIGBDZWxsYCBpcyBsb2FkZWQgYW5kIHJldHVybmVkLiBJZiB0aGUgbG9hZGVkIGJpdCBpcyAwLCB0aGVuIG5vdGhpbmcgZWxzZSBpcyBsb2FkZWQg" +
-    "YW5kIGBudWxsYCBpcyByZXR1cm5lZC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgcyA9IG1zZy5hc1NsaWNlKCk7Ci8vLyAg" +
-    "ICAgbGV0IG91dEFjdGlvbnMgPSBzLmxvYWRNYXliZVJlZigpOwovLy8KLy8vICAgICBpZiAob3V0QWN0aW9ucyAhPSBudWxsKSB7Ci8vLyAgICAgICAgIGxldCBhY3Rp" +
-    "b25zID0gb3V0QWN0aW9ucyEhOwovLy8gICAgICAgICAvLyAuLi5wcm9jZXNzIGFjdGlvbnMuLi4KLy8vICAgICB9Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4" +
-    "aXQgY29kZXMKLy8vCi8vLyAqIDg6IFtDZWxsIG92ZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIGEgcmVmZXJlbmNlIGBDZWxsYCB3aGVu" +
-    "IGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0LgovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgbW9yZSBk" +
-    "YXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9h" +
-    "ZG1heWJlcmVmCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtDZWxsIG92ZXJmbG93XTogaHR0cHM6Ly9kb2Nz" +
-    "LnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2Rl" +
-    "cyM5Ci8vLwphc20oLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRNYXliZVJlZihzZWxmOiBTbGljZSk6IENlbGw/IHsgTERPUFRSRUYgfQoKLy8vIEV4dGVu" +
-    "c2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYENlbGw/YCBm" +
-    "cm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgU2xpY2UubG9hZE1heWJlUmVmKClgLgovLy8KLy8vIGBgYHRh" +
-    "Y3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzMTogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVNYXliZVJlZihlbXB0eUNlbGwo" +
-    "KSkKLy8vICAgICAgICAgLnN0b3JlVWludCg0MiwgMzIpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMxLnNraXBNYXliZVJlZigpOwovLy8gICAg" +
-    "IGxldCBmaXp6OiBJbnQgPSBzMS5sb2FkVWludCgzMik7IC8vIDQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDg6IFtDZWxs" +
-    "IG92ZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBza2lwIGEgcmVmZXJlbmNlIGBDZWxsYCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0" +
-    "LgovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHNraXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4K" +
-    "Ly8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcG1heWJlcmVmCi8vLyAqIGh0dHBzOi8vZG9j" +
-    "cy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtDZWxsIG92ZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNv" +
-    "ZGVzIzgKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBtdXRhdGVz" +
-    "IGZ1biBza2lwTWF5YmVSZWYoc2VsZjogU2xpY2UpIHsgTERPUFRSRUYgTklQIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2" +
-    "YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFByZWxvYWRzIGEgc2luZ2xlIGJpdCBmcm9tIHRoZSBgU2xpY2VgOiBpZiBpdCdzIDEsIHRoZW4gdGhlIHJl" +
-    "ZmVyZW5jZWQgYENlbGxgIGlzIHByZWxvYWRlZCBhbmQgcmV0dXJuZWQuIElmIHRoZSBwcmVsb2FkZWQgYml0IGlzIDAsIHRoZW4gYG51bGxgIGlzIHJldHVybmVkLiBE" +
-    "b2Vzbid0IG1vZGlmeSB0aGUgb3JpZ2luYWwgYFNsaWNlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZXMoKSB7Ci8vLyAgICAgbGV0IHMxOiBTbGljZSA9" +
-    "IGJlZ2luQ2VsbCgpLnN0b3JlTWF5YmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogQ2VsbCA9IHMxLnByZWxvYWRNYXliZVJlZigp" +
-    "OyAvLyByZXR1cm5zIGVtcHR5Q2VsbCgpIGFuZCBkb2Vzbid0IG1vZGlmeSBzMQovLy8KLy8vICAgICBsZXQgczI6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAg" +
-    "ICAgLnN0b3JlTWF5YmVSZWYobnVsbCkKLy8vICAgICAgICAgLnN0b3JlTWF5YmVSZWYoczEuYXNDZWxsKCkpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8g" +
-    "ICAgIGxldCByZWYxOiBDZWxsID0gczIucHJlbG9hZE1heWJlUmVmKCk7IC8vIHJldHVybnMgbnVsbCBhbmQgZG9lc24ndCBtb2RpZnkgczIKLy8vICAgICBsZXQgcmVm" +
-    "MjogQ2VsbCA9IHMyLnByZWxvYWRNYXliZVJlZigpOyAvLyBzYW1lIGVmZmVjdAovLy8gICAgIHJlZjEgPT0gbnVsbDsgLy8gdHJ1ZQovLy8gICAgIHJlZjEgPT0gcmVm" +
-    "MjsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0" +
-    "dGVtcHRpbmcgdG8gcHJlbG9hZCBhIHJlZmVyZW5jZSBgQ2VsbGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdC4KLy8vICogOTogW0NlbGwgdW5kZXJmbG93" +
-    "XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRw" +
-    "czovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXByZWxvYWRtYXliZXJlZgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29r" +
-    "L2V4aXQtY29kZXMKLy8vCi8vLyBbQ2VsbCBvdmVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbQ2VsbCB1bmRl" +
-    "cmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgZnVuIHByZWxvYWRNYXliZVJlZihzZWxmOiBT" +
-    "bGljZSk6IENlbGw/IHsgUExET1BUUkVGIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMg" +
-    "MCDiiaQgYGxgIOKJpCAxMDIzIGJpdHMgZnJvbSB0aGUgYFNsaWNlYCBhbmQgcmV0dXJucyB0aGVtIGFzIGEgc2VwYXJhdGUgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0" +
-    "cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVlIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDVdOiBgSW50ZWdlciBvdXQg" +
-    "b2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0" +
-    "aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6" +
-    "IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBzLmxvYWRCaXRzKDcpOwovLy8gfQov" +
-    "Ly8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRiaXRzCi8vLwovLy8gW2V4aXQg" +
-    "Y29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
-    "b3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShsb2FkX2JpdHMpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNl" +
-    "ZCB3aXRoIGFzbSAiTERTTElDRVgiCmV4dGVuZHMgbXV0YXRlcyBuYXRpdmUgbG9hZEJpdHMoc2VsZjogU2xpY2UsIGw6IEludCk6IFNsaWNlOwoKLy8vIEV4dGVuc2lv" +
-    "biBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBQcmVsb2FkcyAwIOKJpCBgbGAg4omkIDEwMjMgYml0cyBmcm9tIHRoZSBgU2xpY2VgIGFuZCBy" +
-    "ZXR1cm5zIHRoZW0gYXMgYSBzZXBhcmF0ZSBgU2xpY2VgLgovLy8gRG9lc24ndCBtb2RpZnkgdGhlIG9yaWdpbmFsIGBTbGljZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8g" +
-    "c3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4" +
-    "cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlv" +
-    "biB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBT" +
-    "bGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IFNsaWNlID0gcy5wcmVsb2FkQml0cyg3KTsKLy8vIH0K" +
-    "Ly8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VwcmVsb2FkYml0cwovLy8KLy8vIFtl" +
-    "eGl0IGNvZGUgNV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1s" +
-    "YW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KQG5hbWUocHJlbG9hZF9iaXRzKSAvLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVyLCBzbyBub3Qg" +
-    "cmVwbGFjZWQgd2l0aCBhc20gIlBMRFNMSUNFWCIKZXh0ZW5kcyBuYXRpdmUgcHJlbG9hZEJpdHMoc2VsZjogU2xpY2UsIGw6IEludCk6IFNsaWNlOwoKLy8vIEV4dGVu" +
-    "c2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBMb2FkcyBhbmQgcmV0dXJucyBhIHNpZ25lZCBgbGAtYml0IGBJbnRgIGZy" +
-    "b20gdGhlIGBTbGljZWAsIGZvciAwIOKJpCBsIOKJpCAyNTcuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJv" +
-    "dyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBsb2Fk" +
-    "IG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dg" +
-    "LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNl" +
-    "KCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZEludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFu" +
-    "Zy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkaW50Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNv" +
-    "ZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShsb2FkX2ludCkgLy8gc3Bl" +
-    "Y2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJMRElYIgpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRJbnQo" +
-    "c2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gUHJlbG9hZHMgYW5kIHJl" +
-    "dHVybnMgYSBzaWduZWQgYGxgLWJpdCBgSW50YCBmcm9tIHRoZSBgU2xpY2VgLCBmb3IgMCDiiaQgbCDiiaQgMjU3LgovLy8gRG9lc24ndCBtb2RpZnkgdGhlIGBTbGlj" +
-    "ZWAuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29k" +
-    "ZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNv" +
-    "bnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFt" +
-    "cGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMu" +
-    "cHJlbG9hZEludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vw" +
-    "cmVsb2FkaW50Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06" +
-    "IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShwcmVsb2FkX2ludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVu" +
-    "YyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERJWCIKZXh0ZW5kcyBuYXRpdmUgcHJlbG9hZEludChzZWxmOiBTbGljZSwgbDogSW50KTogSW50" +
-    "OwoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBMb2FkcyBhbmQgcmV0dXJucyBhbiB1bnNpZ25lZCBg" +
-    "bGAtYml0IGBJbnRgIGZyb20gdGhlIGBTbGljZWAsIGZvciAwIOKJpCBsIOKJpCAyNTYuCi8vLwovLy8gQXR0ZW1wdHMgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRz" +
-    "IGBsYCB2YWx1ZSB0aHJvdyBhbiBleGNlcHRpb24gd2l0aAovLy8gW2V4aXQgY29kZSA1XTogYEludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlYC4KLy8vCi8vLyBB" +
-    "dHRlbXB0cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBg" +
-    "Q2VsbCB1bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlVWlu" +
-    "dCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRVaW50KDcpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOgovLy8gKiBodHRw" +
-    "czovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWR1aW50Ci8vLwovLy8gW2V4aXQgY29kZSA1XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFu" +
-    "Zy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtleGl0IGNvZGUgOV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFt" +
-    "ZShsb2FkX3VpbnQpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiTERVWCIKZXh0ZW5kcyBtdXRh" +
-    "dGVzIG5hdGl2ZSBsb2FkVWludChzZWxmOiBTbGljZSwgbDogSW50KTogSW50OwoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8v" +
-    "Ci8vLyBQcmVsb2FkcyBhbmQgcmV0dXJucyBhbiB1bnNpZ25lZCBgbGAtYml0IGBJbnRgIGZyb20gdGhlIGBTbGljZWAsIGZvciAwIOKJpCBsIOKJpCAyNTYuCi8vLyBE" +
-    "b2Vzbid0IG1vZGlmeSB0aGUgYFNsaWNlYC4KLy8vCi8vLyBBdHRlbXB0cyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVlIHRocm93IGFuIGV4Y2Vw" +
-    "dGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDVdOiBgSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VgLgovLy8KLy8vIEF0dGVtcHRzIHRvIHByZWxvYWQgbW9yZSBk" +
-    "YXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFpbnMgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwov" +
-    "Ly8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVVaW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8v" +
-    "LyAgICAgbGV0IGZpeno6IEludCA9IHMucHJlbG9hZFVpbnQoNyk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
-    "b3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcHJlbG9hZHVpbnQKLy8vCi8vLyBbZXhpdCBjb2RlIDVdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQt" +
-    "Y29kZXMjNQovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCkBuYW1lKHByZWxvYWRfdWludCkg" +
-    "Ly8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJQTERVWCIKZXh0ZW5kcyBuYXRpdmUgcHJlbG9hZFVp" +
-    "bnQoc2VsZjogU2xpY2UsIGw6IEludCk6IEludDsKCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9h" +
-    "ZHMgYSBzaW5nbGUgYml0IGFuZCByZXR1cm5zIGEgYEJvb2xgIHZhbHVlIGZyb20gdGhlIGBTbGljZWAuCi8vLyBSZWFkcyBgdHJ1ZWAgaWYgdGhlIGxvYWRlZCBiaXQg" +
-    "aXMgZXF1YWwgdG8gMSwgYW5kIHJlYWRzIGBmYWxzZWAgb3RoZXJ3aXNlLgovLy8KLy8vIEF0dGVtcHRzIHRvIGxvYWQgc3VjaCBgQm9vbGAgd2hlbiB0aGUgYFNsaWNl" +
-    "YCBkb2Vzbid0IGNvbnRhaW4gaXQgdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGgKLy8vIFtleGl0IGNvZGUgOF06IGBDZWxsIG92ZXJmbG93YC4KLy8vCi8vLyBBdHRlbXB0" +
-    "cyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zIHRocm93IGFuIGV4Y2VwdGlvbiB3aXRoCi8vLyBbZXhpdCBjb2RlIDldOiBgQ2VsbCB1" +
-    "bmRlcmZsb3dgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlQm9vbCh0cnVl" +
-    "KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmxvYWRCb29sKCk7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFtleGl0IGNvZGUgOF06" +
-    "IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29r" +
-    "L2V4aXQtY29kZXMjOQovLy8KYXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkQm9vbChzZWxmOiBTbGljZSk6IEJvb2wgeyAxIExESSB9CgovLy8gRXh0" +
-    "ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMi4KLy8vCi8vLyBTa2lwcyBhIHNpbmds" +
-    "ZSBiaXQgZnJvbSB0aGUgYFNsaWNlYC4gU2ltaWxhciB0byBkaXNjYXJkaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYFNsaWNlLmxvYWRCb29sKClgLgovLy8KLy8vIGBg" +
-    "YHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZUJvb2wodHJ1ZSkKLy8vICAg" +
-    "ICAgICAgLnN0b3JlVWludCg0MiwgNykKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgcy5za2lwQm9vbCgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQg" +
-    "PSBzLmxvYWRVaW50KDcpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCUIFRo" +
-    "cm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc2tpcCBhIGBCb29sYCB3aGVuIHRoZSBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdC4KLy8vICogOTogW0NlbGwgdW5kZXJm" +
-    "bG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBza2lwIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZToKLy8vICog" +
-    "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwYm9vbAovLy8KLy8vIFtDZWxsIG92ZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRh" +
-    "Y3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5" +
-    "Ci8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwQm9vbChzZWxmOiBTbGljZSkgeyAxIExESSBOSVAgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlv" +
-    "biBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAuCi8vLwovLy8gQWxpYXMgdG8gYFNsaWNlLmxvYWRCb29sKClgLgovLy8KLy8v" +
-    "IGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlQm9vbCh0cnVlKS5hc1NsaWNlKCk7Ci8vLyAg" +
-    "ICAgbGV0IGZpeno6IEJvb2wgPSBzLmxvYWRCaXQoKTsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA4OiBbQ2Vs" +
-    "bCBvdmVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gbG9hZCBhIGBCb29sYCB3aGVuIHRoZSBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdC4KLy8v" +
-    "ICogOTogW0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRhaW5zLgov" +
-    "Ly8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkYml0Ci8vLwovLy8gW0NlbGwgb3ZlcmZsb3dd" +
-    "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW0NlbGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcv" +
-    "Ym9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZEJpdChzZWxmOiBTbGljZSk6IEJvb2wgeyAxIExESSB9CgovLy8g" +
-    "RXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIExvYWRzIGFuZCByZXR1cm5zIGEgc2VyaWFsaXplZCB1bnNpZ25l" +
-    "ZCBgSW50YCB2YWx1ZSBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDJeMTIwIC0gMSBpbmNsdXNpdmUgZnJvbSB0aGUgYFNsaWNlYC4gVGhpcyB2YWx1ZSB1c3VhbGx5IHJl" +
-    "cHJlc2VudHMgdGhlIGFtb3VudCBpbiBuYW5vVG9uY29pbnMuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0g" +
-    "YmVnaW5DZWxsKCkuc3RvcmVDb2lucyg0MikuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRDb2lucygpOyAvLyA0MgovLy8gfQovLy8gYGBg" +
-    "Ci8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gbG9hZCBhbiBgSW50" +
-    "YCB3aGVuIGBTbGljZWAgZG9lc24ndCBjb250YWluIGl0LgovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQg" +
-    "bW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3Ns" +
-    "aWNlbG9hZGNvaW5zCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW0NlbGwgdW5k" +
-    "ZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZENv" +
-    "aW5zKHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJVSU5UMTYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZh" +
-    "aWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYSBzZXJpYWxpemVkIHVuc2lnbmVkIGBJbnRgIHZhbHVlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8g" +
-    "Ml4xMjAgLSAxIGluY2x1c2l2ZSBmcm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgU2xpY2UubG9hZENvaW5z" +
-    "KClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZUNv" +
-    "aW5zKDIzOSkKLy8vICAgICAgICAgLnN0b3JlVWludCg0MiwgNykKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgcy5za2lwQ29pbnMoKTsKLy8vICAg" +
-    "ICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogODogW0NlbGwg" +
-    "b3ZlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHNraXAgYW4gYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdC4KLy8vICogOTog" +
-    "W0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBza2lwIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2Vl" +
-    "OgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXNraXBjb2lucwovLy8KLy8vIFtDZWxsIG92ZXJmbG93XTogaHR0cHM6" +
-    "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhp" +
-    "dC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwQ29pbnMoc2VsZjogU2xpY2UpIHsgTERWQVJVSU5UMTYgTklQIH0KCi8vLyBFeHRlbnNpb24g" +
-    "bXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIEFsaWFzIHRvIGBTbGljZS5sb2Fk" +
-    "Q29pbnMoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVWYXJVaW50MTYo" +
-    "NDIpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVmFyVWludDE2KCk7IC8vIDQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQg" +
-    "Y29kZXMKLy8vCi8vLyAqIDg6IFtDZWxsIG92ZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIGFuIGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vz" +
-    "bid0IGNvbnRhaW4gaXQuCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xp" +
-    "Y2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFydWludDE2Ci8v" +
-    "LyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGNvaW5zCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2Rv" +
-    "Y3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW0NlbGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNv" +
-    "ZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZFZhclVpbnQxNihzZWxmOiBTbGljZSk6IEludCB7IExEVkFSVUlOVDE2IH0KCi8vLyBF" +
-    "eHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4yLgovLy8KLy8vIEFsaWFzIHRvIGBT" +
-    "bGljZS5za2lwQ29pbnMoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAg" +
-    "ICAgICAgLnN0b3JlVmFyVWludDE2KDIzOSkKLy8vICAgICAgICAgLnN0b3JlVWludCg0MiwgNykKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgcy5z" +
-    "a2lwVmFyVWludDE2KCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFVpbnQoNyk7IC8vIDQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29k" +
-    "ZXMKLy8vCi8vLyAqIDg6IFtDZWxsIG92ZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBza2lwIGFuIGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0" +
-    "IGNvbnRhaW4gaXQuCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc2tpcCBtb3JlIGRhdGEgdGhhbiBgU2xpY2Vg" +
-    "IGNvbnRhaW5zLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwdmFydWludDE2Ci8vLyAq" +
-    "IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcGNvaW5zCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3Mu" +
-    "dGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW0NlbGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVz" +
-    "IzkKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBWYXJVaW50MTYoc2VsZjogU2xpY2UpIHsgTERWQVJVSU5UMTYgTklQIH0KCi8vLyBFeHRlbnNpb24gbXV0" +
-    "YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFNpbWlsYXIgdG8gYFNsaWNlLmxvYWRD" +
-    "b2lucygpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4xMTkgdG8gMl4xMTkgLSAxIGluY2x1c2l2ZS4KLy8vCi8vLyBgYGB0YWN0" +
-    "Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVZhckludDE2KC00MikuYXNTbGljZSgpOwovLy8gICAgIGxl" +
-    "dCBmaXp6OiBJbnQgPSBzLmxvYWRWYXJJbnQxNigpOyAvLyAtNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogODogW0NlbGwg" +
-    "b3ZlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgYW4gYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdC4KLy8vICogOTog" +
-    "W0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2Vl" +
-    "OgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWR2YXJpbnQxNgovLy8KLy8vIFtDZWxsIG92ZXJmbG93XTogaHR0" +
-    "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" +
-    "ZXhpdC1jb2RlcyM5Ci8vLwphc20oLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRWYXJJbnQxNihzZWxmOiBTbGljZSk6IEludCB7IExEVkFSSU5UMTYgfQoK" +
-    "Ly8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2ltaWxh" +
-    "ciB0byBgU2xpY2Uuc2tpcENvaW5zKClgLCBidXQgd2l0aCBhIGRpZmZlcmVudCBgdmFsdWVgIHJhbmdlOiBmcm9tIC0yXjExOSB0byAyXjExOSAtIDEgaW5jbHVzaXZl" +
-    "LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhcklu" +
-    "dDE2KC0yMzkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhckludDE2KCk7Ci8v" +
-    "LyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFVpbnQoNyk7IC8vIDQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDg6IFtD" +
-    "ZWxsIG92ZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBza2lwIGFuIGBJbnRgIHdoZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQuCi8vLyAq" +
-    "IDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc2tpcCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8v" +
-    "IFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwdmFyaW50MTYKLy8vCi8vLyBbQ2VsbCBvdmVyZmxvd106" +
-    "IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbQ2VsbCB1bmRlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9i" +
-    "b29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcFZhckludDE2KHNlbGY6IFNsaWNlKSB7IExEVkFSSU5UMTYgTklQIH0KCi8vLyBF" +
-    "eHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIExvYWRzIGFuZCBy" +
-    "ZXR1cm5zIGEgc2VyaWFsaXplZCB1bnNpZ25lZCBgSW50YCB2YWx1ZSBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDJeMjQ4IOKIkiAxIGluY2x1c2l2ZSBmcm9tIHRoZSBg" +
-    "U2xpY2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlVmFyVWludDMyKDQy" +
-    "MDAwMCkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRWYXJVaW50MzIoKTsgLy8gNDIwMDAwCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMj" +
-    "IEV4aXQgY29kZXMKLy8vCi8vLyAqIDg6IFtDZWxsIG92ZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIGFuIGBJbnRgIHdoZW4gYFNsaWNl" +
-    "YCBkb2Vzbid0IGNvbnRhaW4gaXQuCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gbG9hZCBtb3JlIGRhdGEgdGhh" +
-    "biBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFydWlu" +
-    "dDMyCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW0NlbGwgdW5kZXJmbG93XTog" +
-    "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZFZhclVpbnQzMihz" +
-    "ZWxmOiBTbGljZSk6IEludCB7IExEVkFSVUlOVDMyIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJs" +
-    "ZSBzaW5jZSBUYWN0IDEuNi4yLgovLy8KLy8vIFNraXBzIGEgc2VyaWFsaXplZCB1bnNpZ25lZCBgSW50YCB2YWx1ZSBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDJeMjQ4" +
-    "IOKIkiAxIGluY2x1c2l2ZSBmcm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgU2xpY2UubG9hZFZhclVpbnQz" +
-    "MigpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVW" +
-    "YXJVaW50MzIoMjM5KQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBzLnNraXBWYXJVaW50MzIo" +
-    "KTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICog" +
-    "ODogW0NlbGwgb3ZlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHNraXAgYW4gYEludGAgd2hlbiBgU2xpY2VgIGRvZXNuJ3QgY29udGFpbiBpdC4K" +
-    "Ly8vICogOTogW0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBza2lwIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8v" +
-    "LwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXNraXB2YXJ1aW50MzIKLy8vCi8vLyBbQ2VsbCBvdmVy" +
-    "Zmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLyBbQ2VsbCB1bmRlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5n" +
-    "Lm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcFZhclVpbnQzMihzZWxmOiBTbGljZSkgeyBMRFZBUlVJTlQzMiBOSVAg" +
-    "fQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gU2lt" +
-    "aWxhciB0byBgU2xpY2UubG9hZFZhclVpbnQzMigpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4yNDcgdG8gMl4yNDcgLSAxIGlu" +
-    "Y2x1c2l2ZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVZhckludDMyKC00" +
-    "MjAwMDApLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVmFySW50MzIoKTsgLy8gLTQyMDAwMAovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMj" +
-    "IyBFeGl0IGNvZGVzCi8vLwovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gbG9hZCBhbiBgSW50YCB3aGVuIGBTbGlj" +
-    "ZWAgZG9lc24ndCBjb250YWluIGl0LgovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgbW9yZSBkYXRhIHRo" +
-    "YW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZHZhcmlu" +
-    "dDMyCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW0NlbGwgdW5kZXJmbG93XTog" +
-    "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZFZhckludDMyKHNl" +
-    "bGY6IFNsaWNlKTogSW50IHsgTERWQVJJTlQzMiB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUg" +
-    "c2luY2UgVGFjdCAxLjYuMi4KLy8vCi8vLyBTaW1pbGFyIHRvIGBTbGljZS5za2lwVmFyVWludDMyKClgLCBidXQgd2l0aCBhIGRpZmZlcmVudCBgdmFsdWVgIHJhbmdl" +
-    "OiBmcm9tIC0yXjI0NyB0byAyXjI0NyAtIDEgaW5jbHVzaXZlLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9" +
-    "IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhckludDMyKC0yMzkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcpCi8vLyAgICAgICAgIC5hc1NsaWNl" +
-    "KCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhckludDMyKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFVpbnQoNyk7IC8vIDQyCi8vLyB9Ci8vLyBgYGAKLy8v" +
-    "Ci8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDg6IFtDZWxsIG92ZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBza2lwIGFuIGBJbnRgIHdo" +
-    "ZW4gYFNsaWNlYCBkb2Vzbid0IGNvbnRhaW4gaXQuCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc2tpcCBtb3Jl" +
-    "IGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vz" +
-    "a2lwdmFydWludDMyCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8gW0NlbGwgdW5k" +
-    "ZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBWYXJJbnQzMihz" +
-    "ZWxmOiBTbGljZSkgeyBMRFZBUklOVDMyIE5JUCB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIExv" +
-    "YWRzIGFsbCBidXQgdGhlIGZpcnN0IDAg4omkIGBsYCDiiaQgMTAyMyBiaXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUo" +
-    "KSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBzLnNraXBCaXRzKDUpOyAgICAgICAg" +
-    "ICAgICAgICAgICAvLyBhbGwgYnV0IGZpcnN0IDUgYml0cwovLy8gICAgIGxldCBmaXp6OiBTbGljZSA9IHMubG9hZEJpdHMoMSk7IC8vIGxvYWQgb25seSAxIGJpdAov" +
-    "Ly8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdIOKAlCBUaHJvd24gd2hl" +
-    "biBhdHRlbXB0aW5nIHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBgbGAgdmFsdWUuCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0" +
-    "dGVtcHRpbmcgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiB0aGUgYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
-    "b3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcGJpdHMKLy8vCi8vLyBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRwczovL2RvY3MudGFjdC1sYW5n" +
-    "Lm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW0NlbGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFz" +
-    "bSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBCaXRzKHNlbGY6IFNsaWNlLCBsOiBJbnQpIHsgU0RTS0lQRklSU1QgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3Ig" +
-    "dGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNsaWNlYCBpcyBlbXB0eSAoaS5lLiwgY29udGFpbnMgbm8gYml0cyBvZiBkYXRhIGFu" +
-    "ZCBubyBjZWxsIHJlZmVyZW5jZXMpLgovLy8gSWYgaXQgaXMgbm90LCBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdpdGggW2V4aXQgY29kZSA5XTogYENlbGwgdW5kZXJm" +
-    "bG93YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgZW1wdHlPbmU6IFNsaWNlID0gZW1wdHlTbGljZSgpOwovLy8gICAgIGVt" +
-    "cHR5T25lLmVuZFBhcnNlKCk7IC8vIG5vdGhpbmcsIGFzIGl0J3MgZW1wdHkKLy8vCi8vLyAgICAgbGV0IHBhdWw6IFNsaWNlID0gIkZlYXIgaXMgdGhlIG1pbmQta2ls" +
-    "bGVyIi5hc1NsaWNlKCk7Ci8vLyAgICAgdHJ5IHsKLy8vICAgICAgICAgcGF1bC5lbmRQYXJzZSgpOyAvLyB0aHJvd3MgZXhpdCBjb2RlIDkKLy8vICAgICB9Ci8vLyB9" +
-    "Ci8vLyBgYGAKLy8vCi8vLyBbZXhpdCBjb2RlIDldOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgZnVu" +
-    "IGVuZFBhcnNlKHNlbGY6IFNsaWNlKSB7IEVORFMgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRh" +
-    "Y3QgMS42LjAuCi8vLwovLy8gUHJlbG9hZHMgYWxsIGJ1dCB0aGUgbGFzdCAwIOKJpCBgbGVuYCDiiaQgMTAyMyBiaXRzIGZyb20gdGhlIGBTbGljZWAuCi8vLwovLy8g" +
-    "YGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAg" +
-    "ICBsZXQgYWxsQnV0TGFzdEZpdmU6IFNsaWNlID0gcy5za2lwTGFzdEJpdHMoNSk7IC8vIGFsbCBidXQgbGFzdCA1IGJpdHMsCi8vLyAgICAgICAgICAgICAgICAgICAg" +
-    "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIG9ubHkgZmlyc3QgMgovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwov" +
-    "Ly8gKiA1OiBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBg" +
-    "bGVuYCB2YWx1ZS4KLy8vICogOTogW0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGlj" +
-    "ZWAgY29udGFpbnMuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXNraXBsYXN0Yml0cwovLy8KLy8vIFtJ" +
-    "bnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbQ2VsbCB1bmRlcmZsb3dd" +
-    "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgZnVuIHNraXBMYXN0Qml0cyhzZWxmOiBTbGljZSwgbGVu" +
-    "OiBJbnQpOiBTbGljZSB7IFNEU0tJUExBU1QgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3Qg" +
-    "MS42LjAuCi8vLwovLy8gUHJlbG9hZHMgdGhlIGZpcnN0IDAg4omkIGBsZW5gIOKJpCAxMDIzIGJpdHMgZnJvbSB0aGUgYFNsaWNlYC4KLy8vCi8vLyBgYGB0YWN0Ci8v" +
-    "LyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXJz" +
-    "dEZpdmU6IFNsaWNlID0gcy5maXJzdEJpdHMoNSk7IC8vIGZpcnN0IDUgYml0cwovLy8gfQovLy8gYGBgCi8vLwovLy8gSW4gb3JkZXIgdG8gcmVkdWNlIGdhcyB1c2Fn" +
-    "ZSwgcHJlZmVyIGNhbGxpbmcgYFNsaWNlLnByZWxvYWRCaXRzKClgIG92ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbiBzaW5jZSB0aGUgZm9ybWVyIGlzIG1vcmUgb3B0aW1p" +
-    "emVkLgovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogNTogW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1w" +
-    "dGluZyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxlbmAgdmFsdWUuCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRp" +
-    "bmcgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" +
-    "L2NvcmUtY2VsbHMjc2xpY2VmaXJzdGJpdHMKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VwcmVsb2FkYml0cwovLy8K" +
-    "Ly8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbQ2VsbCB1bmRl" +
-    "cmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgZnVuIGZpcnN0Qml0cyhzZWxmOiBTbGljZSwg" +
-    "bGVuOiBJbnQpOiBTbGljZSB7IFNEQ1VURklSU1QgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRh" +
-    "Y3QgMS42LjAuCi8vLwovLy8gUHJlbG9hZHMgdGhlIGxhc3QgMCDiiaQgYGxlbmAg4omkIDEwMjMgYml0cyBmcm9tIHRoZSBgU2xpY2VgLgovLy8KLy8vIGBgYHRhY3QK" +
-    "Ly8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGxh" +
-    "c3RGaXZlOiBTbGljZSA9IHMubGFzdEJpdHMoNSk7IC8vIGxhc3QgNSBiaXRzCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6" +
-    "IFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV0g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsZW5gIHZh" +
-    "bHVlLgovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHByZWxvYWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250" +
-    "YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbGFzdGJpdHMKLy8vCi8vLyBbSW50ZWdl" +
-    "ciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW0NlbGwgdW5kZXJmbG93XTogaHR0" +
-    "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRzIGZ1biBsYXN0Qml0cyhzZWxmOiBTbGljZSwgbGVuOiBJbnQpOiBT" +
-    "bGljZSB7IFNEQ1VUTEFTVCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8v" +
-    "Ci8vLyBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgYEludGAgZGVwdGggb2YgdGhlIGBTbGljZWAuIFByb2R1Y2VzIDAgaWYgdGhlIGBTbGljZWAgaGFzIG5vIHJlZmVy" +
-    "ZW5jZXMsIG90aGVyd2lzZSAxIHBsdXMgdGhlIG1heGltdW0gb2YgdGhlIGRlcHRocyBvZiB0aGUgcmVmZXJlbmNlZCBjZWxscy4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBm" +
-    "dW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBkZXB0aDog" +
-    "SW50ID0gcy5kZXB0aCgpOyAvLyAwCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNl" +
-    "ZGVwdGgKLy8vCmFzbSBleHRlbmRzIGZ1biBkZXB0aChzZWxmOiBTbGljZSk6IEludCB7IFNERVBUSCB9CgovLwovLyBTbGljZSBzaXplCi8vCgovLy8gRXh0ZW5zaW9u" +
-    "IGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzIGluIHRoZSBgU2xpY2VgIGFzIGFuIGBJ" +
-    "bnRgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgp" +
-    "KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMucmVmcygpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5n" +
-    "Lm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXJlZnMKLy8vCmFzbSBleHRlbmRzIGZ1biByZWZzKHNlbGY6IFNsaWNlKTogSW50IHsgU1JFRlMgfQoKLy8vIEV4dGVuc2lv" +
-    "biBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIGluIHRoZSBgU2xpY2VgIGFzIGFuIGBJ" +
-    "bnRgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgp" +
-    "KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMuYml0cygpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5n" +
-    "Lm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWJpdHMKLy8vCmFzbSBleHRlbmRzIGZ1biBiaXRzKHNlbGY6IFNsaWNlKTogSW50IHsgU0JJVFMgfQoKLy8vIEV4dGVuc2lv" +
-    "biBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNsaWNlYCBpcyBlbXB0eSAoaS5lLiwgY29udGFpbnMgbm8g" +
-    "Yml0cyBvZiBkYXRhIGFuZCBubyBjZWxsIHJlZmVyZW5jZXMpLgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgZW1wdHksIGBmYWxzZWAgb3RoZXJ3aXNlLgovLy8K" +
-    "Ly8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNl" +
-    "KCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmVtcHR5KCk7ICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UKLy8vICAgICBsZXQgYnV6ejogQm9vbCA9IGJl" +
-    "Z2luQ2VsbCgpLmFzU2xpY2UoKS5lbXB0eSgpOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9j" +
-    "b3JlLWNlbGxzI3NsaWNlZW1wdHkKLy8vCmFzbSBleHRlbmRzIGZ1biBlbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTRU1QVFkgfQoKLy8vIEV4dGVuc2lvbiBmdW5j" +
-    "dGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNsaWNlYCBoYXMgbm8gYml0cyBvZiBkYXRhLgovLy8gUmV0dXJucyBg" +
-    "dHJ1ZWAgaWYgaXQgaGFzIG5vIGRhdGEsIGBmYWxzZWAgb3RoZXJ3aXNlLgovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNl" +
-    "ID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogQm9vbCA9IHMuZGF0YUVtcHR5KCk7ICAvLyB0cnVl" +
-    "Ci8vLwovLy8gICAgIGxldCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBidXp6OiBCb29sID0gczIu" +
-    "ZGF0YUVtcHR5KCk7IC8vIGZhbHNlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNl" +
-    "ZGF0YWVtcHR5Ci8vLwphc20gZXh0ZW5kcyBmdW4gZGF0YUVtcHR5KHNlbGY6IFNsaWNlKTogQm9vbCB7IFNERU1QVFkgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBm" +
-    "b3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNsaWNlYCBoYXMgbm8gcmVmZXJlbmNlcy4KLy8vIFJldHVybnMgYHRydWVgIGlm" +
-    "IGl0IGhhcyBubyByZWZlcmVuY2VzLCBgZmFsc2VgIG90aGVyd2lzZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xp" +
-    "Y2UgPSBiZWdpbkNlbGwoKS5zdG9yZVJlZihlbXB0eUNlbGwoKSkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBCb29sID0gcy5yZWZzRW1wdHkoKTsgICAgICAg" +
-    "ICAgICAgICAgICAgICAvLyBmYWxzZQovLy8gICAgIGxldCBidXp6OiBCb29sID0gYmVnaW5DZWxsKCkuYXNTbGljZSgpLnJlZnNFbXB0eSgpOyAvLyB0cnVlCi8vLyB9" +
-    "Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcmVmc2VtcHR5Ci8vLwphc20gZXh0ZW5kcyBm" +
-    "dW4gcmVmc0VtcHR5KHNlbGY6IFNsaWNlKTogQm9vbCB7IFNSRU1QVFkgfQoKLy8KLy8gQ29udmVyc2lvbnMKLy8KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRo" +
-    "ZSBgQnVpbGRlcmAgdHlwZS4KLy8vCi8vLyBDb252ZXJ0cyB0aGUgYEJ1aWxkZXJgIGludG8gYSBgU2xpY2VgIGFuZCByZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMgdG8g" +
-    "YHNlbGYuZW5kQ2VsbCgpLmJlZ2luUGFyc2UoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdp" +
-    "bkNlbGwoKTsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBiLmFzU2xpY2UoKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFu" +
-    "Zy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcmFzc2xpY2UKLy8vCmlubGluZSBleHRlbmRzIGZ1biBhc1NsaWNlKHNlbGY6IEJ1aWxkZXIpOiBTbGljZSB7CiAgICBy" +
-    "ZXR1cm4gc2VsZi5lbmRDZWxsKCkuYmVnaW5QYXJzZSgpOwp9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYENlbGxgIHR5cGUuCi8vLwovLy8gQ29udmVy" +
-    "dHMgdGhlIGBDZWxsYCB0byBhIGBTbGljZWAgYW5kIHJldHVybnMgaXQuCi8vLyBBbiBhbGlhcyB0byBgc2VsZi5iZWdpblBhcnNlKClgLgovLy8KLy8vIGBgYHRhY3QK" +
-    "Ly8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBjOiBDZWxsID0gZW1wdHlDZWxsKCk7Ci8vLyAgICAgbGV0IGZpeno6IFNsaWNlID0gYy5hc1NsaWNlKCk7Ci8v" +
-    "LyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxhc3NsaWNlCi8vLwppbmxpbmUgZXh0ZW5k" +
-    "cyBmdW4gYXNTbGljZShzZWxmOiBDZWxsKTogU2xpY2UgewogICAgcmV0dXJuIHNlbGYuYmVnaW5QYXJzZSgpOwp9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0" +
-    "aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENvbnZlcnRzIHRoZSBgU2xpY2VgIHRvIGEgYENlbGxgIGFuZCByZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMgdG8gYGJlZ2lu" +
-    "Q2VsbCgpLnN0b3JlU2xpY2Uoc2VsZikuZW5kQ2VsbCgpYC4KLy8vCi8vLyBOT1RFOiAqKkdhcyBleHBlbnNpdmUhKiogVGhpcyBmdW5jdGlvbiB1c2VzIDUwMCBnYXMg" +
-    "dW5pdHMgb3IgbW9yZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5hc1NsaWNlKCk7" +
-    "Ci8vLyAgICAgbGV0IGZpeno6IENlbGwgPSBzLmFzQ2VsbCgpOwovLy8gICAgIGxldCBidXp6OiBDZWxsID0gYmVnaW5DZWxsKCkuc3RvcmVTbGljZShzKS5lbmRDZWxs" +
-    "KCk7Ci8vLwovLy8gICAgIGZpenogPT0gYnV6ejsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYv" +
-    "Y29yZS1jZWxscyNzbGljZWFzY2VsbAovLy8KaW5saW5lIGV4dGVuZHMgZnVuIGFzQ2VsbChzZWxmOiBTbGljZSk6IENlbGwgewogICAgcmV0dXJuIGJlZ2luQ2VsbCgp" +
-    "CiAgICAgICAgLnN0b3JlU2xpY2Uoc2VsZikKICAgICAgICAuZW5kQ2VsbCgpOwp9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUu" +
-    "Ci8vLwovLy8gQ29udmVydHMgdGhlIGBCdWlsZGVyYCBpbnRvIGEgYENlbGxgIGFuZCByZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMgdG8gYHNlbGYuZW5kQ2VsbCgpYC4K" +
-    "Ly8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBDZWxs" +
-    "ID0gYi5hc0NlbGwoKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcmFzY2Vs" +
-    "bAovLy8KaW5saW5lIGV4dGVuZHMgZnVuIGFzQ2VsbChzZWxmOiBCdWlsZGVyKTogQ2VsbCB7CiAgICByZXR1cm4gc2VsZi5lbmRDZWxsKCk7Cn0KCi8vLyBDcmVhdGVz" +
-    "IGFuZCByZXR1cm5zIGFuIGVtcHR5IGBDZWxsYCAod2l0aG91dCBkYXRhIGFuZCByZWZlcmVuY2VzKS4KLy8vIEFuIGFsaWFzIHRvIGBiZWdpbkNlbGwoKS5lbmRDZWxs" +
-    "KClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gZW1wdHlDZWxsKCk7Ci8vLyAgICAgbGV0IGJ1eno6" +
-    "IENlbGwgPSBiZWdpbkNlbGwoKS5lbmRDZWxsKCk7Ci8vLwovLy8gICAgIGZpenogPT0gYnV6ejsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRw" +
-    "czovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNlbXB0eWNlbGwKLy8vCmFzbSBmdW4gZW1wdHlDZWxsKCk6IENlbGwgewogICAgPGIgYj4gUFVTSFJF" +
-    "RiAvLyBQdXJlIEZpZnQ6ICI8YiIgY3JlYXRlcyBhIGJ1aWxkZXIsICJiPiIgdHVybnMgaXQgaW50byBhIGNlbGwgYXQgY29tcGlsZSB0aW1lCn0KCi8vLyBDcmVhdGVz" +
-    "IGFuZCByZXR1cm5zIGFuIGVtcHR5IGBTbGljZWAgKHdpdGhvdXQgZGF0YSBhbmQgcmVmZXJlbmNlcykuCi8vLyBBbiBhbGlhcyB0byBgZW1wdHlDZWxsKCkuYXNTbGlj" +
-    "ZSgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBlbXB0eVNsaWNlKCk7Ci8vLyAgICAgbGV0IGJ1" +
-    "eno6IFNsaWNlID0gZW1wdHlDZWxsKCkuYXNTbGljZSgpOwovLy8KLy8vICAgICBmaXp6ID09IGJ1eno7IC8vIHRydWUKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTog" +
-    "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjZW1wdHlzbGljZQovLy8KYXNtIGZ1biBlbXB0eVNsaWNlKCk6IFNsaWNlIHsKICAgIGJ7fSBQ" +
-    "VVNIU0xJQ0UKfQoKLy8vIFN0cnVjdCBmb3IgaG9sZGluZyB2YWx1ZXMgY29tcHV0ZWQgYnkgdGhlIGBDZWxsLmNvbXB1dGVEYXRhU2l6ZSgpYCBhbmQgYFNsaWNlLmNv" +
-    "bXB1dGVEYXRhU2l6ZSgpYCBleHRlbnNpb24gZnVuY3Rpb25zLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9j" +
-    "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxjb21wdXRlZGF0YXNpemUKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2Vs" +
-    "bHMjc2xpY2Vjb21wdXRlZGF0YXNpemUKLy8vCnN0cnVjdCBEYXRhU2l6ZSB7CiAgICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiBuZXN0ZWQgY2VsbHMsIGluY2x1ZGlu" +
-    "ZyB0aGUgc3RhcnRpbmcgb25lLgogICAgY2VsbHM6IEludDsKCiAgICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiBiaXRzIGluIGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1" +
-    "ZGluZyB0aGUgc3RhcnRpbmcgb25lLgogICAgYml0czogSW50OwoKICAgIC8vLyBUaGUgdG90YWwgbnVtYmVyIG9mIHJlZnMgaW4gYWxsIG5lc3RlZCBjZWxscywgaW5j" +
-    "bHVkaW5nIHRoZSBzdGFydGluZyBvbmUuCiAgICByZWZzOiBJbnQ7Cn0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQ2VsbGAgdHlwZS4gQXZhaWxhYmxl" +
-    "IHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBkaXN0aW5jdCBjZWxscywgYml0cyBhbmQgcmVmcyBpbiB0" +
-    "aGUgYENlbGxgIGJ5IHVzaW5nIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIChERlMpIGFsZ29yaXRobSwgcmVjdXJzaXZlbHkgdHJhdmVyc2luZyBlYWNoIHJlZmVyZW5jZWQg" +
-    "Y2VsbC4gVGhpcyBmdW5jdGlvbiBpcyBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlIGFuZCBjYW4gY29uc3VtZSBhIGxvdCBvZiBnYXMuIElmIGBzZWxmYCBpcyBgbnVs" +
-    "bGAsIHJldHVybnMgYERhdGFTaXplYCB3aXRoIGFsbCBmaWVsZHMgc2V0IHRvIDAuCi8vLwovLy8gVGhlIHJlc3VsdHMgYXJlIHBhY2tlZCBpbnRvIGEgYERhdGFTaXpl" +
-    "YCBTdHJ1Y3QgY29uc2lzdGluZyBvZjoKLy8vICogYGNlbGxzOiBJbnRgLCB0aGUgdG90YWwgbnVtYmVyIG9mIG5lc3RlZCBjZWxscywgaW5jbHVkaW5nIHRoZSBzdGFy" +
-    "dGluZyBvbmUKLy8vICogYGJpdHM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0cyBpbiBhbGwgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5n" +
-    "IG9uZQovLy8gKiBgcmVmczogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiByZWZzIGluIGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25l" +
-    "Ci8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGM6IENlbGwgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuc3RvcmVSZWYo" +
-    "ZW1wdHlDZWxsKCkpLmVuZENlbGwoKTsKLy8vICAgICB0cnkgewovLy8gICAgICAgICBsZXQgZGF0YVNpemU6IERhdGFTaXplID0gYy5jb21wdXRlRGF0YVNpemUoMik7" +
-    "Ci8vLyAgICAgICAgIGRhdGFTaXplLmNlbGxzOyAvLyAyCi8vLyAgICAgICAgIGRhdGFTaXplLmJpdHM7ICAvLyA3Ci8vLyAgICAgICAgIGRhdGFTaXplLnJlZnM7ICAv" +
-    "LyAxCi8vLyAgICAgfSBjYXRjaCAoZXhpdENvZGUpIHsKLy8vICAgICAgICAgLy8gaWYgbWF4Q2VsbHMgd2FzIGluc3VmZmljaWVudCB0byB0cmF2ZXJzZSB0aGUgY2Vs" +
-    "bAovLy8gICAgICAgICAvLyBhbmQgYWxsIG9mIGl0cyByZWZlcmVuY2VzLCB0aGUgZXhpdENvZGUgaGVyZSB3b3VsZCBiZSA4Ci8vLyAgICAgfQovLy8gfQovLy8gYGBg" +
+    "b3ZpZGUgYW4gaW5zdWZmaWNpZW50IG9yIG91dC1vZi1ib3VuZHMgYGJpdHNgIG51bWJlci4KLy8vICogODogW0NlbGwgb3ZlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBh" +
+    "dHRlbXB0aW5nIHRvIHN0b3JlIG1vcmUgZGF0YSB0aGFuIHRoZSBCdWlsZGVyIGNhbiBmaXQuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9y" +
+    "ZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmVpbnQKLy8vCi8vLyBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9y" +
+    "Zy9ib29rL2V4aXQtY29kZXMjNQovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8KQG5hbWUo" +
+    "c3RvcmVfaW50KSAvLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVyLCBzbyBub3QgcmVwbGFjZWQgd2l0aCBhc20gIlNUSVgiCmV4dGVuZHMgbmF0aXZl" +
+    "IHN0b3JlSW50KHNlbGY6IEJ1aWxkZXIsIHZhbHVlOiBJbnQsIGJpdHM6IEludCk6IEJ1aWxkZXI7CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxk" +
+    "ZXJgIHR5cGUuCi8vLwovLy8gU3RvcmVzIGFuIHVuc2lnbmVkIGBiaXRzYC1iaXQgYHZhbHVlYCBpbnRvIHRoZSBjb3B5IG9mIHRoZSBgQnVpbGRlcmAgZm9yIDAg4omk" +
+    "IGBiaXRzYCDiiaQgMjU2LgovLy8gUmV0dXJucyB0aGF0IGNvcHkgb2YgdGhlIGBCdWlsZGVyYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8v" +
+    "ICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBCdWlsZGVyID0gYi5zdG9yZVVpbnQoNDIsIDYpOwovLy8gfQovLy8gYGBg" +
     "Ci8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5n" +
-    "IHRvIHNwZWNpZnkgYSBuZWdhdGl2ZSB2YWx1ZSBvZiBgbWF4Q2VsbHNgLgovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCUIFRocm93biB3aGVuIHRoZSBzcGVjaWZp" +
-    "ZWQgYG1heENlbGxzYCB2YWx1ZSBpc24ndCBlbm91Z2ggdG8gdHJhdmVyc2UgYWxsIGNlbGxzIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lLgovLy8KLy8vIFNlZTog" +
-    "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjY2VsbGNvbXB1dGVkYXRhc2l6ZQovLy8KLy8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCBy" +
-    "YW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbQ2VsbCBvdmVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
-    "b3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLwphc20gZXh0ZW5kcyBmdW4gY29tcHV0ZURhdGFTaXplKHNlbGY6IENlbGw/LCBtYXhDZWxsczogSW50KTogRGF0YVNpemUg" +
-    "eyBDREFUQVNJWkUgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8g" +
-    "U2ltaWxhciB0byBgQ2VsbC5jb21wdXRlRGF0YVNpemUoKWAsIGJ1dCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRoZSBjZWxsIHRoYXQgY29udGFpbnMgdGhlIGBT" +
-    "bGljZWAgaXRzZWxmLiBIb3dldmVyLCBhY2NvdW50cyBmb3IgaXRzIGJpdHMgYW5kIHJlZnMuCi8vLwovLy8gVGhlIHJlc3VsdHMgYXJlIHBhY2tlZCBpbnRvIGEgYERh" +
-    "dGFTaXplYCBTdHJ1Y3QgY29uc2lzdGluZyBvZjoKLy8vICogYGNlbGxzOiBJbnRgLCB0aGUgdG90YWwgbnVtYmVyIG9mIG5lc3RlZCBjZWxscywgaW5jbHVkaW5nIHRo" +
-    "ZSBzdGFydGluZyBvbmUKLy8vICogYGJpdHM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0cyBpbiBhbGwgbmVzdGVkIGNlbGxzLCBpbmNsdWRpbmcgdGhlIHN0" +
-    "YXJ0aW5nIG9uZQovLy8gKiBgcmVmczogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiByZWZzIGluIGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRp" +
-    "bmcgb25lCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLnN0" +
-    "b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgdHJ5IHsKLy8vICAgICAgICAgbGV0IGRhdGFTaXplOiBEYXRhU2l6ZSA9IHMuY29tcHV0ZURhdGFT" +
-    "aXplKDEpOwovLy8gICAgICAgICBkYXRhU2l6ZS5jZWxsczsgLy8gMQovLy8gICAgICAgICBkYXRhU2l6ZS5iaXRzOyAgLy8gNwovLy8gICAgICAgICBkYXRhU2l6ZS5y" +
-    "ZWZzOyAgLy8gMQovLy8gICAgIH0gY2F0Y2ggKGV4aXRDb2RlKSB7Ci8vLyAgICAgICAgIC8vIGlmIG1heENlbGxzIHdhcyBpbnN1ZmZpY2llbnQgdG8gdHJhdmVyc2Ug" +
-    "dGhlIGNlbGwKLy8vICAgICAgICAgLy8gYW5kIGFsbCBvZiBpdHMgcmVmZXJlbmNlcywgdGhlIGV4aXRDb2RlIGhlcmUgd291bGQgYmUgOAovLy8gICAgIH0KLy8vIH0K" +
-    "Ly8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogNTogW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXSDigJQgVGhyb3duIHdoZW4gYXR0" +
-    "ZW1wdGluZyB0byBzcGVjaWZ5IGEgbmVnYXRpdmUgdmFsdWUgb2YgYG1heENlbGxzYC4KLy8vICogODogW0NlbGwgb3ZlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiB0aGUg" +
-    "c3BlY2lmaWVkIGBtYXhDZWxsc2AgdmFsdWUgaXNuJ3QgZW5vdWdoIHRvIHRyYXZlcnNlIGFsbCBjZWxscyAqKm5vdCoqIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25l" +
-    "LgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vjb21wdXRlZGF0YXNpemUKLy8vCi8vLyBbSW50ZWdlciBv" +
-    "dXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczov" +
-    "L2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8KYXNtIGV4dGVuZHMgZnVuIGNvbXB1dGVEYXRhU2l6ZShzZWxmOiBTbGljZSwgbWF4Q2VsbHM6" +
-    "IEludCk6IERhdGFTaXplIHsgU0RBVEFTSVpFIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQ2VsbGAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3Qg" +
-    "MS42LjAuCi8vLwovLy8gQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGBJbnRgIGRlcHRoIG9mIHRoZSBgQ2VsbGAuIFByb2R1Y2VzIDAgaWYgdGhlIGBDZWxsYCBoYXMg" +
-    "bm8gcmVmZXJlbmNlcywgb3RoZXJ3aXNlIDEgcGx1cyB0aGUgbWF4aW11bSBvZiB0aGUgZGVwdGhzIG9mIHRoZSByZWZlcmVuY2VkIGNlbGxzLiBJZiBjIGlzIG51bGws" +
-    "IHJldHVybnMgemVyby4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYzogQ2VsbCA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQy" +
-    "LCA3KS5lbmRDZWxsKCk7Ci8vLyAgICAgbGV0IGRlcHRoOiBJbnQgPSBjLmRlcHRoKCk7IC8vIDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2Nz" +
-    "LnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjY2VsbGRlcHRoCi8vLwphc20gZXh0ZW5kcyBmdW4gZGVwdGgoc2VsZjogQ2VsbD8pOiBJbnQgeyBDREVQVEggfQo=";
+    "IHRvIHN0b3JlIGEgbmVnYXRpdmUgYHZhbHVlYCBvciBwcm92aWRlIGFuIGluc3VmZmljaWVudCBvciBvdXQtb2YtYm91bmRzIGBiaXRzYCBudW1iZXIuCi8vLyAqIDg6" +
+    "IFtDZWxsIG92ZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzdG9yZSBtb3JlIGRhdGEgdGhhbiB0aGUgQnVpbGRlciBjYW4gZml0LgovLy8KLy8v" +
+    "IFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcnN0b3JldWludAovLy8KLy8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3Rl" +
+    "ZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbQ2VsbCBvdmVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxh" +
+    "bmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLwpAbmFtZShzdG9yZV91aW50KSAvLyBzcGVjaWFsIHRyZWF0bWVudCBpbiBGdW5jIGNvbXBpbGVyLCBzbyBub3QgcmVw" +
+    "bGFjZWQgd2l0aCBhc20gIlNUVVgiCmV4dGVuZHMgbmF0aXZlIHN0b3JlVWludChzZWxmOiBCdWlsZGVyLCB2YWx1ZTogSW50LCBiaXRzOiBJbnQpOiBCdWlsZGVyOwoK" +
+    "Ly8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBCdWlsZGVyYCB0eXBlLgovLy8KLy8vIFN0b3JlcyBhIGBCb29sYCBgdmFsdWVgIGludG8gdGhlIGNvcHkgb2Yg" +
+    "dGhlIGBCdWlsZGVyYC4KLy8vIFdyaXRlcyAxIGFzIGEgc2luZ2xlIGJpdCBpZiBgdmFsdWVgIGlzIGB0cnVlYCwgYW5kIHdyaXRlcyAwIG90aGVyd2lzZS4KLy8vIFJl" +
+    "dHVybnMgdGhhdCBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBi" +
+    "ZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgZml6ejogQnVpbGRlciA9IGIuc3RvcmVCb29sKHRydWUpOyAgLy8gd3JpdGVzIDEKLy8vICAgICBsZXQgYnV6ejogQnVpbGRl" +
+    "ciA9IGIuc3RvcmVCb29sKGZhbHNlKTsgLy8gd3JpdGVzIDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogODogW0NlbGwgb3Zl" +
+    "cmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHN0b3JlIG1vcmUgZGF0YSB0aGFuIHRoZSBCdWlsZGVyIGNhbiBmaXQuCi8vLwovLy8gU2VlOiBodHRw" +
+    "czovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmVib29sCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFj" +
+    "dC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8KYXNtKHZhbHVlIHNlbGYpIGV4dGVuZHMgZnVuIHN0b3JlQm9vbChzZWxmOiBCdWlsZGVyLCB2YWx1ZTogQm9v" +
+    "bCk6IEJ1aWxkZXIgeyAxIFNUSSB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4w" +
+    "LgovLy8KLy8vIEFsaWFzIHRvIGBCdWlsZGVyLnN0b3JlQm9vbCgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjogQnVp" +
+    "bGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBCdWlsZGVyID0gYi5zdG9yZUJpdCh0cnVlKTsgIC8vIHdyaXRlcyAxCi8vLyAgICAgbGV0IGJ1eno6" +
+    "IEJ1aWxkZXIgPSBiLnN0b3JlQml0KGZhbHNlKTsgLy8gd3JpdGVzIDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogODogW0Nl" +
+    "bGwgb3ZlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHN0b3JlIG1vcmUgZGF0YSB0aGFuIHRoZSBCdWlsZGVyIGNhbiBmaXQuCi8vLwovLy8gU2Vl" +
+    "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmViaXQKLy8vCi8vLyBbQ2VsbCBvdmVyZmxvd106IGh0dHBzOi8vZG9j" +
+    "cy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLwphc20odmFsdWUgc2VsZikgZXh0ZW5kcyBmdW4gc3RvcmVCaXQoc2VsZjogQnVpbGRlciwgdmFsdWU6" +
+    "IEJvb2wpOiBCdWlsZGVyIHsgMSBTVEkgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBCdWlsZGVyYCB0eXBlLgovLy8KLy8vIFN0b3JlcyAoc2VyaWFs" +
+    "aXplcykgYW4gdW5zaWduZWQgYEludGAgYHZhbHVlYCBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDJeMTIwIOKIkiAxCi8vLyBpbmNsdXNpdmUgaW50byB0aGUgY29weSBv" +
+    "ZiB0aGUgYEJ1aWxkZXJgLiBUaGUgc2VyaWFsaXphdGlvbiBvZiBgdmFsdWVgIGNvbnNpc3RzCi8vLyBvZiBhIDQtYml0IHVuc2lnbmVkIGJpZy1lbmRpYW4gaW50ZWdl" +
+    "ciBgbGAsIHdoaWNoIGlzIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIGBsYCDiiaUgMCwKLy8vIHN1Y2ggdGhhdCBgdmFsdWVgIDwgMl4oOCAqIGBsYCksIGZvbGxvd2VkIGJ5" +
+    "IGFuIDggKiBgbGAtYml0IHVuc2lnbmVkIGJpZy1lbmRpYW4KLy8vIHJlcHJlc2VudGF0aW9uIG9mIGB2YWx1ZWAuIFJldHVybnMgdGhhdCBjb3B5IG9mIHRoZSBgQnVp" +
+    "bGRlcmAuCi8vLwovLy8gVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gd2F5IG9mIHN0b3JpbmcgbmFub1RvbmNvaW5zLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFt" +
+    "cGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJ1aWxkZXIgPSBiLnN0b3JlQ29pbnMoNDIpOwovLy8g" +
+    "fQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdIOKAlCBUaHJvd24gd2hlbiBh" +
+    "dHRlbXB0aW5nIHRvIHN0b3JlIGFuIG91dC1vZi1ib3VuZHMgYHZhbHVlYC4KLy8vICogODogW0NlbGwgb3ZlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5n" +
+    "IHRvIHN0b3JlIG1vcmUgZGF0YSB0aGFuIHRoZSBCdWlsZGVyIGNhbiBmaXQuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1j" +
+    "ZWxscyNidWlsZGVyc3RvcmVjb2lucwovLy8KLy8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" +
+    "ZXhpdC1jb2RlcyM1Ci8vLyBbQ2VsbCBvdmVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLwphc20gZXh0ZW5kcyBm" +
+    "dW4gc3RvcmVDb2lucyhzZWxmOiBCdWlsZGVyLCB2YWx1ZTogSW50KTogQnVpbGRlciB7IFNUVkFSVUlOVDE2IH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRo" +
+    "ZSBgQnVpbGRlcmAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQWxpYXMgdG8gYEJ1aWxkZXIuc3RvcmVDb2lucygpYC4KLy8vCi8vLyBg" +
+    "YGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBCdWlsZGVyID0gYi5z" +
+    "dG9yZVZhclVpbnQxNig0Mik7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6IFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCBy" +
+    "YW5nZV0g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc3RvcmUgYW4gb3V0LW9mLWJvdW5kcyBgdmFsdWVgLgovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCU" +
+    "IFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc3RvcmUgbW9yZSBkYXRhIHRoYW4gdGhlIEJ1aWxkZXIgY2FuIGZpdC4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8v" +
+    "ZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZXZhcnVpbnQxNgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29y" +
+    "ZS1jZWxscyNidWlsZGVyc3RvcmVjb2lucwovLy8KLy8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jv" +
+    "b2svZXhpdC1jb2RlcyM1Ci8vLyBbQ2VsbCBvdmVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLwphc20gZXh0ZW5k" +
+    "cyBmdW4gc3RvcmVWYXJVaW50MTYoc2VsZjogQnVpbGRlciwgdmFsdWU6IEludCk6IEJ1aWxkZXIgeyBTVFZBUlVJTlQxNiB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9u" +
+    "IGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFNpbWlsYXIgdG8gYEJ1aWxkZXIuc3RvcmVDb2lucygpYCwg" +
+    "YnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4xMTkgdG8gMl4xMTkgLSAxIGluY2x1c2l2ZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4g" +
+    "ZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBCdWlsZGVyID0gYi5zdG9yZVZhckludDE2KC00" +
+    "Mik7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6IFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV0g4oCUIFRocm93" +
+    "biB3aGVuIGF0dGVtcHRpbmcgdG8gc3RvcmUgYW4gb3V0LW9mLWJvdW5kcyBgdmFsdWVgLgovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0" +
+    "dGVtcHRpbmcgdG8gc3RvcmUgbW9yZSBkYXRhIHRoYW4gdGhlIEJ1aWxkZXIgY2FuIGZpdC4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3Jl" +
+    "Zi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZXZhcmludDE2Ci8vLwovLy8gW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFu" +
+    "Zy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtDZWxsIG92ZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vCmFz" +
+    "bSBleHRlbmRzIGZ1biBzdG9yZVZhckludDE2KHNlbGY6IEJ1aWxkZXIsIHZhbHVlOiBJbnQpOiBCdWlsZGVyIHsgU1RWQVJJTlQxNiB9CgovLy8gRXh0ZW5zaW9uIGZ1" +
+    "bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4wLgovLy8KLy8vIFN0b3JlcyAoc2VyaWFsaXplcykgYW4gdW5zaWdu" +
+    "ZWQgYEludGAgYHZhbHVlYCBpbiB0aGUgcmFuZ2UgZnJvbSAwIHRvIDJeMjQ4IOKIkiAxIGluY2x1c2l2ZSBpbnRvIHRoZSBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuIFRo" +
+    "ZSBzZXJpYWxpemF0aW9uIG9mIGB2YWx1ZWAgY29uc2lzdHMgb2YgYSA1LWJpdCB1bnNpZ25lZCBiaWctZW5kaWFuIGludGVnZXIgYGxgLCB3aGljaCBpcyB0aGUgc21h" +
+    "bGxlc3QgaW50ZWdlciBgbGAg4omlIDAsIHN1Y2ggdGhhdCBgdmFsdWVgIDwgMl44ICogYGxgLCBmb2xsb3dlZCBieSBhbiA4ICogYGxgLWJpdCB1bnNpZ25lZCBiaWct" +
+    "ZW5kaWFuIHJlcHJlc2VudGF0aW9uIG9mIGB2YWx1ZWAuIFJldHVybnMgdGhhdCBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4" +
+    "YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgZml6ejogQnVpbGRlciA9IGIuc3RvcmVWYXJVaW50MzIoNDIw" +
+    "MDAwKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogNTogW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXSDigJQgVGhy" +
+    "b3duIHdoZW4gYXR0ZW1wdGluZyB0byBzdG9yZSBhbiBvdXQtb2YtYm91bmRzIGB2YWx1ZWAuCi8vLyAqIDg6IFtDZWxsIG92ZXJmbG93XSDigJQgVGhyb3duIHdoZW4g" +
+    "YXR0ZW1wdGluZyB0byBzdG9yZSBtb3JlIGRhdGEgdGhhbiB0aGUgQnVpbGRlciBjYW4gZml0LgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcv" +
+    "cmVmL2NvcmUtY2VsbHMjYnVpbGRlcnN0b3JldmFydWludDMyCi8vLwovLy8gW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXTogaHR0cHM6Ly9kb2NzLnRhY3Qt" +
+    "bGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtDZWxsIG92ZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8v" +
+    "CmFzbSBleHRlbmRzIGZ1biBzdG9yZVZhclVpbnQzMihzZWxmOiBCdWlsZGVyLCB2YWx1ZTogSW50KTogQnVpbGRlciB7IFNUVkFSVUlOVDMyIH0KCi8vLyBFeHRlbnNp" +
+    "b24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gU2ltaWxhciB0byBgQnVpbGRlci5zdG9y" +
+    "ZVZhclVpbnQzMigpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4yNDcgdG8gMl4yNDcgLSAxIGluY2x1c2l2ZS4KLy8vCi8vLyBg" +
+    "YGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBCdWlsZGVyID0gYi5z" +
+    "dG9yZVZhckludDMyKC00MjAwMDApOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBbSW50ZWdlciBvdXQgb2YgZXhwZWN0" +
+    "ZWQgcmFuZ2VdIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHN0b3JlIGFuIG91dC1vZi1ib3VuZHMgYHZhbHVlYC4KLy8vICogODogW0NlbGwgb3ZlcmZsb3dd" +
+    "IOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHN0b3JlIG1vcmUgZGF0YSB0aGFuIHRoZSBCdWlsZGVyIGNhbiBmaXQuCi8vLwovLy8gU2VlOiBodHRwczovL2Rv" +
+    "Y3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmV2YXJpbnQzMgovLy8KLy8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0" +
+    "dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbQ2VsbCBvdmVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" +
+    "ZXhpdC1jb2RlcyM4Ci8vLwphc20gZXh0ZW5kcyBmdW4gc3RvcmVWYXJJbnQzMihzZWxmOiBCdWlsZGVyLCB2YWx1ZTogSW50KTogQnVpbGRlciB7IFNUVkFSSU5UMzIg" +
+    "fQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBCdWlsZGVyYCB0eXBlLgovLy8KLy8vIFN0b3JlcyBhIHJlZmVyZW5jZSBgY2VsbGAgaW50byBhIGNvcHkg" +
+    "b2YgdGhlIGBCdWlsZGVyYC4KLy8vIFJldHVybnMgdGhhdCBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuCi8vLwovLy8gTm90ZSB0aGF0IGEgc2luZ2xlIGBDZWxsYCBjYW4g" +
+    "Y29udGFpbiB1cCB0byA0IHJlZmVyZW5jZXMuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNl" +
+    "bGwoKTsKLy8vICAgICBsZXQgZml6ejogQnVpbGRlciA9IGIuc3RvcmVSZWYoZW1wdHlDZWxsKCkpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVz" +
+    "Ci8vLwovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc3RvcmUgbW9yZSB0aGFuIDQgcmVmZXJlbmNlcyBpbiBhIHNp" +
+    "bmdsZSBgQ2VsbGAuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyc3RvcmVyZWYKLy8vCi8v" +
+    "LyBbQ2VsbCBvdmVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLwphc20oY2VsbCBzZWxmKSBleHRlbmRzIGZ1biBz" +
+    "dG9yZVJlZihzZWxmOiBCdWlsZGVyLCBjZWxsOiBDZWxsKTogQnVpbGRlciB7IFNUUkVGIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAg" +
+    "dHlwZS4KLy8vCi8vLyBTdG9yZXMgYSBgc2xpY2VgIGludG8gYSBjb3B5IG9mIHRoZSBgQnVpbGRlcmAuCi8vLyBSZXR1cm5zIHRoYXQgY29weSBvZiB0aGUgYEJ1aWxk" +
+    "ZXJgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IHM6IFNs" +
+    "aWNlID0gZW1wdHlDZWxsKCkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBCdWlsZGVyID0gYi5zdG9yZVNsaWNlKHMpOwovLy8gfQovLy8gYGBgCi8vLwovLy8g" +
+    "IyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc3RvcmUgbW9yZSBkYXRhIHRoYW4g" +
+    "dGhlIEJ1aWxkZXIgY2FuIGZpdC4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZXNs" +
+    "aWNlCi8vLwovLy8gW0NlbGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8KYXNtIGV4dGVuZHMgZnVuIHN0" +
+    "b3JlU2xpY2Uoc2VsZjogQnVpbGRlciwgc2xpY2U6IFNsaWNlKTogQnVpbGRlciB7IFNUU0xJQ0VSIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVp" +
+    "bGRlcmAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS41LjAuCi8vLwovLy8gQXBwZW5kcyBhbGwgZGF0YSBmcm9tIHRoZSBgb3RoZXJgIGJ1aWxkZXIgdG8gdGhl" +
+    "IGNvcHkgb2YgdGhlIGBzZWxmYCBidWlsZGVyLiBSZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZShvcDogSW50LCBxdWVyeUlk" +
+    "OiBJbnQsIHBheWxvYWQ6IEJ1aWxkZXIpIHsKLy8vICAgIGxldCBtc2dCb2R5ID0gYmVnaW5DZWxsKCkuc3RvcmVVaW50KG9wLCAzMikuc3RvcmVVaW50KHF1ZXJ5SWQs" +
+    "IDY0KTsKLy8vICAgIGlmIChwYXlsb2FkLmJpdHMoKSAhPSAwKSB7Ci8vLyAgICAgICAgbXNnQm9keSA9IG1zZ0JvZHkuc3RvcmVCdWlsZGVyKHBheWxvYWQpOyAvLyBh" +
+    "c3NpZ25tZW50IGlzIGltcG9ydGFudCBoZXJlCi8vLyAgICB9Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDg6IFtDZWxsIG92" +
+    "ZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzdG9yZSBtb3JlIGRhdGEgdGhhbiB0aGUgQnVpbGRlciBjYW4gZml0LgovLy8KLy8vIFNlZTogaHR0" +
+    "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcnN0b3JlYnVpbGRlcgovLy8KLy8vIFtDZWxsIG92ZXJmbG93XTogaHR0cHM6Ly9kb2Nz" +
+    "LnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzgKLy8vCmFzbSBleHRlbmRzIGZ1biBzdG9yZUJ1aWxkZXIoc2VsZjogQnVpbGRlciwgb3RoZXI6IEJ1aWxkZXIp" +
+    "OiBCdWlsZGVyIHsgU1RCUiB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgov" +
+    "Ly8KLy8vIElmIHRoZSBgY2VsbGAgaXMgbm90IGBudWxsYCwgc3RvcmVzIDEgYXMgYSBzaW5nbGUgYml0IGFuZCB0aGVuIHJlZmVyZW5jZSBgY2VsbGAgaW50byB0aGUg" +
+    "Y29weSBvZiB0aGUgYEJ1aWxkZXJgLiBSZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBJZiB0aGUgYGNlbGxgIGlzIGBudWxsYCwgb25seSBzdG9yZXMgMCBhcyBhIHNp" +
+    "bmdsZSBiaXQgaW50byB0aGUgY29weSBvZiB0aGUgYEJ1aWxkZXJgLiBSZXR1cm5zIHRoYXQgY29weS4KLy8vCi8vLyBOb3RlIHRoYXQgYSBzaW5nbGUgYENlbGxgIGNh" +
+    "biBjb250YWluIHVwIHRvIDQgcmVmZXJlbmNlcy4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2lu" +
+    "Q2VsbCgpOwovLy8gICAgIGxldCBmaXp6OiBCdWlsZGVyID0gYgovLy8gICAgICAgICAuc3RvcmVNYXliZVJlZihlbXB0eUNlbGwoKSkgLy8gMSwgdGhlbiBlbXB0eSBj" +
+    "ZWxsCi8vLyAgICAgICAgIC5zdG9yZU1heWJlUmVmKG51bGwpOyAgICAgICAvLyAwCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAq" +
+    "IDg6IFtDZWxsIG92ZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzdG9yZSBtb3JlIHRoYW4gNCByZWZlcmVuY2VzIGluIGEgc2luZ2xlIGBDZWxs" +
+    "YC4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJzdG9yZW1heWJlcmVmCi8vLwovLy8gW0NlbGwgb3Zl" +
+    "cmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8KYXNtKGNlbGwgc2VsZikgZXh0ZW5kcyBmdW4gc3RvcmVNYXliZVJl" +
+    "ZihzZWxmOiBCdWlsZGVyLCBjZWxsOiBDZWxsPyk6IEJ1aWxkZXIgeyBTVE9QVFJFRiB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5" +
+    "cGUuCi8vLwovLy8gQ29udmVydHMgYSBgQnVpbGRlcmAgaW50byBhbiBvcmRpbmFyeSBgQ2VsbGAuCi8vLwovLy8gTk9URTogKipHYXMgZXhwZW5zaXZlISoqIFRoaXMg" +
+    "ZnVuY3Rpb24gdXNlcyA1MDAgZ2FzIHVuaXRzIG9yIG1vcmUuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1aWxkZXIg" +
+    "PSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgYzogQ2VsbCA9IGIuZW5kQ2VsbCgpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1s" +
+    "YW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyZW5kY2VsbAovLy8KYXNtIGV4dGVuZHMgZnVuIGVuZENlbGwoc2VsZjogQnVpbGRlcik6IENlbGwgeyBFTkRDIH0K" +
+    "Ci8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4KLy8vCi8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2VsbCByZWZlcmVuY2VzIGFs" +
+    "cmVhZHkgc3RvcmVkIGluIHRoZSBgQnVpbGRlcmAgYXMgYW4gYEludGAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGI6IEJ1" +
+    "aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgcmVmczogSW50ID0gYi5yZWZzKCk7IC8vIDAKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9k" +
+    "b2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcnJlZnMKLy8vCmFzbSBleHRlbmRzIGZ1biByZWZzKHNlbGY6IEJ1aWxkZXIpOiBJbnQgeyBCUkVG" +
+    "UyB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYEJ1aWxkZXJgIHR5cGUuCi8vLwovLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRhdGEgYml0cyBhbHJl" +
+    "YWR5IHN0b3JlZCBpbiB0aGUgYEJ1aWxkZXJgIGFzIGFuIGBJbnRgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBiOiBCdWls" +
+    "ZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyAgICAgbGV0IGJpdHM6IEludCA9IGIuYml0cygpOyAvLyAwCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9j" +
+    "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2J1aWxkZXJiaXRzCi8vLwphc20gZXh0ZW5kcyBmdW4gYml0cyhzZWxmOiBCdWlsZGVyKTogSW50IHsgQkJJVFMg" +
+    "fQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBCdWlsZGVyYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBDb21wdXRlcyBh" +
+    "bmQgcmV0dXJucyB0aGUgYEludGAgZGVwdGggb2YgdGhlIGBCdWlsZGVyYC4gUHJvZHVjZXMgMCBpZiB0aGUgYEJ1aWxkZXJgIGhhcyBubyByZWZlcmVuY2VzIHN0b3Jl" +
+    "ZCBzbyBmYXIsIG90aGVyd2lzZSAxIHBsdXMgdGhlIG1heGltdW0gb2YgdGhlIGRlcHRocyBvZiB0aGUgcmVmZXJlbmNlZCBjZWxscy4KLy8vCi8vLyBgYGB0YWN0Ci8v" +
+    "LyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KTsKLy8vICAgICBsZXQgZGVwdGg6IEludCA9" +
+    "IGIuZGVwdGgoKTsgLy8gMAovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNidWlsZGVyZGVw" +
+    "dGgKLy8vCmFzbSBleHRlbmRzIGZ1biBkZXB0aChzZWxmOiBCdWlsZGVyKTogSW50IHsgQkRFUFRIIH0KCi8vCi8vIFNsaWNlCi8vCgovLy8gRXh0ZW5zaW9uIGZ1bmN0" +
+    "aW9uIGZvciB0aGUgYENlbGxgIHR5cGUuCi8vLwovLy8gT3BlbnMgdGhlIGBDZWxsYCBmb3IgcGFyc2luZyBhbmQgcmV0dXJucyBpdCBhcyBhIGBTbGljZWAuCi8vLwov" +
+    "Ly8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGM6IENlbGwgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgczogU2xpY2UgPSBjLmJlZ2lu" +
+    "UGFyc2UoKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjY2VsbGJlZ2lucGFy" +
+    "c2UKLy8vCmFzbSBleHRlbmRzIGZ1biBiZWdpblBhcnNlKHNlbGY6IENlbGwpOiBTbGljZSB7IENUT1MgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBm" +
+    "b3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBMb2FkcyB0aGUgbmV4dCByZWZlcmVuY2UgZnJvbSB0aGUgYFNsaWNlYCBhcyBhIGBDZWxsYC4KLy8vCi8vLyBgYGB0" +
+    "YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8v" +
+    "ICAgICBsZXQgZml6ejogQ2VsbCA9IHMxLmxvYWRSZWYoKTsKLy8vCi8vLyAgICAgbGV0IHMyOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVJl" +
+    "ZihlbXB0eUNlbGwoKSkKLy8vICAgICAgICAgLnN0b3JlUmVmKHMxLmFzQ2VsbCgpKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8gICAgIGxldCByZWYxOiBDZWxs" +
+    "ID0gczIubG9hZFJlZigpOwovLy8gICAgIGxldCByZWYyOiBDZWxsID0gczIubG9hZFJlZigpOwovLy8gICAgIHJlZjEgPT0gcmVmMjsgLy8gZmFsc2UKLy8vIH0KLy8v" +
+    "IGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogOTogW0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBsb2FkIG1v" +
+    "cmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGlj" +
+    "ZWxvYWRyZWYKLy8vCi8vLyBbQ2VsbCB1bmRlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtKC0+IDEgMCkg" +
+    "ZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkUmVmKHNlbGY6IFNsaWNlKTogQ2VsbCB7IExEUkVGIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRo" +
+    "ZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4yLgovLy8KLy8vIFNraXBzIHRoZSBuZXh0IHJlZmVyZW5jZSBmcm9tIHRoZSBgU2xpY2VgLiBT" +
+    "aW1pbGFyIHRvIGRpc2NhcmRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgU2xpY2UubG9hZFJlZigpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsK" +
+    "Ly8vICAgICBsZXQgczE6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAgICAgLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKQovLy8gICAgICAgICAuc3RvcmVVaW50KDQy" +
+    "LCAzMikKLy8vICAgICAgICAgLmFzU2xpY2UoKTsKLy8vCi8vLyAgICAgczEuc2tpcFJlZigpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzMS5sb2FkVWludCgzMik7" +
+    "IC8vIDQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVt" +
+    "cHRpbmcgdG8gc2tpcCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" +
+    "L2NvcmUtY2VsbHMjc2xpY2Vza2lwcmVmCi8vLwovLy8gW0NlbGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkK" +
+    "Ly8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBSZWYoc2VsZjogU2xpY2UpIHsgTERSRUYgTklQIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBg" +
+    "U2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNS4wLgovLy8KLy8vIFByZWxvYWRzIHRoZSBuZXh0IHJlZmVyZW5jZSBmcm9tIHRoZSBgU2xpY2VgIGFz" +
+    "IGEgYENlbGxgLiBEb2Vzbid0IG1vZGlmeSB0aGUgb3JpZ2luYWwgYFNsaWNlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZXMoKSB7Ci8vLyAgICAgbGV0" +
+    "IHMxOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IENlbGwgPSBzMS5wcmVsb2FkUmVm" +
+    "KCk7IC8vIGRpZG4ndCBtb2RpZnkgczEKLy8vCi8vLyAgICAgbGV0IHMyOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVJlZihlbXB0eUNlbGwo" +
+    "KSkKLy8vICAgICAgICAgLnN0b3JlUmVmKHMxLmFzQ2VsbCgpKQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBsZXQgcmVmMTogQ2VsbCA9IHMyLnBy" +
+    "ZWxvYWRSZWYoKTsKLy8vICAgICBsZXQgcmVmMjogQ2VsbCA9IHMyLnByZWxvYWRSZWYoKTsKLy8vICAgICByZWYxID09IHJlZjI7IC8vIHRydWUKLy8vIH0KLy8vIGBg" +
+    "YAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogOTogW0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBwcmVsb2FkIG1v" +
+    "cmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGlj" +
+    "ZXByZWxvYWRyZWYKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW0NlbGwgdW5kZXJmbG93XTogaHR0cHM6Ly9k" +
+    "b2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRzIGZ1biBwcmVsb2FkUmVmKHNlbGY6IFNsaWNlKTogQ2VsbCB7IFBMRFJFRiB9" +
+    "CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBMb2Fk" +
+    "cyBhIHNpbmdsZSBiaXQgZnJvbSB0aGUgYFNsaWNlYDogaWYgaXQncyAxLCB0aGVuIHRoZSByZWZlcmVuY2VkIGBDZWxsYCBpcyBsb2FkZWQKLy8vIGFuZCByZXR1cm5l" +
+    "ZC4gSWYgdGhlIGxvYWRlZCBiaXQgaXMgMCwgdGhlbiBub3RoaW5nIGVsc2UgaXMgbG9hZGVkIGFuZCBgbnVsbGAgaXMgcmV0dXJuZWQuCi8vLwovLy8gYGBgdGFjdAov" +
+    "Ly8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHMgPSBtc2cuYXNTbGljZSgpOwovLy8gICAgIGxldCBvdXRBY3Rpb25zID0gcy5sb2FkTWF5YmVSZWYoKTsKLy8v" +
+    "Ci8vLyAgICAgaWYgKG91dEFjdGlvbnMgIT0gbnVsbCkgewovLy8gICAgICAgICBsZXQgYWN0aW9ucyA9IG91dEFjdGlvbnMhITsKLy8vICAgICAgICAgLy8gLi4ucHJv" +
+    "Y2VzcyBhY3Rpb25zLi4uCi8vLyAgICAgfQovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKA" +
+    "lCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9j" +
+    "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZG1heWJlcmVmCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2Rl" +
+    "cwovLy8KLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20oLT4gMSAwKSBleHRlbmRz" +
+    "IG11dGF0ZXMgZnVuIGxvYWRNYXliZVJlZihzZWxmOiBTbGljZSk6IENlbGw/IHsgTERPUFRSRUYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3Ig" +
+    "dGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYENlbGw/YCBmcm9tIHRoZSBgU2xpY2VgLiBTaW1pbGFyIHRv" +
+    "IGRpc2NhcmRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBgU2xpY2UubG9hZE1heWJlUmVmKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8g" +
+    "ICAgIGxldCBzMTogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVNYXliZVJlZihlbXB0eUNlbGwoKSkKLy8vICAgICAgICAgLnN0b3JlVWludCg0" +
+    "MiwgMzIpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMxLnNraXBNYXliZVJlZigpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzMS5sb2FkVWlu" +
+    "dCgzMik7IC8vIDQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVu" +
+    "IGF0dGVtcHRpbmcgdG8gc2tpcCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5v" +
+    "cmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwbWF5YmVyZWYKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzCi8vLwovLy8gW0Nl" +
+    "bGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBNYXli" +
+    "ZVJlZihzZWxmOiBTbGljZSkgeyBMRE9QVFJFRiBOSVAgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNl" +
+    "IFRhY3QgMS42LjAuCi8vLwovLy8gUHJlbG9hZHMgYSBzaW5nbGUgYml0IGZyb20gdGhlIGBTbGljZWA6IGlmIGl0J3MgMSwgdGhlbiB0aGUgcmVmZXJlbmNlZCBgQ2Vs" +
+    "bGAgaXMKLy8vIHByZWxvYWRlZCBhbmQgcmV0dXJuZWQuIElmIHRoZSBwcmVsb2FkZWQgYml0IGlzIDAsIHRoZW4gYG51bGxgIGlzIHJldHVybmVkLiBEb2Vzbid0IG1v" +
+    "ZGlmeSB0aGUgb3JpZ2luYWwgYFNsaWNlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZXMoKSB7Ci8vLyAgICAgbGV0IHMxOiBTbGljZSA9IGJlZ2luQ2Vs" +
+    "bCgpLnN0b3JlTWF5YmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogQ2VsbCA9IHMxLnByZWxvYWRNYXliZVJlZigpOyAvLyByZXR1" +
+    "cm5zIGVtcHR5Q2VsbCgpIGFuZCBkb2Vzbid0IG1vZGlmeSBzMQovLy8KLy8vICAgICBsZXQgczI6IFNsaWNlID0gYmVnaW5DZWxsKCkKLy8vICAgICAgICAgLnN0b3Jl" +
+    "TWF5YmVSZWYobnVsbCkKLy8vICAgICAgICAgLnN0b3JlTWF5YmVSZWYoczEuYXNDZWxsKCkpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIGxldCBy" +
+    "ZWYxOiBDZWxsID0gczIucHJlbG9hZE1heWJlUmVmKCk7IC8vIHJldHVybnMgbnVsbCBhbmQgZG9lc24ndCBtb2RpZnkgczIKLy8vICAgICBsZXQgcmVmMjogQ2VsbCA9" +
+    "IHMyLnByZWxvYWRNYXliZVJlZigpOyAvLyBzYW1lIGVmZmVjdAovLy8gICAgIHJlZjEgPT0gbnVsbDsgLy8gdHJ1ZQovLy8gICAgIHJlZjEgPT0gcmVmMjsgLy8gdHJ1" +
+    "ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5n" +
+    "IHRvIHByZWxvYWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9j" +
+    "b3JlLWNlbGxzI3NsaWNlcHJlbG9hZG1heWJlcmVmCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcwovLy8KLy8vIFtDZWxsIHVu" +
+    "ZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBmdW4gcHJlbG9hZE1heWJlUmVmKHNlbGY6" +
+    "IFNsaWNlKTogQ2VsbD8geyBQTERPUFRSRUYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBMb2Fk" +
+    "cyBgMCDiiaQgbCDiiaQgMTAyM2AgYml0cyBmcm9tIHRoZSBgU2xpY2VgIGFuZCByZXR1cm5zIHRoZW0gYXMgYSBzZXBhcmF0ZSBgU2xpY2VgLgovLy8KLy8vIGBgYHRh" +
+    "Y3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0" +
+    "IGZpeno6IFNsaWNlID0gcy5sb2FkQml0cyg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogNTogW0ludGVnZXIgb3V0IG9m" +
+    "IGV4cGVjdGVkIHJhbmdlXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVlLgovLy8gKiA5OiBbQ2Vs" +
+    "bCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHByZWxvYWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6" +
+    "IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGJpdHMKLy8vCi8vLyBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2Vd" +
+    "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW0NlbGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcv" +
+    "Ym9vay9leGl0LWNvZGVzIzkKLy8vCkBuYW1lKGxvYWRfYml0cykgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdp" +
+    "dGggYXNtICJMRFNMSUNFWCIKZXh0ZW5kcyBtdXRhdGVzIG5hdGl2ZSBsb2FkQml0cyhzZWxmOiBTbGljZSwgbDogSW50KTogU2xpY2U7CgovLy8gRXh0ZW5zaW9uIGZ1" +
+    "bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIFByZWxvYWRzIGAwIOKJpCBsIOKJpCAxMDIzYCBiaXRzIGZyb20gdGhlIGBTbGljZWAgYW5kIHJldHVy" +
+    "bnMgdGhlbSBhcyBhIHNlcGFyYXRlIGBTbGljZWAuCi8vLyBEb2Vzbid0IG1vZGlmeSB0aGUgb3JpZ2luYWwgYFNsaWNlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4g" +
+    "ZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBTbGlj" +
+    "ZSA9IHMucHJlbG9hZEJpdHMoNyk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6IFtJbnRlZ2VyIG91dCBvZiBleHBlY3Rl" +
+    "ZCByYW5nZV0g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1ZS4KLy8vICogOTogW0NlbGwgdW5kZXJm" +
+    "bG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2VlOiBodHRwczov" +
+    "L2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXByZWxvYWRiaXRzCi8vLwovLy8gW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXTogaHR0" +
+    "cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" +
+    "ZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShwcmVsb2FkX2JpdHMpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRo" +
+    "IGFzbSAiUExEU0xJQ0VYIgpleHRlbmRzIG5hdGl2ZSBwcmVsb2FkQml0cyhzZWxmOiBTbGljZSwgbDogSW50KTogU2xpY2U7CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9u" +
+    "IGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIExvYWRzIGFuZCByZXR1cm5zIGEgc2lnbmVkIGBsYC1iaXQgYEludGAgZnJvbSB0aGUgYFNsaWNl" +
+    "YCwgZm9yIGAwIOKJpCBsIOKJpCAyNTdgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgp" +
+    "LnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZEludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhp" +
+    "dCBjb2RlcwovLy8KLy8vICogNTogW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzcGVjaWZ5IGFuIG91" +
+    "dC1vZi1ib3VuZHMgYGxgIHZhbHVlLgovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHByZWxvYWQgbW9yZSBkYXRh" +
+    "IHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGludAovLy8K" +
+    "Ly8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbQ2VsbCB1bmRl" +
+    "cmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KQG5hbWUobG9hZF9pbnQpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGlu" +
+    "IEZ1bmMgY29tcGlsZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiTERJWCIKZXh0ZW5kcyBtdXRhdGVzIG5hdGl2ZSBsb2FkSW50KHNlbGY6IFNsaWNlLCBsOiBJ" +
+    "bnQpOiBJbnQ7CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIFByZWxvYWRzIGFuZCByZXR1cm5zIGEgc2lnbmVkIGBs" +
+    "YC1iaXQgYEludGAgZnJvbSB0aGUgYFNsaWNlYCwgZm9yIGAwIOKJpCBsIOKJpCAyNTdgLgovLy8gRG9lc24ndCBtb2RpZnkgdGhlIGBTbGljZWAuCi8vLwovLy8gYGBg" +
+    "dGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBs" +
+    "ZXQgZml6ejogSW50ID0gcy5wcmVsb2FkSW50KDcpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBbSW50ZWdlciBvdXQg" +
+    "b2YgZXhwZWN0ZWQgcmFuZ2VdIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBgbGAgdmFsdWUuCi8vLyAqIDk6IFtD" +
+    "ZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNl" +
+    "ZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VwcmVsb2FkaW50Ci8vLwovLy8gW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJh" +
+    "bmdlXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
+    "b3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShwcmVsb2FkX2ludCkgLy8gc3BlY2lhbCB0cmVhdG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxh" +
+    "Y2VkIHdpdGggYXNtICJQTERJWCIKZXh0ZW5kcyBuYXRpdmUgcHJlbG9hZEludChzZWxmOiBTbGljZSwgbDogSW50KTogSW50OwoKLy8vIEV4dGVuc2lvbiBtdXRhdGlv" +
+    "biBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBMb2FkcyBhbmQgcmV0dXJucyBhbiB1bnNpZ25lZCBgbGAtYml0IGBJbnRgIGZyb20gdGhlIGBT" +
+    "bGljZWAsIGZvciBgMCDiiaQgbCDiiaQgMjU2YC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNl" +
+    "bGwoKS5zdG9yZVVpbnQoNDIsIDcpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMj" +
+    "IyMgRXhpdCBjb2RlcwovLy8KLy8vICogNTogW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzcGVjaWZ5" +
+    "IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVlLgovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHByZWxvYWQgbW9y" +
+    "ZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZHVp" +
+    "bnQKLy8vCi8vLyBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW0Nl" +
+    "bGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCkBuYW1lKGxvYWRfdWludCkgLy8gc3BlY2lhbCB0cmVh" +
+    "dG1lbnQgaW4gRnVuYyBjb21waWxlciwgc28gbm90IHJlcGxhY2VkIHdpdGggYXNtICJMRFVYIgpleHRlbmRzIG11dGF0ZXMgbmF0aXZlIGxvYWRVaW50KHNlbGY6IFNs" +
+    "aWNlLCBsOiBJbnQpOiBJbnQ7CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIFByZWxvYWRzIGFuZCByZXR1cm5zIGFu" +
+    "IHVuc2lnbmVkIGBsYC1iaXQgYEludGAgZnJvbSB0aGUgYFNsaWNlYCwgZm9yIGAwIOKJpCBsIOKJpCAyNTZgLgovLy8gRG9lc24ndCBtb2RpZnkgdGhlIGBTbGljZWAu" +
+    "Ci8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVVaW50KDQyLCA3KS5hc1NsaWNl" +
+    "KCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMucHJlbG9hZFVpbnQoNyk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6" +
+    "IFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV0g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc3BlY2lmeSBhbiBvdXQtb2YtYm91bmRzIGBsYCB2YWx1" +
+    "ZS4KLy8vICogOTogW0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFp" +
+    "bnMuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXByZWxvYWR1aW50Ci8vLwovLy8gW0ludGVnZXIgb3V0" +
+    "IG9mIGV4cGVjdGVkIHJhbmdlXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8v" +
+    "ZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwpAbmFtZShwcmVsb2FkX3VpbnQpIC8vIHNwZWNpYWwgdHJlYXRtZW50IGluIEZ1bmMgY29tcGls" +
+    "ZXIsIHNvIG5vdCByZXBsYWNlZCB3aXRoIGFzbSAiUExEVVgiCmV4dGVuZHMgbmF0aXZlIHByZWxvYWRVaW50KHNlbGY6IFNsaWNlLCBsOiBJbnQpOiBJbnQ7CgovLy8g" +
+    "RXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIExvYWRzIGEgc2luZ2xlIGJpdCBhbmQgcmV0dXJucyBhIGBCb29s" +
+    "YCB2YWx1ZSBmcm9tIHRoZSBgU2xpY2VgLgovLy8gUmVhZHMgYHRydWVgIGlmIHRoZSBsb2FkZWQgYml0IGlzIGVxdWFsIHRvIDEsIGFuZCByZWFkcyBgZmFsc2VgIG90" +
+    "aGVyd2lzZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUJvb2wodHJ1ZSku" +
+    "YXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBCb29sID0gcy5sb2FkQm9vbCgpOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMK" +
+    "Ly8vCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcHJlbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRh" +
+    "aW5zLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkaW50Ci8vLwovLy8gW0NlbGwgdW5kZXJmbG93" +
+    "XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4gbG9hZEJvb2woc2Vs" +
+    "ZjogU2xpY2UpOiBCb29sIHsgMSBMREkgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNl" +
+    "IFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYSBzaW5nbGUgYml0IGZyb20gdGhlIGBTbGljZWAuIFNpbWlsYXIgdG8gZGlzY2FyZGluZyB0aGUgcmV0dXJuIHZhbHVl" +
+    "IG9mIGBTbGljZS5sb2FkQm9vbCgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKQov" +
+    "Ly8gICAgICAgICAuc3RvcmVCb29sKHRydWUpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMu" +
+    "c2tpcEJvb2woKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVWludCg3KTsgLy8gNDIKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2Rlcwov" +
+    "Ly8KLy8vICogOTogW0NlbGwgdW5kZXJmbG93XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBza2lwIG1vcmUgZGF0YSB0aGFuIHRoZSBgU2xpY2VgIGNvbnRh" +
+    "aW5zLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwYm9vbAovLy8KLy8vIFtDZWxsIHVu" +
+    "ZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwQm9vbChzZWxm" +
+    "OiBTbGljZSkgeyAxIExESSBOSVAgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRh" +
+    "Y3QgMS41LjAuCi8vLwovLy8gQWxpYXMgdG8gYFNsaWNlLmxvYWRCb29sKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBz" +
+    "OiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlQm9vbCh0cnVlKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmxvYWRCaXQoKTsgLy8gdHJ1ZQov" +
+    "Ly8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRv" +
+    "IGxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29y" +
+    "ZS1jZWxscyNzbGljZWxvYWRiaXQKLy8vCi8vLyBbQ2VsbCB1bmRlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8K" +
+    "YXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkQml0KHNlbGY6IFNsaWNlKTogQm9vbCB7IDEgTERJIH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVu" +
+    "Y3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gTG9hZHMgYW5kIHJldHVybnMgYSBzZXJpYWxpemVkIHVuc2lnbmVkIGBJbnRgIHZhbHVlIGluIHRoZSBy" +
+    "YW5nZSBmcm9tIDAgdG8gMl4xMjAgLSAxCi8vLyBpbmNsdXNpdmUgZnJvbSB0aGUgYFNsaWNlYC4gVGhpcyB2YWx1ZSB1c3VhbGx5IHJlcHJlc2VudHMgdGhlIGFtb3Vu" +
+    "dCBpbiBuYW5vVG9uY29pbnMuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVD" +
+    "b2lucyg0MikuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRDb2lucygpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0" +
+    "IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBj" +
+    "b250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZGNvaW5zCi8vLwovLy8gW0Nl" +
+    "bGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBmdW4g" +
+    "bG9hZENvaW5zKHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJVSU5UMTYgfQoKLy8vIEV4dGVuc2lvbiBtdXRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlw" +
+    "ZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjIuCi8vLwovLy8gU2tpcHMgYSBzZXJpYWxpemVkIHVuc2lnbmVkIGBJbnRgIHZhbHVlIGluIHRoZSByYW5nZSBmcm9t" +
+    "IDAgdG8gMl4xMjAgLSAxCi8vLyBpbmNsdXNpdmUgZnJvbSB0aGUgYFNsaWNlYC4gU2ltaWxhciB0byBkaXNjYXJkaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYFNsaWNl" +
+    "LmxvYWRDb2lucygpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAg" +
+    "ICAuc3RvcmVDb2lucygyMzkpCi8vLyAgICAgICAgIC5zdG9yZVVpbnQoNDIsIDcpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcENvaW5z" +
+    "KCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFVpbnQoNyk7IC8vIDQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAq" +
+    "IDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc2tpcCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8v" +
+    "IFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vza2lwY29pbnMKLy8vCi8vLyBbQ2VsbCB1bmRlcmZsb3ddOiBo" +
+    "dHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgbXV0YXRlcyBmdW4gc2tpcENvaW5zKHNlbGY6IFNsaWNlKSB7" +
+    "IExEVkFSVUlOVDE2IE5JUCB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAx" +
+    "LjYuMC4KLy8vCi8vLyBBbGlhcyB0byBgU2xpY2UubG9hZENvaW5zKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBT" +
+    "bGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlVmFyVWludDE2KDQyKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMubG9hZFZhclVpbnQxNigpOyAvLyA0" +
+    "MgovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5n" +
+    "IHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3Jl" +
+    "LWNlbGxzI3NsaWNlbG9hZHZhcnVpbnQxNgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWxvYWRjb2lucwovLy8KLy8v" +
+    "IFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20oLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMg" +
+    "ZnVuIGxvYWRWYXJVaW50MTYoc2VsZjogU2xpY2UpOiBJbnQgeyBMRFZBUlVJTlQxNiB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNs" +
+    "aWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMi4KLy8vCi8vLyBBbGlhcyB0byBgU2xpY2Uuc2tpcENvaW5zKClgLgovLy8KLy8vIGBgYHRhY3QKLy8v" +
+    "IGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhclVpbnQxNigyMzkpCi8vLyAgICAgICAg" +
+    "IC5zdG9yZVVpbnQoNDIsIDcpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhclVpbnQxNigpOwovLy8gICAgIGxldCBmaXp6OiBJbnQg" +
+    "PSBzLmxvYWRVaW50KDcpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBU" +
+    "aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHNraXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50" +
+    "YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcHZhcnVpbnQxNgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNz" +
+    "bGljZXNraXBjb2lucwovLy8KLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0" +
+    "ZW5kcyBtdXRhdGVzIGZ1biBza2lwVmFyVWludDE2KHNlbGY6IFNsaWNlKSB7IExEVkFSVUlOVDE2IE5JUCB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9u" +
+    "IGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBTaW1pbGFyIHRvIGBTbGljZS5sb2FkQ29pbnMoKWAsIGJ1dCB3" +
+    "aXRoIGEgZGlmZmVyZW50IGB2YWx1ZWAgcmFuZ2U6IGZyb20gLTJeMTE5IHRvIDJeMTE5IC0gMSBpbmNsdXNpdmUuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1w" +
+    "bGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVWYXJJbnQxNigtNDIpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0g" +
+    "cy5sb2FkVmFySW50MTYoKTsgLy8gLTQyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCU" +
+    "IFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gbG9hZCBtb3JlIGRhdGEgdGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2Nz" +
+    "LnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vsb2FkdmFyaW50MTYKLy8vCi8vLyBbQ2VsbCB1bmRlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5n" +
+    "Lm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtKC0+IDEgMCkgZXh0ZW5kcyBtdXRhdGVzIGZ1biBsb2FkVmFySW50MTYoc2VsZjogU2xpY2UpOiBJbnQgeyBMRFZB" +
+    "UklOVDE2IH0KCi8vLyBFeHRlbnNpb24gbXV0YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4yLgovLy8K" +
+    "Ly8vIFNpbWlsYXIgdG8gYFNsaWNlLnNraXBDb2lucygpYCwgYnV0IHdpdGggYSBkaWZmZXJlbnQgYHZhbHVlYCByYW5nZTogZnJvbSAtMl4xMTkgdG8gMl4xMTkgLSAx" +
+    "IGluY2x1c2l2ZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAu" +
+    "c3RvcmVWYXJJbnQxNigtMjM5KQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCA3KQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBzLnNraXBWYXJJ" +
+    "bnQxNigpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRVaW50KDcpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwov" +
+    "Ly8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHNraXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8v" +
+    "Ci8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcHZhcmludDE2Ci8vLwovLy8gW0NlbGwgdW5kZXJm" +
+    "bG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSBleHRlbmRzIG11dGF0ZXMgZnVuIHNraXBWYXJJbnQxNihzZWxm" +
+    "OiBTbGljZSkgeyBMRFZBUklOVDE2IE5JUCB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2lu" +
+    "Y2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBMb2FkcyBhbmQgcmV0dXJucyBhIHNlcmlhbGl6ZWQgdW5zaWduZWQgYEludGAgdmFsdWUgaW4gdGhlIHJhbmdlIGZyb20gMCB0" +
+    "byAyXjI0OCDiiJIgMSBpbmNsdXNpdmUgZnJvbSB0aGUgYFNsaWNlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xp" +
+    "Y2UgPSBiZWdpbkNlbGwoKS5zdG9yZVZhclVpbnQzMig0MjAwMDApLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVmFyVWludDMyKCk7IC8v" +
+    "IDQyMDAwMAovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRl" +
+    "bXB0aW5nIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3Jl" +
+    "Zi9jb3JlLWNlbGxzI3NsaWNlbG9hZHZhcnVpbnQzMgovLy8KLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1j" +
+    "b2RlcyM5Ci8vLwphc20oLT4gMSAwKSBleHRlbmRzIG11dGF0ZXMgZnVuIGxvYWRWYXJVaW50MzIoc2VsZjogU2xpY2UpOiBJbnQgeyBMRFZBUlVJTlQzMiB9CgovLy8g" +
+    "RXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMi4KLy8vCi8vLyBTa2lwcyBhIHNl" +
+    "cmlhbGl6ZWQgdW5zaWduZWQgYEludGAgdmFsdWUgaW4gdGhlIHJhbmdlIGZyb20gMCB0byAyXjI0OCDiiJIgMSBpbmNsdXNpdmUKLy8vIGZyb20gdGhlIGBTbGljZWAu" +
+    "IFNpbWlsYXIgdG8gZGlzY2FyZGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGBTbGljZS5sb2FkVmFyVWludDMyKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFt" +
+    "cGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpCi8vLyAgICAgICAgIC5zdG9yZVZhclVpbnQzMigyMzkpCi8vLyAgICAgICAgIC5zdG9yZVVp" +
+    "bnQoNDIsIDcpCi8vLyAgICAgICAgIC5hc1NsaWNlKCk7Ci8vLwovLy8gICAgIHMuc2tpcFZhclVpbnQzMigpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRV" +
+    "aW50KDcpOyAvLyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hl" +
+    "biBhdHRlbXB0aW5nIHRvIHNraXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" +
+    "b3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcHZhcnVpbnQzMgovLy8KLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" +
+    "ZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwVmFyVWludDMyKHNlbGY6IFNsaWNlKSB7IExEVkFSVUlOVDMyIE5JUCB9CgovLy8gRXh0" +
+    "ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBTaW1pbGFyIHRvIGBT" +
+    "bGljZS5sb2FkVmFyVWludDMyKClgLCBidXQgd2l0aCBhIGRpZmZlcmVudCBgdmFsdWVgIHJhbmdlOgovLy8gZnJvbSAtMl4yNDcgdG8gMl4yNDcgLSAxIGluY2x1c2l2" +
+    "ZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVZhckludDMyKC00MjAwMDAp" +
+    "LmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogSW50ID0gcy5sb2FkVmFySW50MzIoKTsgLy8gLTQyMDAwMAovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0" +
+    "IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBj" +
+    "b250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlbG9hZHZhcmludDMyCi8vLwovLy8g" +
+    "W0NlbGwgdW5kZXJmbG93XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vCmFzbSgtPiAxIDApIGV4dGVuZHMgbXV0YXRlcyBm" +
+    "dW4gbG9hZFZhckludDMyKHNlbGY6IFNsaWNlKTogSW50IHsgTERWQVJJTlQzMiB9CgovLy8gRXh0ZW5zaW9uIG11dGF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNl" +
+    "YCB0eXBlLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMi4KLy8vCi8vLyBTaW1pbGFyIHRvIGBTbGljZS5za2lwVmFyVWludDMyKClgLCBidXQgd2l0aCBhIGRpZmZl" +
+    "cmVudCBgdmFsdWVgIHJhbmdlOgovLy8gZnJvbSAtMl4yNDcgdG8gMl4yNDcgLSAxIGluY2x1c2l2ZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsK" +
+    "Ly8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKQovLy8gICAgICAgICAuc3RvcmVWYXJJbnQzMigtMjM5KQovLy8gICAgICAgICAuc3RvcmVVaW50KDQyLCA3" +
+    "KQovLy8gICAgICAgICAuYXNTbGljZSgpOwovLy8KLy8vICAgICBzLnNraXBWYXJJbnQzMigpOwovLy8gICAgIGxldCBmaXp6OiBJbnQgPSBzLmxvYWRVaW50KDcpOyAv" +
+    "LyA0MgovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0" +
+    "aW5nIHRvIHNraXAgbW9yZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9j" +
+    "b3JlLWNlbGxzI3NsaWNlc2tpcHZhcnVpbnQzMgovLy8KLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2Rl" +
+    "cyM5Ci8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwVmFySW50MzIoc2VsZjogU2xpY2UpIHsgTERWQVJJTlQzMiBOSVAgfQoKLy8vIEV4dGVuc2lvbiBtdXRh" +
+    "dGlvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBMb2FkcyBhbGwgYnV0IHRoZSBmaXJzdCBgMCDiiaQgbCDiiaQgMTAyM2AgYml0cyBmcm9t" +
+    "IHRoZSBgU2xpY2VgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQy" +
+    "LCA3KS5hc1NsaWNlKCk7Ci8vLyAgICAgcy5za2lwQml0cyg1KTsgICAgICAgICAgICAgICAgICAgLy8gYWxsIGJ1dCBmaXJzdCA1IGJpdHMKLy8vICAgICBsZXQgZml6" +
+    "ejogU2xpY2UgPSBzLmxvYWRCaXRzKDEpOyAvLyBsb2FkIG9ubHkgMSBiaXQKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogNTog" +
+    "W0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzcGVjaWZ5IGFuIG91dC1vZi1ib3VuZHMgYGxgIHZhbHVl" +
+    "LgovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGxvYWQgbW9yZSBkYXRhIHRoYW4gdGhlIGBTbGljZWAgY29udGFp" +
+    "bnMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXNraXBiaXRzCi8vLwovLy8gW0ludGVnZXIg" +
+    "b3V0IG9mIGV4cGVjdGVkIHJhbmdlXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBz" +
+    "Oi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBtdXRhdGVzIGZ1biBza2lwQml0cyhzZWxmOiBTbGljZSwgbDogSW50" +
+    "KSB7IFNEU0tJUEZJUlNUIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuCi8vLwovLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIGBTbGlj" +
+    "ZWAgaXMgZW1wdHkgKGkuZS4sIGNvbnRhaW5zIG5vIGJpdHMgb2YgZGF0YSBhbmQgbm8gY2VsbCByZWZlcmVuY2VzKS4KLy8vIElmIGl0IGlzIG5vdCwgaXQgdGhyb3dz" +
+    "IGFuIGV4Y2VwdGlvbiB3aXRoIFtleGl0IGNvZGUgOV06IGBDZWxsIHVuZGVyZmxvd2AuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAg" +
+    "bGV0IGVtcHR5T25lOiBTbGljZSA9IGVtcHR5U2xpY2UoKTsKLy8vICAgICBlbXB0eU9uZS5lbmRQYXJzZSgpOyAvLyBub3RoaW5nLCBhcyBpdCdzIGVtcHR5Ci8vLwov" +
+    "Ly8gICAgIGxldCBwYXVsOiBTbGljZSA9ICJGZWFyIGlzIHRoZSBtaW5kLWtpbGxlciIuYXNTbGljZSgpOwovLy8gICAgIHRyeSB7Ci8vLyAgICAgICAgIHBhdWwuZW5k" +
+    "UGFyc2UoKTsgLy8gdGhyb3dzIGV4aXQgY29kZSA5Ci8vLyAgICAgfQovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA5OiBbQ2Vs" +
+    "bCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiB0aGUgYFNsaWNlYCBpcyBub3QgZW1wdHkuCi8vLwovLy8gW2V4aXQgY29kZSA5XTogaHR0cHM6Ly9kb2NzLnRhY3Qt" +
+    "bGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8v" +
+    "Lwphc20gZXh0ZW5kcyBmdW4gZW5kUGFyc2Uoc2VsZjogU2xpY2UpIHsgRU5EUyB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBB" +
+    "dmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBQcmVsb2FkcyBhbGwgYnV0IHRoZSBsYXN0IGAwIOKJpCBsZW4g4omkIDEwMjNgIGJpdHMgZnJvbSB0aGUg" +
+    "YFNsaWNlYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNyku" +
+    "YXNTbGljZSgpOwovLy8gICAgIGxldCBhbGxCdXRMYXN0Rml2ZTogU2xpY2UgPSBzLnNraXBMYXN0Qml0cyg1KTsgLy8gYWxsIGJ1dCBsYXN0IDUgYml0cywKLy8vICAg" +
+    "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkuZS4gb25seSBmaXJzdCAyCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMj" +
+    "IEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6IFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV0g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gc3BlY2lmeSBh" +
+    "biBvdXQtb2YtYm91bmRzIGBsZW5gIHZhbHVlLgovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHByZWxvYWQgbW9y" +
+    "ZSBkYXRhIHRoYW4gYFNsaWNlYCBjb250YWlucy4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlc2tpcGxh" +
+    "c3RiaXRzCi8vLwovLy8gW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8v" +
+    "IFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBmdW4gc2tpcExhc3RCaXRz" +
+    "KHNlbGY6IFNsaWNlLCBsZW46IEludCk6IFNsaWNlIHsgU0RTS0lQTEFTVCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBBdmFp" +
+    "bGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBQcmVsb2FkcyB0aGUgZmlyc3QgYDAg4omkIGxlbiDiiaQgMTAyM2AgYml0cyBmcm9tIHRoZSBgU2xpY2VgLgov" +
+    "Ly8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5hc1NsaWNlKCk7" +
+    "Ci8vLyAgICAgbGV0IGZpcnN0Rml2ZTogU2xpY2UgPSBzLmZpcnN0Qml0cyg1KTsgLy8gZmlyc3QgNSBiaXRzCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBJbiBvcmRlciB0" +
+    "byByZWR1Y2UgZ2FzIHVzYWdlLCBwcmVmZXIgY2FsbGluZyBgU2xpY2UucHJlbG9hZEJpdHMoKWAgb3ZlciB1c2luZyB0aGlzIGZ1bmN0aW9uIHNpbmNlIHRoZSBmb3Jt" +
+    "ZXIgaXMgbW9yZSBvcHRpbWl6ZWQuCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdIOKAlCBU" +
+    "aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHNwZWNpZnkgYW4gb3V0LW9mLWJvdW5kcyBgbGVuYCB2YWx1ZS4KLy8vICogOTogW0NlbGwgdW5kZXJmbG93XSDigJQgVGhy" +
+    "b3duIHdoZW4gYXR0ZW1wdGluZyB0byBwcmVsb2FkIG1vcmUgZGF0YSB0aGFuIGBTbGljZWAgY29udGFpbnMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3Mu" +
+    "dGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWZpcnN0Yml0cwovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGlj" +
+    "ZXByZWxvYWRiaXRzCi8vLwovLy8gW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVz" +
+    "IzUKLy8vIFtDZWxsIHVuZGVyZmxvd106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM5Ci8vLwphc20gZXh0ZW5kcyBmdW4gZmlyc3RC" +
+    "aXRzKHNlbGY6IFNsaWNlLCBsZW46IEludCk6IFNsaWNlIHsgU0RDVVRGSVJTVCB9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLiBB" +
+    "dmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBQcmVsb2FkcyB0aGUgbGFzdCBgMCDiiaQgbGVuIOKJpCAxMDIzYCBiaXRzIGZyb20gdGhlIGBTbGljZWAu" +
+    "Ci8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVJbnQoNDIsIDcpLmFzU2xpY2Uo" +
+    "KTsKLy8vICAgICBsZXQgbGFzdEZpdmU6IFNsaWNlID0gcy5sYXN0Qml0cyg1KTsgLy8gbGFzdCA1IGJpdHMKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBj" +
+    "b2RlcwovLy8KLy8vICogNTogW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdlXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzcGVjaWZ5IGFuIG91dC1v" +
+    "Zi1ib3VuZHMgYGxlbmAgdmFsdWUuCi8vLyAqIDk6IFtDZWxsIHVuZGVyZmxvd10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcHJlbG9hZCBtb3JlIGRhdGEg" +
+    "dGhhbiBgU2xpY2VgIGNvbnRhaW5zLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2VsYXN0Yml0" +
+    "cwovLy8KLy8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbQ2Vs" +
+    "bCB1bmRlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8KYXNtIGV4dGVuZHMgZnVuIGxhc3RCaXRzKHNlbGY6IFNs" +
+    "aWNlLCBsZW46IEludCk6IFNsaWNlIHsgU0RDVVRMQVNUIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgU2xpY2VgIHR5cGUuIEF2YWlsYWJsZSBzaW5j" +
+    "ZSBUYWN0IDEuNi4wLgovLy8KLy8vIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBgSW50YCBkZXB0aCBvZiB0aGUgYFNsaWNlYC4gUHJvZHVjZXMgMCBpZgovLy8gdGhl" +
+    "IGBTbGljZWAgaGFzIG5vIHJlZmVyZW5jZXMsIG90aGVyd2lzZSAxIHBsdXMgdGhlIG1heGltdW0gb2YgdGhlIGRlcHRocyBvZiB0aGUgcmVmZXJlbmNlZCBjZWxscy4K" +
+    "Ly8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGljZSgp" +
+    "OwovLy8gICAgIGxldCBkZXB0aDogSW50ID0gcy5kZXB0aCgpOyAvLyAwCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" +
+    "L3JlZi9jb3JlLWNlbGxzI3NsaWNlZGVwdGgKLy8vCmFzbSBleHRlbmRzIGZ1biBkZXB0aChzZWxmOiBTbGljZSk6IEludCB7IFNERVBUSCB9CgovLwovLyBTbGljZSBz" +
+    "aXplCi8vCgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzIGlu" +
+    "IHRoZSBgU2xpY2VgIGFzIGFuIGBJbnRgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgp" +
+    "LnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMucmVmcygpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBo" +
+    "dHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZXJlZnMKLy8vCmFzbSBleHRlbmRzIGZ1biByZWZzKHNlbGY6IFNsaWNlKTogSW50IHsg" +
+    "U1JFRlMgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIGlu" +
+    "IHRoZSBgU2xpY2VgIGFzIGFuIGBJbnRgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgp" +
+    "LnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEludCA9IHMuYml0cygpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBo" +
+    "dHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWJpdHMKLy8vCmFzbSBleHRlbmRzIGZ1biBiaXRzKHNlbGY6IFNsaWNlKTogSW50IHsg" +
+    "U0JJVFMgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNsaWNlYCBpcyBlbXB0" +
+    "eSAoaS5lLiwgY29udGFpbnMgbm8gYml0cyBvZiBkYXRhIGFuZCBubyBjZWxsIHJlZmVyZW5jZXMpLgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgZW1wdHksIGBm" +
+    "YWxzZWAgb3RoZXJ3aXNlLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBzOiBTbGljZSA9IGJlZ2luQ2VsbCgpLnN0b3JlUmVm" +
+    "KGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IEJvb2wgPSBzLmVtcHR5KCk7ICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UKLy8vICAg" +
+    "ICBsZXQgYnV6ejogQm9vbCA9IGJlZ2luQ2VsbCgpLmFzU2xpY2UoKS5lbXB0eSgpOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9j" +
+    "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlZW1wdHkKLy8vCmFzbSBleHRlbmRzIGZ1biBlbXB0eShzZWxmOiBTbGljZSk6IEJvb2wgeyBTRU1QVFkg" +
+    "fQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNsaWNlYCBoYXMgbm8gYml0cyBv" +
+    "ZiBkYXRhLgovLy8gUmV0dXJucyBgdHJ1ZWAgaWYgaXQgaGFzIG5vIGRhdGEsIGBmYWxzZWAgb3RoZXJ3aXNlLgovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7" +
+    "Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxsKCkuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmFzU2xpY2UoKTsKLy8vICAgICBsZXQgZml6ejogQm9vbCA9IHMu" +
+    "ZGF0YUVtcHR5KCk7ICAvLyB0cnVlCi8vLwovLy8gICAgIGxldCBzMjogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZUludCg0MiwgNykuYXNTbGljZSgpOwovLy8gICAg" +
+    "IGxldCBidXp6OiBCb29sID0gczIuZGF0YUVtcHR5KCk7IC8vIGZhbHNlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" +
+    "L3JlZi9jb3JlLWNlbGxzI3NsaWNlZGF0YWVtcHR5Ci8vLwphc20gZXh0ZW5kcyBmdW4gZGF0YUVtcHR5KHNlbGY6IFNsaWNlKTogQm9vbCB7IFNERU1QVFkgfQoKLy8v" +
+    "IEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4KLy8vCi8vLyBDaGVja3Mgd2hldGhlciB0aGUgYFNsaWNlYCBoYXMgbm8gcmVmZXJlbmNlcy4K" +
+    "Ly8vIFJldHVybnMgYHRydWVgIGlmIGl0IGhhcyBubyByZWZlcmVuY2VzLCBgZmFsc2VgIG90aGVyd2lzZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgp" +
+    "IHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBiZWdpbkNlbGwoKS5zdG9yZVJlZihlbXB0eUNlbGwoKSkuYXNTbGljZSgpOwovLy8gICAgIGxldCBmaXp6OiBCb29sID0g" +
+    "cy5yZWZzRW1wdHkoKTsgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZQovLy8gICAgIGxldCBidXp6OiBCb29sID0gYmVnaW5DZWxsKCkuYXNTbGljZSgpLnJlZnNF" +
+    "bXB0eSgpOyAvLyB0cnVlCi8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI3NsaWNlcmVmc2Vt" +
+    "cHR5Ci8vLwphc20gZXh0ZW5kcyBmdW4gcmVmc0VtcHR5KHNlbGY6IFNsaWNlKTogQm9vbCB7IFNSRU1QVFkgfQoKLy8KLy8gQ29udmVyc2lvbnMKLy8KCi8vLyBFeHRl" +
+    "bnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQnVpbGRlcmAgdHlwZS4KLy8vCi8vLyBDb252ZXJ0cyB0aGUgYEJ1aWxkZXJgIGludG8gYSBgU2xpY2VgIGFuZCByZXR1cm5z" +
+    "IGl0LgovLy8gQW4gYWxpYXMgdG8gYHNlbGYuZW5kQ2VsbCgpLmJlZ2luUGFyc2UoKWAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAg" +
+    "bGV0IGI6IEJ1aWxkZXIgPSBiZWdpbkNlbGwoKTsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBiLmFzU2xpY2UoKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTog" +
+    "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjYnVpbGRlcmFzc2xpY2UKLy8vCmlubGluZSBleHRlbmRzIGZ1biBhc1NsaWNlKHNlbGY6IEJ1" +
+    "aWxkZXIpOiBTbGljZSB7CiAgICByZXR1cm4gc2VsZi5lbmRDZWxsKCkuYmVnaW5QYXJzZSgpOwp9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYENlbGxg" +
+    "IHR5cGUuCi8vLwovLy8gQ29udmVydHMgdGhlIGBDZWxsYCB0byBhIGBTbGljZWAgYW5kIHJldHVybnMgaXQuCi8vLyBBbiBhbGlhcyB0byBgc2VsZi5iZWdpblBhcnNl" +
+    "KClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBjOiBDZWxsID0gZW1wdHlDZWxsKCk7Ci8vLyAgICAgbGV0IGZpeno6IFNs" +
+    "aWNlID0gYy5hc1NsaWNlKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxhc3Ns" +
+    "aWNlCi8vLwppbmxpbmUgZXh0ZW5kcyBmdW4gYXNTbGljZShzZWxmOiBDZWxsKTogU2xpY2UgewogICAgcmV0dXJuIHNlbGYuYmVnaW5QYXJzZSgpOwp9CgovLy8gRXh0" +
+    "ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNsaWNlYCB0eXBlLgovLy8KLy8vIENvbnZlcnRzIHRoZSBgU2xpY2VgIHRvIGEgYENlbGxgIGFuZCByZXR1cm5zIGl0Lgov" +
+    "Ly8gQW4gYWxpYXMgdG8gYGJlZ2luQ2VsbCgpLnN0b3JlU2xpY2Uoc2VsZikuZW5kQ2VsbCgpYC4KLy8vCi8vLyBOT1RFOiAqKkdhcyBleHBlbnNpdmUhKiogVGhpcyBm" +
+    "dW5jdGlvbiB1c2VzIDUwMCBnYXMgdW5pdHMgb3IgbW9yZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgczogU2xpY2UgPSBi" +
+    "ZWdpbkNlbGwoKS5hc1NsaWNlKCk7Ci8vLyAgICAgbGV0IGZpeno6IENlbGwgPSBzLmFzQ2VsbCgpOwovLy8gICAgIGxldCBidXp6OiBDZWxsID0gYmVnaW5DZWxsKCku" +
+    "c3RvcmVTbGljZShzKS5lbmRDZWxsKCk7Ci8vLwovLy8gICAgIGZpenogPT0gYnV6ejsgLy8gdHJ1ZQovLy8gfQovLy8gYGBgCi8vLwovLy8gU2VlOiBodHRwczovL2Rv" +
+    "Y3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNzbGljZWFzY2VsbAovLy8KaW5saW5lIGV4dGVuZHMgZnVuIGFzQ2VsbChzZWxmOiBTbGljZSk6IENlbGwgewog" +
+    "ICAgcmV0dXJuIGJlZ2luQ2VsbCgpCiAgICAgICAgLnN0b3JlU2xpY2Uoc2VsZikKICAgICAgICAuZW5kQ2VsbCgpOwp9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZv" +
+    "ciB0aGUgYEJ1aWxkZXJgIHR5cGUuCi8vLwovLy8gQ29udmVydHMgdGhlIGBCdWlsZGVyYCBpbnRvIGEgYENlbGxgIGFuZCByZXR1cm5zIGl0LgovLy8gQW4gYWxpYXMg" +
+    "dG8gYHNlbGYuZW5kQ2VsbCgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYjogQnVpbGRlciA9IGJlZ2luQ2VsbCgpOwov" +
+    "Ly8gICAgIGxldCBmaXp6OiBDZWxsID0gYi5hc0NlbGwoKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2Nv" +
+    "cmUtY2VsbHMjYnVpbGRlcmFzY2VsbAovLy8KaW5saW5lIGV4dGVuZHMgZnVuIGFzQ2VsbChzZWxmOiBCdWlsZGVyKTogQ2VsbCB7CiAgICByZXR1cm4gc2VsZi5lbmRD" +
+    "ZWxsKCk7Cn0KCi8vLyBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGVtcHR5IGBDZWxsYCAod2l0aG91dCBkYXRhIGFuZCByZWZlcmVuY2VzKS4KLy8vIEFuIGFsaWFzIHRv" +
+    "IGBiZWdpbkNlbGwoKS5lbmRDZWxsKClgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGxldCBmaXp6OiBDZWxsID0gZW1wdHlDZWxs" +
+    "KCk7Ci8vLyAgICAgbGV0IGJ1eno6IENlbGwgPSBiZWdpbkNlbGwoKS5lbmRDZWxsKCk7Ci8vLwovLy8gICAgIGZpenogPT0gYnV6ejsgLy8gdHJ1ZQovLy8gfQovLy8g" +
+    "YGBgCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jZWxscyNlbXB0eWNlbGwKLy8vCmFzbSBmdW4gZW1wdHlDZWxsKCk6IENl" +
+    "bGwgewogICAgPGIgYj4gUFVTSFJFRiAvLyBQdXJlIEZpZnQ6ICI8YiIgY3JlYXRlcyBhIGJ1aWxkZXIsICJiPiIgdHVybnMgaXQgaW50byBhIGNlbGwgYXQgY29tcGls" +
+    "ZSB0aW1lCn0KCi8vLyBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGVtcHR5IGBTbGljZWAgKHdpdGhvdXQgZGF0YSBhbmQgcmVmZXJlbmNlcykuCi8vLyBBbiBhbGlhcyB0" +
+    "byBgZW1wdHlDZWxsKCkuYXNTbGljZSgpYC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgZml6ejogU2xpY2UgPSBlbXB0eVNs" +
+    "aWNlKCk7Ci8vLyAgICAgbGV0IGJ1eno6IFNsaWNlID0gZW1wdHlDZWxsKCkuYXNTbGljZSgpOwovLy8KLy8vICAgICBmaXp6ID09IGJ1eno7IC8vIHRydWUKLy8vIH0K" +
+    "Ly8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjZW1wdHlzbGljZQovLy8KYXNtIGZ1biBlbXB0eVNsaWNl" +
+    "KCk6IFNsaWNlIHsKICAgIGJ7fSBQVVNIU0xJQ0UKfQoKLy8vIFN0cnVjdCBmb3IgaG9sZGluZyB2YWx1ZXMgY29tcHV0ZWQgYnkgdGhlIGBDZWxsLmNvbXB1dGVEYXRh" +
+    "U2l6ZSgpYCBhbmQgYFNsaWNlLmNvbXB1dGVEYXRhU2l6ZSgpYCBleHRlbnNpb24gZnVuY3Rpb25zLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBT" +
+    "ZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNlbGxzI2NlbGxjb21wdXRlZGF0YXNpemUKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3Qt" +
+    "bGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vjb21wdXRlZGF0YXNpemUKLy8vCnN0cnVjdCBEYXRhU2l6ZSB7CiAgICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiBu" +
+    "ZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lLgogICAgY2VsbHM6IEludDsKCiAgICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiBiaXRzIGluIGFs" +
+    "bCBuZXN0ZWQgY2VsbHMsIGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lLgogICAgYml0czogSW50OwoKICAgIC8vLyBUaGUgdG90YWwgbnVtYmVyIG9mIHJlZnMgaW4g" +
+    "YWxsIG5lc3RlZCBjZWxscywgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUuCiAgICByZWZzOiBJbnQ7Cn0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBg" +
+    "Q2VsbGAgdHlwZS4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBkaXN0aW5jdCBjZWxs" +
+    "cywgYml0cyBhbmQgcmVmcyBpbiB0aGUgYENlbGxgIGJ5IHVzaW5nIGEgZGVwdGgtZmlyc3Qgc2VhcmNoIChERlMpIGFsZ29yaXRobSwgcmVjdXJzaXZlbHkgdHJhdmVy" +
+    "c2luZyBlYWNoIHJlZmVyZW5jZWQgY2VsbC4gVGhpcyBmdW5jdGlvbiBpcyBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlIGFuZCBjYW4gY29uc3VtZSBhIGxvdCBvZiBn" +
+    "YXMuIElmIGBzZWxmYCBpcyBgbnVsbGAsIHJldHVybnMgYERhdGFTaXplYCB3aXRoIGFsbCBmaWVsZHMgc2V0IHRvIDAuCi8vLwovLy8gVGhlIHJlc3VsdHMgYXJlIHBh" +
+    "Y2tlZCBpbnRvIGEgYERhdGFTaXplYCBTdHJ1Y3QgY29uc2lzdGluZyBvZjoKLy8vICogYGNlbGxzOiBJbnRgLCB0aGUgdG90YWwgbnVtYmVyIG9mIG5lc3RlZCBjZWxs" +
+    "cywgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUKLy8vICogYGJpdHM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0cyBpbiBhbGwgbmVzdGVkIGNlbGxzLCBp" +
+    "bmNsdWRpbmcgdGhlIHN0YXJ0aW5nIG9uZQovLy8gKiBgcmVmczogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiByZWZzIGluIGFsbCBuZXN0ZWQgY2VsbHMsIGluY2x1" +
+    "ZGluZyB0aGUgc3RhcnRpbmcgb25lCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IGM6IENlbGwgPSBiZWdpbkNlbGwoKS5zdG9y" +
+    "ZUludCg0MiwgNykuc3RvcmVSZWYoZW1wdHlDZWxsKCkpLmVuZENlbGwoKTsKLy8vICAgICB0cnkgewovLy8gICAgICAgICBsZXQgZGF0YVNpemU6IERhdGFTaXplID0g" +
+    "Yy5jb21wdXRlRGF0YVNpemUoMik7Ci8vLyAgICAgICAgIGRhdGFTaXplLmNlbGxzOyAvLyAyCi8vLyAgICAgICAgIGRhdGFTaXplLmJpdHM7ICAvLyA3Ci8vLyAgICAg" +
+    "ICAgIGRhdGFTaXplLnJlZnM7ICAvLyAxCi8vLyAgICAgfSBjYXRjaCAoZXhpdENvZGUpIHsKLy8vICAgICAgICAgLy8gaWYgbWF4Q2VsbHMgd2FzIGluc3VmZmljaWVu" +
+    "dCB0byB0cmF2ZXJzZSB0aGUgY2VsbAovLy8gICAgICAgICAvLyBhbmQgYWxsIG9mIGl0cyByZWZlcmVuY2VzLCB0aGUgZXhpdENvZGUgaGVyZSB3b3VsZCBiZSA4Ci8v" +
+    "LyAgICAgfQovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdIOKAlCBU" +
+    "aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHNwZWNpZnkgYSBuZWdhdGl2ZSB2YWx1ZSBvZiBgbWF4Q2VsbHNgLgovLy8gKiA4OiBbQ2VsbCBvdmVyZmxvd10g4oCUIFRo" +
+    "cm93biB3aGVuIHRoZSBzcGVjaWZpZWQgYG1heENlbGxzYCB2YWx1ZSBpc24ndCBlbm91Z2ggdG8gdHJhdmVyc2UgYWxsIGNlbGxzIGluY2x1ZGluZyB0aGUgc3RhcnRp" +
+    "bmcgb25lLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjY2VsbGNvbXB1dGVkYXRhc2l6ZQovLy8KLy8vIFtJbnRl" +
+    "Z2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1Ci8vLyBbQ2VsbCBvdmVyZmxvd106IGh0" +
+    "dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM4Ci8vLwphc20gZXh0ZW5kcyBmdW4gY29tcHV0ZURhdGFTaXplKHNlbGY6IENlbGw/LCBtYXhD" +
+    "ZWxsczogSW50KTogRGF0YVNpemUgeyBDREFUQVNJWkUgfQoKLy8vIEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBTbGljZWAgdHlwZS4gQXZhaWxhYmxlIHNpbmNl" +
+    "IFRhY3QgMS42LjAuCi8vLwovLy8gU2ltaWxhciB0byBgQ2VsbC5jb21wdXRlRGF0YVNpemUoKWAsIGJ1dCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRoZSBjZWxs" +
+    "IHRoYXQgY29udGFpbnMgdGhlIGBTbGljZWAgaXRzZWxmLiBIb3dldmVyLCBhY2NvdW50cyBmb3IgaXRzIGJpdHMgYW5kIHJlZnMuCi8vLwovLy8gVGhlIHJlc3VsdHMg" +
+    "YXJlIHBhY2tlZCBpbnRvIGEgYERhdGFTaXplYCBTdHJ1Y3QgY29uc2lzdGluZyBvZjoKLy8vICogYGNlbGxzOiBJbnRgLCB0aGUgdG90YWwgbnVtYmVyIG9mIG5lc3Rl" +
+    "ZCBjZWxscywgaW5jbHVkaW5nIHRoZSBzdGFydGluZyBvbmUKLy8vICogYGJpdHM6IEludGAsIHRoZSB0b3RhbCBudW1iZXIgb2YgYml0cyBpbiBhbGwgbmVzdGVkIGNl" +
+    "bGxzLCBpbmNsdWRpbmcgdGhlIHN0YXJ0aW5nIG9uZQovLy8gKiBgcmVmczogSW50YCwgdGhlIHRvdGFsIG51bWJlciBvZiByZWZzIGluIGFsbCBuZXN0ZWQgY2VsbHMs" +
+    "IGluY2x1ZGluZyB0aGUgc3RhcnRpbmcgb25lCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgbGV0IHM6IFNsaWNlID0gYmVnaW5DZWxs" +
+    "KCkuc3RvcmVJbnQoNDIsIDcpLnN0b3JlUmVmKGVtcHR5Q2VsbCgpKS5hc1NsaWNlKCk7Ci8vLyAgICAgdHJ5IHsKLy8vICAgICAgICAgbGV0IGRhdGFTaXplOiBEYXRh" +
+    "U2l6ZSA9IHMuY29tcHV0ZURhdGFTaXplKDEpOwovLy8gICAgICAgICBkYXRhU2l6ZS5jZWxsczsgLy8gMQovLy8gICAgICAgICBkYXRhU2l6ZS5iaXRzOyAgLy8gNwov" +
+    "Ly8gICAgICAgICBkYXRhU2l6ZS5yZWZzOyAgLy8gMQovLy8gICAgIH0gY2F0Y2ggKGV4aXRDb2RlKSB7Ci8vLyAgICAgICAgIC8vIGlmIG1heENlbGxzIHdhcyBpbnN1" +
+    "ZmZpY2llbnQgdG8gdHJhdmVyc2UgdGhlIGNlbGwKLy8vICAgICAgICAgLy8gYW5kIGFsbCBvZiBpdHMgcmVmZXJlbmNlcywgdGhlIGV4aXRDb2RlIGhlcmUgd291bGQg" +
+    "YmUgOAovLy8gICAgIH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogNTogW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdl" +
+    "XSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzcGVjaWZ5IGEgbmVnYXRpdmUgdmFsdWUgb2YgYG1heENlbGxzYC4KLy8vICogODogW0NlbGwgb3ZlcmZsb3dd" +
+    "IOKAlCBUaHJvd24gd2hlbiB0aGUgc3BlY2lmaWVkIGBtYXhDZWxsc2AgdmFsdWUgaXNuJ3QgZW5vdWdoIHRvIHRyYXZlcnNlIGFsbCBjZWxscyAqKm5vdCoqIGluY2x1" +
+    "ZGluZyB0aGUgc3RhcnRpbmcgb25lLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjc2xpY2Vjb21wdXRlZGF0YXNp" +
+    "emUKLy8vCi8vLyBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW0Nl" +
+    "bGwgb3ZlcmZsb3ddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOAovLy8KYXNtIGV4dGVuZHMgZnVuIGNvbXB1dGVEYXRhU2l6ZShz" +
+    "ZWxmOiBTbGljZSwgbWF4Q2VsbHM6IEludCk6IERhdGFTaXplIHsgU0RBVEFTSVpFIH0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgQ2VsbGAgdHlwZS4g" +
+    "QXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIGBJbnRgIGRlcHRoIG9mIHRoZSBgQ2VsbGAuIFByb2R1Y2Vz" +
+    "IDAgaWYgdGhlIGBDZWxsYCBoYXMgbm8gcmVmZXJlbmNlcywgb3RoZXJ3aXNlIDEgcGx1cyB0aGUgbWF4aW11bSBvZiB0aGUgZGVwdGhzIG9mIHRoZSByZWZlcmVuY2Vk" +
+    "IGNlbGxzLiBJZiBjIGlzIG51bGwsIHJldHVybnMgemVyby4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBsZXQgYzogQ2VsbCA9IGJl" +
+    "Z2luQ2VsbCgpLnN0b3JlSW50KDQyLCA3KS5lbmRDZWxsKCk7Ci8vLyAgICAgbGV0IGRlcHRoOiBJbnQgPSBjLmRlcHRoKCk7IC8vIDAKLy8vIH0KLy8vIGBgYAovLy8K" +
+    "Ly8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY2VsbHMjY2VsbGRlcHRoCi8vLwphc20gZXh0ZW5kcyBmdW4gZGVwdGgoc2VsZjogQ2Vs" +
+    "bD8pOiBJbnQgeyBDREVQVEggfQo=";
 files["std/internal/config.tact"] =
     "Ly8vIExvYWRzIGEgW2NvbmZpZ3VyYXRpb24gcGFyYW1ldGVyXSBvZiBUT04gQmxvY2tjaGFpbiBieSBpdHMgYGlkYCBudW1iZXIuCi8vLwovLy8gU2VlOiBodHRwczov" +
     "L2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1jb250ZXh0c3RhdGUjZ2V0Y29uZmlncGFyYW0KLy8vCi8vLyBbY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJdOiBodHRw" +
@@ -2464,23 +2459,23 @@ files["std/stdlib.fc"] =
     "OwoKOzs7IENoZWNrcyB3aGV0aGVyIHRoZSBkYXRhIHBhcnRzIG9mIHR3byBzbGljZXMgY29pbnNpZGUKaW50IGVxdWFsX3NsaWNlc19iaXRzKHNsaWNlIGEsIHNsaWNl" +
     "IGIpIGFzbSAiU0RFUSI7Cjs7OyBDaGVja3Mgd2hldGhlciBiIGlzIGEgbnVsbC4gTm90ZSwgdGhhdCBGdW5DIGFsc28gaGFzIHBvbHltb3JwaGljIG51bGw/IGJ1aWx0" +
     "LWluLgppbnQgYnVpbGRlcl9udWxsPyhidWlsZGVyIGIpIGFzbSAiSVNOVUxMIjsKOzs7IENvbmNhdGVuYXRlcyB0d28gYnVpbGRlcnMKYnVpbGRlciBzdG9yZV9idWls" +
-    "ZGVyKGJ1aWxkZXIgdG8sIGJ1aWxkZXIgZnJvbSkgYXNtICJTVEJSIjsKCjs7IENVU1RPTToKCjs7IFRWTSBVUEdSQURFIDIwMjMtMDcgaHR0cHM6Ly9kb2NzLnRvbi5v" +
-    "cmcvbGVhcm4vdHZtLWluc3RydWN0aW9ucy90dm0tdXBncmFkZS0yMDIzLTA3Cjs7IEluIG1haW5uZXQgc2luY2UgMjAgRGVjIDIwMjMgaHR0cHM6Ly90Lm1lL3RvbmJs" +
-    "b2NrY2hhaW4vMjI2Cgo7OzsgUmV0cmlldmVzIGNvZGUgb2Ygc21hcnQtY29udHJhY3QgZnJvbSBjNwpjZWxsIG15X2NvZGUoKSBhc20gIk1ZQ09ERSI7Cgo7OzsgQ3Jl" +
-    "YXRlcyBhbiBvdXRwdXQgYWN0aW9uIGFuZCByZXR1cm5zIGEgZmVlIGZvciBjcmVhdGluZyBhIG1lc3NhZ2UuIE1vZGUgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBpbiB0" +
-    "aGUgY2FzZSBvZiBTRU5EUkFXTVNHCmludCBzZW5kX21lc3NhZ2UoY2VsbCBtc2csIGludCBtb2RlKSBpbXB1cmUgYXNtICJTRU5ETVNHIjsKCmludCBnYXNfY29uc3Vt" +
-    "ZWQoKSBhc20gIkdBU0NPTlNVTUVEIjsKCjs7IFRWTSBWNiBodHRwczovL2dpdGh1Yi5jb20vdG9uLWJsb2NrY2hhaW4vdG9uL2Jsb2IvdGVzdG5ldC9kb2MvR2xvYmFs" +
-    "VmVyc2lvbnMubWQjdmVyc2lvbi02CgppbnQgZ2V0X2NvbXB1dGVfZmVlKGludCB3b3JrY2hhaW4sIGludCBnYXNfdXNlZCkgYXNtKGdhc191c2VkIHdvcmtjaGFpbikg" +
-    "IkdFVEdBU0ZFRSI7CmludCBnZXRfc3RvcmFnZV9mZWUoaW50IHdvcmtjaGFpbiwgaW50IHNlY29uZHMsIGludCBiaXRzLCBpbnQgY2VsbHMpIGFzbShjZWxscyBiaXRz" +
-    "IHNlY29uZHMgd29ya2NoYWluKSAiR0VUU1RPUkFHRUZFRSI7CmludCBnZXRfZm9yd2FyZF9mZWUoaW50IHdvcmtjaGFpbiwgaW50IGJpdHMsIGludCBjZWxscykgYXNt" +
-    "KGNlbGxzIGJpdHMgd29ya2NoYWluKSAiR0VURk9SV0FSREZFRSI7CmludCBnZXRfcHJlY29tcGlsZWRfZ2FzX2NvbnN1bXB0aW9uKCkgYXNtICJHRVRQUkVDT01QSUxF" +
-    "REdBUyI7CgppbnQgZ2V0X3NpbXBsZV9jb21wdXRlX2ZlZShpbnQgd29ya2NoYWluLCBpbnQgZ2FzX3VzZWQpIGFzbShnYXNfdXNlZCB3b3JrY2hhaW4pICJHRVRHQVNG" +
-    "RUVTSU1QTEUiOwppbnQgZ2V0X3NpbXBsZV9mb3J3YXJkX2ZlZShpbnQgd29ya2NoYWluLCBpbnQgYml0cywgaW50IGNlbGxzKSBhc20oY2VsbHMgYml0cyB3b3JrY2hh" +
-    "aW4pICJHRVRGT1JXQVJERkVFU0lNUExFIjsKaW50IGdldF9vcmlnaW5hbF9md2RfZmVlKGludCB3b3JrY2hhaW4sIGludCBmd2RfZmVlKSBhc20oZndkX2ZlZSB3b3Jr" +
-    "Y2hhaW4pICJHRVRPUklHSU5BTEZXREZFRSI7CmludCBteV9zdG9yYWdlX2R1ZSgpIGFzbSAiRFVFUEFZTUVOVCI7Cgp0dXBsZSBnZXRfZmVlX2NvbmZpZ3MoKSBhc20g" +
-    "IlVOUEFDS0VEQ09ORklHVFVQTEUiOwoKOzs7IFF1aWV0IHZlcnNpb25zIG9mIH5sb2FkX3VpbnQuIFJldHVybnMgKG51bGwsIDApIGlmIGxvYWQgaGFzIGZhaWxlZCBh" +
-    "bmQgKHgsIC0xKSBvbiBzdWNjZXNzCihzbGljZSwgKGludCwgaW50KSkgfmxvYWRfdWludF9xdWlldChzbGljZSBzLCBpbnQgbGVuKSBhc20oIC0+IDEgMCAyKSAiTERV" +
-    "WFEgTlVMTFJPVFJJRk5PVCI7";
+    "ZGVyKGJ1aWxkZXIgdG8sIGJ1aWxkZXIgZnJvbSkgYXNtICJTVEJSIjsKYnVpbGRlciBzdG9yZV9idWlsZGVyX3JlZihidWlsZGVyIHRvLCBidWlsZGVyIGZyb20pIGFz" +
+    "bSAiU1RCUkVGUiI7Cgo7OyBDVVNUT006Cgo7OyBUVk0gVVBHUkFERSAyMDIzLTA3IGh0dHBzOi8vZG9jcy50b24ub3JnL2xlYXJuL3R2bS1pbnN0cnVjdGlvbnMvdHZt" +
+    "LXVwZ3JhZGUtMjAyMy0wNwo7OyBJbiBtYWlubmV0IHNpbmNlIDIwIERlYyAyMDIzIGh0dHBzOi8vdC5tZS90b25ibG9ja2NoYWluLzIyNgoKOzs7IFJldHJpZXZlcyBj" +
+    "b2RlIG9mIHNtYXJ0LWNvbnRyYWN0IGZyb20gYzcKY2VsbCBteV9jb2RlKCkgYXNtICJNWUNPREUiOwoKOzs7IENyZWF0ZXMgYW4gb3V0cHV0IGFjdGlvbiBhbmQgcmV0" +
+    "dXJucyBhIGZlZSBmb3IgY3JlYXRpbmcgYSBtZXNzYWdlLiBNb2RlIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgaW4gdGhlIGNhc2Ugb2YgU0VORFJBV01TRwppbnQgc2Vu" +
+    "ZF9tZXNzYWdlKGNlbGwgbXNnLCBpbnQgbW9kZSkgaW1wdXJlIGFzbSAiU0VORE1TRyI7CgppbnQgZ2FzX2NvbnN1bWVkKCkgYXNtICJHQVNDT05TVU1FRCI7Cgo7OyBU" +
+    "Vk0gVjYgaHR0cHM6Ly9naXRodWIuY29tL3Rvbi1ibG9ja2NoYWluL3Rvbi9ibG9iL3Rlc3RuZXQvZG9jL0dsb2JhbFZlcnNpb25zLm1kI3ZlcnNpb24tNgoKaW50IGdl" +
+    "dF9jb21wdXRlX2ZlZShpbnQgd29ya2NoYWluLCBpbnQgZ2FzX3VzZWQpIGFzbShnYXNfdXNlZCB3b3JrY2hhaW4pICJHRVRHQVNGRUUiOwppbnQgZ2V0X3N0b3JhZ2Vf" +
+    "ZmVlKGludCB3b3JrY2hhaW4sIGludCBzZWNvbmRzLCBpbnQgYml0cywgaW50IGNlbGxzKSBhc20oY2VsbHMgYml0cyBzZWNvbmRzIHdvcmtjaGFpbikgIkdFVFNUT1JB" +
+    "R0VGRUUiOwppbnQgZ2V0X2ZvcndhcmRfZmVlKGludCB3b3JrY2hhaW4sIGludCBiaXRzLCBpbnQgY2VsbHMpIGFzbShjZWxscyBiaXRzIHdvcmtjaGFpbikgIkdFVEZP" +
+    "UldBUkRGRUUiOwppbnQgZ2V0X3ByZWNvbXBpbGVkX2dhc19jb25zdW1wdGlvbigpIGFzbSAiR0VUUFJFQ09NUElMRURHQVMiOwoKaW50IGdldF9zaW1wbGVfY29tcHV0" +
+    "ZV9mZWUoaW50IHdvcmtjaGFpbiwgaW50IGdhc191c2VkKSBhc20oZ2FzX3VzZWQgd29ya2NoYWluKSAiR0VUR0FTRkVFU0lNUExFIjsKaW50IGdldF9zaW1wbGVfZm9y" +
+    "d2FyZF9mZWUoaW50IHdvcmtjaGFpbiwgaW50IGJpdHMsIGludCBjZWxscykgYXNtKGNlbGxzIGJpdHMgd29ya2NoYWluKSAiR0VURk9SV0FSREZFRVNJTVBMRSI7Cmlu" +
+    "dCBnZXRfb3JpZ2luYWxfZndkX2ZlZShpbnQgd29ya2NoYWluLCBpbnQgZndkX2ZlZSkgYXNtKGZ3ZF9mZWUgd29ya2NoYWluKSAiR0VUT1JJR0lOQUxGV0RGRUUiOwpp" +
+    "bnQgbXlfc3RvcmFnZV9kdWUoKSBhc20gIkRVRVBBWU1FTlQiOwoKdHVwbGUgZ2V0X2ZlZV9jb25maWdzKCkgYXNtICJVTlBBQ0tFRENPTkZJR1RVUExFIjsKCjs7OyBR" +
+    "dWlldCB2ZXJzaW9ucyBvZiB+bG9hZF91aW50LiBSZXR1cm5zIChudWxsLCAwKSBpZiBsb2FkIGhhcyBmYWlsZWQgYW5kICh4LCAtMSkgb24gc3VjY2Vzcwooc2xpY2Us" +
+    "IChpbnQsIGludCkpIH5sb2FkX3VpbnRfcXVpZXQoc2xpY2UgcywgaW50IGxlbikgYXNtKCAtPiAxIDAgMikgIkxEVVhRIE5VTExST1RSSUZOT1QiOwo=";
 files["std/stdlib.tact"] =
     "aW1wb3J0ICIuL2ludGVybmFsL2V4aXQtY29kZXMiOwppbXBvcnQgIi4vaW50ZXJuYWwvcHJpbWl0aXZlcyI7CmltcG9ydCAiLi9pbnRlcm5hbC9jZWxscyI7CmltcG9y" +
     "dCAiLi9pbnRlcm5hbC9jcnlwdG8iOwppbXBvcnQgIi4vaW50ZXJuYWwvdGV4dCI7CmltcG9ydCAiLi9pbnRlcm5hbC9tYXRoIjsKaW1wb3J0ICIuL2ludGVybmFsL2Nv" +
diff --git a/src/stdlib/stdlib/std/internal/address.tact b/src/stdlib/stdlib/std/internal/address.tact
index f2b796e8..422ed8e7 100644
--- a/src/stdlib/stdlib/std/internal/address.tact
+++ b/src/stdlib/stdlib/std/internal/address.tact
@@ -199,12 +199,10 @@ asm fun parseVarAddress(slice: Slice): VarAddress { REWRITEVARADDR }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to load an `Address` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to load more data than `Slice` contains.
 ///
 /// See: https://docs.tact-lang.org/ref/core-cells#sliceloadaddress
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm(-> 1 0) extends mutates fun loadAddress(self: Slice): Address { LDMSGADDR }
@@ -227,12 +225,10 @@ asm(-> 1 0) extends mutates fun loadAddress(self: Slice): Address { LDMSGADDR }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to skip an `Address` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to skip more data than `Slice` contains.
 ///
 /// See: https://docs.tact-lang.org/ref/core-cells#sliceskipaddress
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends mutates fun skipAddress(self: Slice) { LDMSGADDR NIP }
@@ -262,6 +258,8 @@ asm extends fun storeAddress(self: Builder, address: Address): Builder { STSLICE
 ///
 /// A basechain address (workchain 0) can be either empty (null hash) or contain a 256-bit hash value.
 ///
+/// See: https://docs.tact-lang.org/ref/core-addresses#basechainaddress
+///
 struct BasechainAddress {
     hash: Int?;
 }
@@ -279,6 +277,8 @@ struct BasechainAddress {
 /// }
 /// ```
 ///
+/// See: https://docs.tact-lang.org/ref/core-addresses#emptybasechainaddress
+///
 inline fun emptyBasechainAddress(): BasechainAddress {
     return BasechainAddress { hash: null };
 }
@@ -293,6 +293,8 @@ inline fun emptyBasechainAddress(): BasechainAddress {
 /// }
 /// ```
 ///
+/// See: https://docs.tact-lang.org/ref/core-addresses#newbasechainaddress
+///
 inline fun newBasechainAddress(hash: Int): BasechainAddress {
     return BasechainAddress { hash };
 }
@@ -310,6 +312,8 @@ inline fun newBasechainAddress(hash: Int): BasechainAddress {
 /// }
 /// ```
 ///
+/// See: https://docs.tact-lang.org/ref/core-addresses#contractbasechainaddress
+///
 inline fun contractBasechainAddress(s: StateInit): BasechainAddress {
     let hash = contractHash(s.code, s.data);
     return newBasechainAddress(hash);
@@ -319,8 +323,9 @@ inline fun contractBasechainAddress(s: StateInit): BasechainAddress {
 ///
 /// Stores the basechain address in the copy of the Builder and returns that copy.
 ///
-/// If the address has a `null` hash, stores 0b00 (`addr_none`). Otherwise, stores the full address
-/// with prefix 0b100 followed by workchain (0) and the 256-bit hash.
+/// If the address has a `null` hash, stores two zero bits `0b00` (`addr_none`). Otherwise,
+/// stores the full address with the three-bit prefix `0b100`,
+/// followed by the 8-bit workchain ID set to 0 and the 256-bit hash.
 ///
 /// ```tact
 /// fun example() {
@@ -330,6 +335,14 @@ inline fun contractBasechainAddress(s: StateInit): BasechainAddress {
 /// }
 /// ```
 ///
+/// #### Exit codes
+///
+/// * 8: [Cell overflow] — Thrown when attempting to store an `address` into the `Builder` when it cannot fit it.
+///
+/// See: https://docs.tact-lang.org/ref/core-cells#builderstorebasechainaddress
+///
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
+///
 extends fun storeBasechainAddress(self: Builder, address: BasechainAddress): Builder {
     if (address.hash == null) {
         return self.storeUint(0, 2); // 0b00
@@ -399,12 +412,12 @@ asm fun forceBasechain(address: Address) { REWRITESTDADDR DROP 138 THROWIF }
 /// }
 /// ```
 ///
-/// See: https://docs.tact-lang.org/ref/core-addresses#forceworkchain
-///
 /// #### Exit codes
 ///
 /// * `errorCode` — Thrown when the given `address` is not in the specified `workchain` (chain ID is not equal to `workchain`).
 ///
+/// See: https://docs.tact-lang.org/ref/core-addresses#forceworkchain
+///
 asm(errorCode workchain address) fun forceWorkchain(address: Address, workchain: Int, errorCode: Int) {
     REWRITESTDADDR
     DROP
diff --git a/src/stdlib/stdlib/std/internal/cells.tact b/src/stdlib/stdlib/std/internal/cells.tact
index 9ce665c2..ca31f77d 100644
--- a/src/stdlib/stdlib/std/internal/cells.tact
+++ b/src/stdlib/stdlib/std/internal/cells.tact
@@ -29,10 +29,12 @@ asm fun beginCell(): Builder { NEWC }
 /// #### Exit codes
 ///
 /// * 5: [Integer out of expected range] — Thrown when attempting to provide an insufficient or out-of-bounds `bits` number.
+/// * 8: [Cell overflow] — Thrown when attempting to store more data than the Builder can fit.
 ///
 /// See: https://docs.tact-lang.org/ref/core-cells#builderstoreint
 ///
 /// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 ///
 @name(store_int) // special treatment in Func compiler, so not replaced with asm "STIX"
 extends native storeInt(self: Builder, value: Int, bits: Int): Builder;
@@ -52,11 +54,12 @@ extends native storeInt(self: Builder, value: Int, bits: Int): Builder;
 /// #### Exit codes
 ///
 /// * 5: [Integer out of expected range] — Thrown when attempting to store a negative `value` or provide an insufficient or out-of-bounds `bits` number.
+/// * 8: [Cell overflow] — Thrown when attempting to store more data than the Builder can fit.
 ///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#builderstoreuint
+/// See: https://docs.tact-lang.org/ref/core-cells#builderstoreuint
 ///
 /// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 ///
 @name(store_uint) // special treatment in Func compiler, so not replaced with asm "STUX"
 extends native storeUint(self: Builder, value: Int, bits: Int): Builder;
@@ -75,8 +78,13 @@ extends native storeUint(self: Builder, value: Int, bits: Int): Builder;
 /// }
 /// ```
 ///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#builderstorebool
+/// #### Exit codes
+///
+/// * 8: [Cell overflow] — Thrown when attempting to store more data than the Builder can fit.
+///
+/// See: https://docs.tact-lang.org/ref/core-cells#builderstorebool
+///
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 ///
 asm(value self) extends fun storeBool(self: Builder, value: Bool): Builder { 1 STI }
 
@@ -92,13 +100,23 @@ asm(value self) extends fun storeBool(self: Builder, value: Bool): Builder { 1 S
 /// }
 /// ```
 ///
+/// #### Exit codes
+///
+/// * 8: [Cell overflow] — Thrown when attempting to store more data than the Builder can fit.
+///
 /// See: https://docs.tact-lang.org/ref/core-cells#builderstorebit
 ///
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
+///
 asm(value self) extends fun storeBit(self: Builder, value: Bool): Builder { 1 STI }
 
 /// Extension function for the `Builder` type.
 ///
-/// Stores (serializes) an unsigned `Int` `value` in the range from 0 to 2^120 − 1 inclusive into the copy of the `Builder`. The serialization of `value` consists of a 4-bit unsigned big-endian integer `l`, which is the smallest integer `l` ≥ 0, such that `value` < 2^(8 * `l`), followed by an 8 * `l`-bit unsigned big-endian representation of `value`. Returns that copy of the `Builder`.
+/// Stores (serializes) an unsigned `Int` `value` in the range from 0 to 2^120 − 1
+/// inclusive into the copy of the `Builder`. The serialization of `value` consists
+/// of a 4-bit unsigned big-endian integer `l`, which is the smallest integer `l` ≥ 0,
+/// such that `value` < 2^(8 * `l`), followed by an 8 * `l`-bit unsigned big-endian
+/// representation of `value`. Returns that copy of the `Builder`.
 ///
 /// This is the most common way of storing nanoToncoins.
 ///
@@ -112,10 +130,12 @@ asm(value self) extends fun storeBit(self: Builder, value: Bool): Builder { 1 ST
 /// #### Exit codes
 ///
 /// * 5: [Integer out of expected range] — Thrown when attempting to store an out-of-bounds `value`.
+/// * 8: [Cell overflow] — Thrown when attempting to store more data than the Builder can fit.
 ///
 /// See: https://docs.tact-lang.org/ref/core-cells#builderstorecoins
 ///
 /// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 ///
 asm extends fun storeCoins(self: Builder, value: Int): Builder { STVARUINT16 }
 
@@ -130,10 +150,18 @@ asm extends fun storeCoins(self: Builder, value: Int): Builder { STVARUINT16 }
 /// }
 /// ```
 ///
+/// #### Exit codes
+///
+/// * 5: [Integer out of expected range] — Thrown when attempting to store an out-of-bounds `value`.
+/// * 8: [Cell overflow] — Thrown when attempting to store more data than the Builder can fit.
+///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#builderstorevaruint16
 /// * https://docs.tact-lang.org/ref/core-cells#builderstorecoins
 ///
+/// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
+///
 asm extends fun storeVarUint16(self: Builder, value: Int): Builder { STVARUINT16 }
 
 /// Extension function for the `Builder` type. Available since Tact 1.6.0.
@@ -150,10 +178,12 @@ asm extends fun storeVarUint16(self: Builder, value: Int): Builder { STVARUINT16
 /// #### Exit codes
 ///
 /// * 5: [Integer out of expected range] — Thrown when attempting to store an out-of-bounds `value`.
+/// * 8: [Cell overflow] — Thrown when attempting to store more data than the Builder can fit.
 ///
 /// See: https://docs.tact-lang.org/ref/core-cells#builderstorevarint16
 ///
 /// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 ///
 asm extends fun storeVarInt16(self: Builder, value: Int): Builder { STVARINT16 }
 
@@ -171,10 +201,12 @@ asm extends fun storeVarInt16(self: Builder, value: Int): Builder { STVARINT16 }
 /// #### Exit codes
 ///
 /// * 5: [Integer out of expected range] — Thrown when attempting to store an out-of-bounds `value`.
+/// * 8: [Cell overflow] — Thrown when attempting to store more data than the Builder can fit.
 ///
 /// See: https://docs.tact-lang.org/ref/core-cells#builderstorevaruint32
 ///
 /// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 ///
 asm extends fun storeVarUint32(self: Builder, value: Int): Builder { STVARUINT32 }
 
@@ -192,10 +224,12 @@ asm extends fun storeVarUint32(self: Builder, value: Int): Builder { STVARUINT32
 /// #### Exit codes
 ///
 /// * 5: [Integer out of expected range] — Thrown when attempting to store an out-of-bounds `value`.
+/// * 8: [Cell overflow] — Thrown when attempting to store more data than the Builder can fit.
 ///
 /// See: https://docs.tact-lang.org/ref/core-cells#builderstorevarint32
 ///
 /// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 ///
 asm extends fun storeVarInt32(self: Builder, value: Int): Builder { STVARINT32 }
 
@@ -237,9 +271,15 @@ asm(cell self) extends fun storeRef(self: Builder, cell: Cell): Builder { STREF
 /// }
 /// ```
 ///
+/// #### Exit codes
+///
+/// * 8: [Cell overflow] — Thrown when attempting to store more data than the Builder can fit.
+///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#builderstoreslice
 ///
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
+///
 asm extends fun storeSlice(self: Builder, slice: Slice): Builder { STSLICER }
 
 /// Extension function for the `Builder` type. Available since Tact 1.5.0.
@@ -255,8 +295,14 @@ asm extends fun storeSlice(self: Builder, slice: Slice): Builder { STSLICER }
 /// }
 /// ```
 ///
+/// #### Exit codes
+///
+/// * 8: [Cell overflow] — Thrown when attempting to store more data than the Builder can fit.
+///
 /// See: https://docs.tact-lang.org/ref/core-cells#builderstorebuilder
 ///
+/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
+///
 asm extends fun storeBuilder(self: Builder, other: Builder): Builder { STBR }
 
 /// Extension function for the `Builder` type. Available since Tact 1.5.0.
@@ -299,8 +345,7 @@ asm(cell self) extends fun storeMaybeRef(self: Builder, cell: Cell?): Builder {
 /// }
 /// ```
 ///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#builderendcell
+/// See: https://docs.tact-lang.org/ref/core-cells#builderendcell
 ///
 asm extends fun endCell(self: Builder): Cell { ENDC }
 
@@ -315,8 +360,7 @@ asm extends fun endCell(self: Builder): Cell { ENDC }
 /// }
 /// ```
 ///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#builderrefs
+/// See: https://docs.tact-lang.org/ref/core-cells#builderrefs
 ///
 asm extends fun refs(self: Builder): Int { BREFS }
 
@@ -331,8 +375,7 @@ asm extends fun refs(self: Builder): Int { BREFS }
 /// }
 /// ```
 ///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#builderbits
+/// See: https://docs.tact-lang.org/ref/core-cells#builderbits
 ///
 asm extends fun bits(self: Builder): Int { BBITS }
 
@@ -392,13 +435,11 @@ asm extends fun beginParse(self: Cell): Slice { CTOS }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to load a reference `Cell` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to load more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceloadref
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm(-> 1 0) extends mutates fun loadRef(self: Slice): Cell { LDREF }
@@ -421,13 +462,11 @@ asm(-> 1 0) extends mutates fun loadRef(self: Slice): Cell { LDREF }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to skip a reference `Cell` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to skip more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceskipref
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends mutates fun skipRef(self: Slice) { LDREF NIP }
@@ -454,21 +493,20 @@ asm extends mutates fun skipRef(self: Slice) { LDREF NIP }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to preload a reference `Cell` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to preload more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#slicepreloadref
 /// * https://docs.tact-lang.org/book/exit-codes
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends fun preloadRef(self: Slice): Cell { PLDREF }
 
 /// Extension mutation function for the `Slice` type. Available since Tact 1.6.0.
 ///
-/// Loads a single bit from the `Slice`: if it's 1, then the referenced `Cell` is loaded and returned. If the loaded bit is 0, then nothing else is loaded and `null` is returned.
+/// Loads a single bit from the `Slice`: if it's 1, then the referenced `Cell` is loaded
+/// and returned. If the loaded bit is 0, then nothing else is loaded and `null` is returned.
 ///
 /// ```tact
 /// fun example() {
@@ -484,14 +522,12 @@ asm extends fun preloadRef(self: Slice): Cell { PLDREF }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to load a reference `Cell` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to load more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceloadmayberef
 /// * https://docs.tact-lang.org/book/exit-codes
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm(-> 1 0) extends mutates fun loadMaybeRef(self: Slice): Cell? { LDOPTREF }
@@ -514,21 +550,20 @@ asm(-> 1 0) extends mutates fun loadMaybeRef(self: Slice): Cell? { LDOPTREF }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to skip a reference `Cell` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to skip more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceskipmayberef
 /// * https://docs.tact-lang.org/book/exit-codes
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends mutates fun skipMaybeRef(self: Slice) { LDOPTREF NIP }
 
 /// Extension function for the `Slice` type. Available since Tact 1.6.0.
 ///
-/// Preloads a single bit from the `Slice`: if it's 1, then the referenced `Cell` is preloaded and returned. If the preloaded bit is 0, then `null` is returned. Doesn't modify the original `Slice`.
+/// Preloads a single bit from the `Slice`: if it's 1, then the referenced `Cell` is
+/// preloaded and returned. If the preloaded bit is 0, then `null` is returned. Doesn't modify the original `Slice`.
 ///
 /// ```tact
 /// fun examples() {
@@ -549,27 +584,19 @@ asm extends mutates fun skipMaybeRef(self: Slice) { LDOPTREF NIP }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to preload a reference `Cell` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to preload more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#slicepreloadmayberef
 /// * https://docs.tact-lang.org/book/exit-codes
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends fun preloadMaybeRef(self: Slice): Cell? { PLDOPTREF }
 
 /// Extension mutation function for the `Slice` type.
 ///
-/// Loads 0 ≤ `l` ≤ 1023 bits from the `Slice` and returns them as a separate `Slice`.
-///
-/// Attempts to specify an out-of-bounds `l` value throw an exception with
-/// [exit code 5]: `Integer out of expected range`.
-///
-/// Attempts to load more data than the `Slice` contains throw an exception with
-/// [exit code 9]: `Cell underflow`.
+/// Loads `0 ≤ l ≤ 1023` bits from the `Slice` and returns them as a separate `Slice`.
 ///
 /// ```tact
 /// fun example() {
@@ -578,26 +605,24 @@ asm extends fun preloadMaybeRef(self: Slice): Cell? { PLDOPTREF }
 /// }
 /// ```
 ///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#sliceloadbits
+/// #### Exit codes
 ///
-/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
-/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
+/// * 5: [Integer out of expected range] — Thrown when attempting to specify an out-of-bounds `l` value.
+/// * 9: [Cell underflow] — Thrown when attempting to preload more data than `Slice` contains.
+///
+/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadbits
+///
+/// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 @name(load_bits) // special treatment in Func compiler, so not replaced with asm "LDSLICEX"
 extends mutates native loadBits(self: Slice, l: Int): Slice;
 
 /// Extension function for the `Slice` type.
 ///
-/// Preloads 0 ≤ `l` ≤ 1023 bits from the `Slice` and returns them as a separate `Slice`.
+/// Preloads `0 ≤ l ≤ 1023` bits from the `Slice` and returns them as a separate `Slice`.
 /// Doesn't modify the original `Slice`.
 ///
-/// Attempts to specify an out-of-bounds `l` value throw an exception with
-/// [exit code 5]: `Integer out of expected range`.
-///
-/// Attempts to preload more data than the `Slice` contains throw an exception with
-/// [exit code 9]: `Cell underflow`.
-///
 /// ```tact
 /// fun example() {
 ///     let s: Slice = beginCell().storeInt(42, 7).asSlice();
@@ -605,24 +630,22 @@ extends mutates native loadBits(self: Slice, l: Int): Slice;
 /// }
 /// ```
 ///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#slicepreloadbits
+/// #### Exit codes
 ///
-/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
-/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
+/// * 5: [Integer out of expected range] — Thrown when attempting to specify an out-of-bounds `l` value.
+/// * 9: [Cell underflow] — Thrown when attempting to preload more data than `Slice` contains.
+///
+/// See: https://docs.tact-lang.org/ref/core-cells#slicepreloadbits
+///
+/// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 @name(preload_bits) // special treatment in Func compiler, so not replaced with asm "PLDSLICEX"
 extends native preloadBits(self: Slice, l: Int): Slice;
 
 /// Extension mutation function for the `Slice` type.
 ///
-/// Loads and returns a signed `l`-bit `Int` from the `Slice`, for 0 ≤ l ≤ 257.
-///
-/// Attempts to specify an out-of-bounds `l` value throw an exception with
-/// [exit code 5]: `Integer out of expected range`.
-///
-/// Attempts to load more data than the `Slice` contains throw an exception with
-/// [exit code 9]: `Cell underflow`.
+/// Loads and returns a signed `l`-bit `Int` from the `Slice`, for `0 ≤ l ≤ 257`.
 ///
 /// ```tact
 /// fun example() {
@@ -631,26 +654,24 @@ extends native preloadBits(self: Slice, l: Int): Slice;
 /// }
 /// ```
 ///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#sliceloadint
+/// #### Exit codes
 ///
-/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
-/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
+/// * 5: [Integer out of expected range] — Thrown when attempting to specify an out-of-bounds `l` value.
+/// * 9: [Cell underflow] — Thrown when attempting to preload more data than `Slice` contains.
+///
+/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadint
+///
+/// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 @name(load_int) // special treatment in Func compiler, so not replaced with asm "LDIX"
 extends mutates native loadInt(self: Slice, l: Int): Int;
 
 /// Extension function for the `Slice` type.
 ///
-/// Preloads and returns a signed `l`-bit `Int` from the `Slice`, for 0 ≤ l ≤ 257.
+/// Preloads and returns a signed `l`-bit `Int` from the `Slice`, for `0 ≤ l ≤ 257`.
 /// Doesn't modify the `Slice`.
 ///
-/// Attempts to specify an out-of-bounds `l` value throw an exception with
-/// [exit code 5]: `Integer out of expected range`.
-///
-/// Attempts to preload more data than the `Slice` contains throw an exception with
-/// [exit code 9]: `Cell underflow`.
-///
 /// ```tact
 /// fun example() {
 ///     let s: Slice = beginCell().storeInt(42, 7).asSlice();
@@ -658,24 +679,22 @@ extends mutates native loadInt(self: Slice, l: Int): Int;
 /// }
 /// ```
 ///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#slicepreloadint
+/// #### Exit codes
 ///
-/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
-/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
+/// * 5: [Integer out of expected range] — Thrown when attempting to specify an out-of-bounds `l` value.
+/// * 9: [Cell underflow] — Thrown when attempting to preload more data than `Slice` contains.
+///
+/// See: https://docs.tact-lang.org/ref/core-cells#slicepreloadint
+///
+/// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 @name(preload_int) // special treatment in Func compiler, so not replaced with asm "PLDIX"
 extends native preloadInt(self: Slice, l: Int): Int;
 
 /// Extension mutation function for the `Slice` type.
 ///
-/// Loads and returns an unsigned `l`-bit `Int` from the `Slice`, for 0 ≤ l ≤ 256.
-///
-/// Attempts to specify an out-of-bounds `l` value throw an exception with
-/// [exit code 5]: `Integer out of expected range`.
-///
-/// Attempts to load more data than the `Slice` contains throw an exception with
-/// [exit code 9]: `Cell underflow`.
+/// Loads and returns an unsigned `l`-bit `Int` from the `Slice`, for `0 ≤ l ≤ 256`.
 ///
 /// ```tact
 /// fun example() {
@@ -684,26 +703,24 @@ extends native preloadInt(self: Slice, l: Int): Int;
 /// }
 /// ```
 ///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#sliceloaduint
+/// #### Exit codes
 ///
-/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
-/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
+/// * 5: [Integer out of expected range] — Thrown when attempting to specify an out-of-bounds `l` value.
+/// * 9: [Cell underflow] — Thrown when attempting to preload more data than `Slice` contains.
+///
+/// See: https://docs.tact-lang.org/ref/core-cells#sliceloaduint
+///
+/// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 @name(load_uint) // special treatment in Func compiler, so not replaced with asm "LDUX"
 extends mutates native loadUint(self: Slice, l: Int): Int;
 
 /// Extension function for the `Slice` type.
 ///
-/// Preloads and returns an unsigned `l`-bit `Int` from the `Slice`, for 0 ≤ l ≤ 256.
+/// Preloads and returns an unsigned `l`-bit `Int` from the `Slice`, for `0 ≤ l ≤ 256`.
 /// Doesn't modify the `Slice`.
 ///
-/// Attempts to specify an out-of-bounds `l` value throw an exception with
-/// [exit code 5]: `Integer out of expected range`.
-///
-/// Attempts to preload more data than the `Slice` contains throw an exception with
-/// [exit code 9]: `Cell underflow`.
-///
 /// ```tact
 /// fun example() {
 ///     let s: Slice = beginCell().storeUint(42, 7).asSlice();
@@ -711,11 +728,15 @@ extends mutates native loadUint(self: Slice, l: Int): Int;
 /// }
 /// ```
 ///
-/// See:
-/// * https://docs.tact-lang.org/ref/core-cells#slicepreloaduint
+/// #### Exit codes
 ///
-/// [exit code 5]: https://docs.tact-lang.org/book/exit-codes#5
-/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
+/// * 5: [Integer out of expected range] — Thrown when attempting to specify an out-of-bounds `l` value.
+/// * 9: [Cell underflow] — Thrown when attempting to preload more data than `Slice` contains.
+///
+/// See: https://docs.tact-lang.org/ref/core-cells#slicepreloaduint
+///
+/// [Integer out of expected range]: https://docs.tact-lang.org/book/exit-codes#5
+/// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 @name(preload_uint) // special treatment in Func compiler, so not replaced with asm "PLDUX"
 extends native preloadUint(self: Slice, l: Int): Int;
@@ -725,12 +746,6 @@ extends native preloadUint(self: Slice, l: Int): Int;
 /// Loads a single bit and returns a `Bool` value from the `Slice`.
 /// Reads `true` if the loaded bit is equal to 1, and reads `false` otherwise.
 ///
-/// Attempts to load such `Bool` when the `Slice` doesn't contain it throw an exception with
-/// [exit code 8]: `Cell overflow`.
-///
-/// Attempts to load more data than the `Slice` contains throw an exception with
-/// [exit code 9]: `Cell underflow`.
-///
 /// ```tact
 /// fun example() {
 ///     let s: Slice = beginCell().storeBool(true).asSlice();
@@ -738,8 +753,13 @@ extends native preloadUint(self: Slice, l: Int): Int;
 /// }
 /// ```
 ///
-/// [exit code 8]: https://docs.tact-lang.org/book/exit-codes#8
-/// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
+/// #### Exit codes
+///
+/// * 9: [Cell underflow] — Thrown when attempting to preload more data than `Slice` contains.
+///
+/// See: https://docs.tact-lang.org/ref/core-cells#sliceloadint
+///
+/// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm(-> 1 0) extends mutates fun loadBool(self: Slice): Bool { 1 LDI }
 
@@ -761,13 +781,11 @@ asm(-> 1 0) extends mutates fun loadBool(self: Slice): Bool { 1 LDI }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to skip a `Bool` when the `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to skip more data than the `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceskipbool
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends mutates fun skipBool(self: Slice) { 1 LDI NIP }
@@ -785,20 +803,19 @@ asm extends mutates fun skipBool(self: Slice) { 1 LDI NIP }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to load a `Bool` when the `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to load more data than the `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceloadbit
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm(-> 1 0) extends mutates fun loadBit(self: Slice): Bool { 1 LDI }
 
 /// Extension mutation function for the `Slice` type.
 ///
-/// Loads and returns a serialized unsigned `Int` value in the range from 0 to 2^120 - 1 inclusive from the `Slice`. This value usually represents the amount in nanoToncoins.
+/// Loads and returns a serialized unsigned `Int` value in the range from 0 to 2^120 - 1
+/// inclusive from the `Slice`. This value usually represents the amount in nanoToncoins.
 ///
 /// ```tact
 /// fun example() {
@@ -809,20 +826,19 @@ asm(-> 1 0) extends mutates fun loadBit(self: Slice): Bool { 1 LDI }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to load an `Int` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to load more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceloadcoins
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm(-> 1 0) extends mutates fun loadCoins(self: Slice): Int { LDVARUINT16 }
 
 /// Extension mutation function for the `Slice` type. Available since Tact 1.6.2.
 ///
-/// Skips a serialized unsigned `Int` value in the range from 0 to 2^120 - 1 inclusive from the `Slice`. Similar to discarding the return value of `Slice.loadCoins()`.
+/// Skips a serialized unsigned `Int` value in the range from 0 to 2^120 - 1
+/// inclusive from the `Slice`. Similar to discarding the return value of `Slice.loadCoins()`.
 ///
 /// ```tact
 /// fun example() {
@@ -838,13 +854,11 @@ asm(-> 1 0) extends mutates fun loadCoins(self: Slice): Int { LDVARUINT16 }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to skip an `Int` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to skip more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceskipcoins
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends mutates fun skipCoins(self: Slice) { LDVARUINT16 NIP }
@@ -862,14 +876,12 @@ asm extends mutates fun skipCoins(self: Slice) { LDVARUINT16 NIP }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to load an `Int` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to load more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint16
 /// * https://docs.tact-lang.org/ref/core-cells#sliceloadcoins
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm(-> 1 0) extends mutates fun loadVarUint16(self: Slice): Int { LDVARUINT16 }
@@ -892,14 +904,12 @@ asm(-> 1 0) extends mutates fun loadVarUint16(self: Slice): Int { LDVARUINT16 }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to skip an `Int` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to skip more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceskipvaruint16
 /// * https://docs.tact-lang.org/ref/core-cells#sliceskipcoins
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends mutates fun skipVarUint16(self: Slice) { LDVARUINT16 NIP }
@@ -917,13 +927,11 @@ asm extends mutates fun skipVarUint16(self: Slice) { LDVARUINT16 NIP }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to load an `Int` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to load more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceloadvarint16
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm(-> 1 0) extends mutates fun loadVarInt16(self: Slice): Int { LDVARINT16 }
@@ -946,13 +954,11 @@ asm(-> 1 0) extends mutates fun loadVarInt16(self: Slice): Int { LDVARINT16 }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to skip an `Int` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to skip more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceskipvarint16
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends mutates fun skipVarInt16(self: Slice) { LDVARINT16 NIP }
@@ -970,20 +976,19 @@ asm extends mutates fun skipVarInt16(self: Slice) { LDVARINT16 NIP }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to load an `Int` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to load more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceloadvaruint32
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm(-> 1 0) extends mutates fun loadVarUint32(self: Slice): Int { LDVARUINT32 }
 
 /// Extension mutation function for the `Slice` type. Available since Tact 1.6.2.
 ///
-/// Skips a serialized unsigned `Int` value in the range from 0 to 2^248 − 1 inclusive from the `Slice`. Similar to discarding the return value of `Slice.loadVarUint32()`.
+/// Skips a serialized unsigned `Int` value in the range from 0 to 2^248 − 1 inclusive
+/// from the `Slice`. Similar to discarding the return value of `Slice.loadVarUint32()`.
 ///
 /// ```tact
 /// fun example() {
@@ -999,20 +1004,19 @@ asm(-> 1 0) extends mutates fun loadVarUint32(self: Slice): Int { LDVARUINT32 }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to skip an `Int` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to skip more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceskipvaruint32
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends mutates fun skipVarUint32(self: Slice) { LDVARUINT32 NIP }
 
 /// Extension mutation function for the `Slice` type. Available since Tact 1.6.0.
 ///
-/// Similar to `Slice.loadVarUint32()`, but with a different `value` range: from -2^247 to 2^247 - 1 inclusive.
+/// Similar to `Slice.loadVarUint32()`, but with a different `value` range:
+/// from -2^247 to 2^247 - 1 inclusive.
 ///
 /// ```tact
 /// fun example() {
@@ -1023,20 +1027,19 @@ asm extends mutates fun skipVarUint32(self: Slice) { LDVARUINT32 NIP }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to load an `Int` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to load more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceloadvarint32
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm(-> 1 0) extends mutates fun loadVarInt32(self: Slice): Int { LDVARINT32 }
 
 /// Extension mutation function for the `Slice` type. Available since Tact 1.6.2.
 ///
-/// Similar to `Slice.skipVarUint32()`, but with a different `value` range: from -2^247 to 2^247 - 1 inclusive.
+/// Similar to `Slice.skipVarUint32()`, but with a different `value` range:
+/// from -2^247 to 2^247 - 1 inclusive.
 ///
 /// ```tact
 /// fun example() {
@@ -1052,20 +1055,18 @@ asm(-> 1 0) extends mutates fun loadVarInt32(self: Slice): Int { LDVARINT32 }
 ///
 /// #### Exit codes
 ///
-/// * 8: [Cell overflow] — Thrown when attempting to skip an `Int` when `Slice` doesn't contain it.
 /// * 9: [Cell underflow] — Thrown when attempting to skip more data than `Slice` contains.
 ///
 /// See:
 /// * https://docs.tact-lang.org/ref/core-cells#sliceskipvaruint32
 ///
-/// [Cell overflow]: https://docs.tact-lang.org/book/exit-codes#8
 /// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends mutates fun skipVarInt32(self: Slice) { LDVARINT32 NIP }
 
 /// Extension mutation function for the `Slice` type.
 ///
-/// Loads all but the first 0 ≤ `l` ≤ 1023 bits from the `Slice`.
+/// Loads all but the first `0 ≤ l ≤ 1023` bits from the `Slice`.
 ///
 /// ```tact
 /// fun example() {
@@ -1105,13 +1106,18 @@ asm extends mutates fun skipBits(self: Slice, l: Int) { SDSKIPFIRST }
 /// }
 /// ```
 ///
+/// #### Exit codes
+///
+/// * 9: [Cell underflow] — Thrown when the `Slice` is not empty.
+///
 /// [exit code 9]: https://docs.tact-lang.org/book/exit-codes#9
+/// [Cell underflow]: https://docs.tact-lang.org/book/exit-codes#9
 ///
 asm extends fun endParse(self: Slice) { ENDS }
 
 /// Extension function for the `Slice` type. Available since Tact 1.6.0.
 ///
-/// Preloads all but the last 0 ≤ `len` ≤ 1023 bits from the `Slice`.
+/// Preloads all but the last `0 ≤ len ≤ 1023` bits from the `Slice`.
 ///
 /// ```tact
 /// fun example() {
@@ -1135,7 +1141,7 @@ asm extends fun skipLastBits(self: Slice, len: Int): Slice { SDSKIPLAST }
 
 /// Extension function for the `Slice` type. Available since Tact 1.6.0.
 ///
-/// Preloads the first 0 ≤ `len` ≤ 1023 bits from the `Slice`.
+/// Preloads the first `0 ≤ len ≤ 1023` bits from the `Slice`.
 ///
 /// ```tact
 /// fun example() {
@@ -1162,7 +1168,7 @@ asm extends fun firstBits(self: Slice, len: Int): Slice { SDCUTFIRST }
 
 /// Extension function for the `Slice` type. Available since Tact 1.6.0.
 ///
-/// Preloads the last 0 ≤ `len` ≤ 1023 bits from the `Slice`.
+/// Preloads the last `0 ≤ len ≤ 1023` bits from the `Slice`.
 ///
 /// ```tact
 /// fun example() {
@@ -1186,7 +1192,8 @@ asm extends fun lastBits(self: Slice, len: Int): Slice { SDCUTLAST }
 
 /// Extension function for the `Slice` type. Available since Tact 1.6.0.
 ///
-/// Computes and returns the `Int` depth of the `Slice`. Produces 0 if the `Slice` has no references, otherwise 1 plus the maximum of the depths of the referenced cells.
+/// Computes and returns the `Int` depth of the `Slice`. Produces 0 if
+/// the `Slice` has no references, otherwise 1 plus the maximum of the depths of the referenced cells.
 ///
 /// ```tact
 /// fun example() {
diff --git a/src/stdlib/stdlib/std/stdlib.fc b/src/stdlib/stdlib/std/stdlib.fc
index 45ff5195..4f1ceb85 100644
--- a/src/stdlib/stdlib/std/stdlib.fc
+++ b/src/stdlib/stdlib/std/stdlib.fc
@@ -670,6 +670,7 @@ int equal_slices_bits(slice a, slice b) asm "SDEQ";
 int builder_null?(builder b) asm "ISNULL";
 ;;; Concatenates two builders
 builder store_builder(builder to, builder from) asm "STBR";
+builder store_builder_ref(builder to, builder from) asm "STBREFR";
 
 ;; CUSTOM:
 
@@ -699,4 +700,4 @@ int my_storage_due() asm "DUEPAYMENT";
 tuple get_fee_configs() asm "UNPACKEDCONFIGTUPLE";
 
 ;;; Quiet versions of ~load_uint. Returns (null, 0) if load has failed and (x, -1) on success
-(slice, (int, int)) ~load_uint_quiet(slice s, int len) asm( -> 1 0 2) "LDUXQ NULLROTRIFNOT";
\ No newline at end of file
+(slice, (int, int)) ~load_uint_quiet(slice s, int len) asm( -> 1 0 2) "LDUXQ NULLROTRIFNOT";
diff --git a/src/storage/resolveErrors.spec.ts b/src/storage/resolveErrors.spec.ts
new file mode 100644
index 00000000..549de85b
--- /dev/null
+++ b/src/storage/resolveErrors.spec.ts
@@ -0,0 +1,52 @@
+import fs from "fs";
+import { resolveDescriptors } from "@/types/resolveDescriptors";
+import { openContext, parseModules } from "@/context/store";
+import { resolveStatements } from "@/types/resolveStatements";
+import { CompilerContext } from "@/context/context";
+import { resolveSignatures } from "@/types/resolveSignatures";
+import path from "path";
+import { getParser } from "@/grammar";
+import { getAstFactory } from "@/ast/ast-helpers";
+import { stdlibPath } from "@/stdlib/path";
+import type { Source } from "@/imports/source";
+import { resolveErrors } from "@/types/resolveErrors";
+
+const primitivesPath = path.join(stdlibPath, "/std/internal/primitives.tact");
+const stdlib = fs.readFileSync(primitivesPath, "utf-8");
+
+describe("resolveErrors", () => {
+    it("should throw an error", () => {
+        const src = `
+trait BaseTrait {}
+
+contract Test {
+    get fun foo(cond: Bool, error: String) {
+        require(cond, error);
+    }
+}
+`;
+
+        const expectedErrors = `<unknown>:6:23: The second parameter of "require()" must be evaluated at compile time
+  5 |     get fun foo(cond: Bool, error: String) {
+> 6 |         require(cond, error);
+                            ^~~~~
+  7 |     }
+`;
+
+        const ast = getAstFactory();
+        const sources: Source[] = [
+            { code: stdlib, path: primitivesPath, origin: "stdlib" },
+            { code: src, path: "<unknown>", origin: "user" },
+        ];
+        let ctx = openContext(
+            new CompilerContext(),
+            sources,
+            [],
+            parseModules(sources, getParser(ast)),
+        );
+        ctx = resolveDescriptors(ctx, ast);
+        ctx = resolveSignatures(ctx, ast);
+        ctx = resolveStatements(ctx);
+        expect(() => resolveErrors(ctx, ast)).toThrow(expectedErrors);
+    });
+});
diff --git a/src/types/__snapshots__/resolveDescriptors.spec.ts.snap b/src/types/__snapshots__/resolveDescriptors.spec.ts.snap
index 259ec28d..b4ee2037 100644
--- a/src/types/__snapshots__/resolveDescriptors.spec.ts.snap
+++ b/src/types/__snapshots__/resolveDescriptors.spec.ts.snap
@@ -1041,6 +1041,24 @@ exports[`resolveDescriptors should fail descriptors for struct-decl-mutually-rec
 "
 `;
 
+exports[`resolveDescriptors should fail descriptors for struct-decl-mutually-recursive-2 1`] = `
+"<unknown>:8:8: Mutually recursive types are not supported: types "A1", "A2" form a cycle
+  7 | 
+> 8 | struct A1 {
+             ^~
+  9 |   a: Int;
+"
+`;
+
+exports[`resolveDescriptors should fail descriptors for struct-decl-mutually-recursive-with-optional 1`] = `
+"<unknown>:8:8: Mutually recursive types are not supported: types "A1", "A2" form a cycle
+  7 | 
+> 8 | struct A1 {
+             ^~
+  9 |   a: Int;
+"
+`;
+
 exports[`resolveDescriptors should fail descriptors for struct-decl-remainder-in-the-middle 1`] = `
 "<unknown>:8:5: The "as remaining" field can only be the last field of the struct
   7 |     a: Int;
diff --git a/src/types/resolveDescriptors.ts b/src/types/resolveDescriptors.ts
index 11f7c71f..096b4852 100644
--- a/src/types/resolveDescriptors.ts
+++ b/src/types/resolveDescriptors.ts
@@ -2532,6 +2532,11 @@ function checkRecursiveTypes(ctx: CompilerContext): void {
                 );
             }
         }
+
+        indices.clear();
+        lowLinks.clear();
+        onStack.clear();
+        selfReferencingVertices.clear();
     }
 
     function strongConnect(struct: TypeDescription) {
diff --git a/src/types/resolveErrors.ts b/src/types/resolveErrors.ts
index eba4e5e7..8da52862 100644
--- a/src/types/resolveErrors.ts
+++ b/src/types/resolveErrors.ts
@@ -5,7 +5,11 @@ import type { FactoryAst } from "@/ast/ast-helpers";
 import { isRequire } from "@/ast/ast-helpers";
 import { traverse } from "@/ast/iterators";
 import { evalConstantExpression } from "@/optimizer/constEval";
-import { throwInternalCompilerError } from "@/error/errors";
+import {
+    TactConstEvalError,
+    throwCompilationError,
+    throwInternalCompilerError,
+} from "@/error/errors";
 import {
     getAllStaticFunctions,
     getAllTypes,
@@ -15,6 +19,7 @@ import type { AstUtil } from "@/ast/util";
 import { getAstUtil } from "@/ast/util";
 import { sha256, highest32ofSha256 } from "@/utils/sha256";
 import { ensureString } from "@/optimizer/interpreter";
+import type * as Ast from "@/ast/ast";
 
 type Exception = { value: string; id: number };
 
@@ -39,7 +44,7 @@ function resolveStringsInAST(
                 return;
             }
             const resolved = ensureString(
-                evalConstantExpression(node.args[1]!, ctx, util),
+                evaluateRequireErrorString(node.args[1]!, ctx, util),
             ).value;
             if (!exceptions.get(ctx, resolved)) {
                 const id = exceptionId(resolved);
@@ -59,6 +64,24 @@ function resolveStringsInAST(
     return ctx;
 }
 
+export function evaluateRequireErrorString(
+    expr: Ast.Expression,
+    ctx: CompilerContext,
+    util: AstUtil,
+) {
+    try {
+        return evalConstantExpression(expr, ctx, util);
+    } catch (e) {
+        if (e instanceof TactConstEvalError) {
+            throwCompilationError(
+                `The second parameter of "require()" must be evaluated at compile time`,
+                expr.loc,
+            );
+        }
+        throw e;
+    }
+}
+
 export function resolveErrors(ctx: CompilerContext, Ast: FactoryAst) {
     const util = getAstUtil(Ast);
 
diff --git a/src/types/test-failed/struct-decl-mutually-recursive-2.tact b/src/types/test-failed/struct-decl-mutually-recursive-2.tact
new file mode 100644
index 00000000..5072e5cb
--- /dev/null
+++ b/src/types/test-failed/struct-decl-mutually-recursive-2.tact
@@ -0,0 +1,16 @@
+primitive Int;
+trait BaseTrait {}
+
+struct A0 {
+  b: A1;
+}
+
+struct A1 {
+  a: Int;
+  b: A2;
+}
+
+struct A2 {
+  a: Int;
+  b: A1;
+}
diff --git a/src/types/test-failed/struct-decl-mutually-recursive-with-optional.tact b/src/types/test-failed/struct-decl-mutually-recursive-with-optional.tact
new file mode 100644
index 00000000..dab4c685
--- /dev/null
+++ b/src/types/test-failed/struct-decl-mutually-recursive-with-optional.tact
@@ -0,0 +1,16 @@
+primitive Int;
+trait BaseTrait {}
+
+struct A0 {
+  b: A1;
+}
+
+struct A1 {
+  a: Int;
+  b: A2;
+}
+
+struct A2 {
+  a: Int;
+  b: A1?;
+}



Test patch:
diff --git a/src/grammar/test/optional-map-key.fail.tact b/src/grammar/test/optional-map-key.fail.tact
new file mode 100644
index 00000000..296621f2
--- /dev/null
+++ b/src/grammar/test/optional-map-key.fail.tact
@@ -0,0 +1,5 @@
+contract TestContract {
+    m: map<Int?, Int>; // Int? is invalid for keys
+
+    receive () {}
+}
diff --git a/src/grammar/test/optional-map-value.fail.tact b/src/grammar/test/optional-map-value.fail.tact
new file mode 100644
index 00000000..d8d9ea9b
--- /dev/null
+++ b/src/grammar/test/optional-map-value.fail.tact
@@ -0,0 +1,5 @@
+contract TestContract {
+    m: map<Int, Int?>; // Int? is invalid for values
+
+    receive () {}
+}
diff --git a/src/test/e2e-emulated/builtins/require.spec.ts b/src/test/e2e-emulated/builtins/require.spec.ts
new file mode 100644
index 00000000..43da315c
--- /dev/null
+++ b/src/test/e2e-emulated/builtins/require.spec.ts
@@ -0,0 +1,67 @@
+import { toNano } from "@ton/core";
+import { Blockchain } from "@ton/sandbox";
+import {
+    Test,
+    GLOBAL_ERROR_VOTING_ENDED,
+    Test_errors_backward,
+} from "./output/require_Test";
+import { cached } from "@/test/utils/cache-state";
+import "@ton/test-utils";
+
+const deployValue = toNano("1");
+
+const setup = async () => {
+    const blockchain = await Blockchain.create();
+    blockchain.verbosity.print = false;
+    const treasury = await blockchain.treasury("treasury");
+
+    const contract = blockchain.openContract(await Test.fromInit());
+
+    const deployResult = await contract.send(
+        treasury.getSender(),
+        { value: deployValue },
+        null,
+    );
+    expect(deployResult.transactions).toHaveTransaction({
+        from: treasury.address,
+        to: contract.address,
+        success: true,
+        deploy: true,
+    });
+
+    return {
+        blockchain,
+        treasury,
+        contract,
+    };
+};
+
+describe("require", () => {
+    const state = cached(setup);
+
+    it("should throw correct error", async () => {
+        const { contract, treasury } = await state.get();
+
+        const result = await contract.send(
+            treasury.getSender(),
+            {
+                value: toNano("10"),
+            },
+            "self constant",
+        );
+        expect(result.transactions).toHaveTransaction({
+            exitCode: Test_errors_backward[Test.ERROR_VOTING_ENDED],
+        });
+
+        const result2 = await contract.send(
+            treasury.getSender(),
+            {
+                value: toNano("10"),
+            },
+            "global constant",
+        );
+        expect(result2.transactions).toHaveTransaction({
+            exitCode: Test_errors_backward[GLOBAL_ERROR_VOTING_ENDED],
+        });
+    });
+});
diff --git a/src/test/e2e-emulated/builtins/require.tact b/src/test/e2e-emulated/builtins/require.tact
new file mode 100644
index 00000000..4696f4dc
--- /dev/null
+++ b/src/test/e2e-emulated/builtins/require.tact
@@ -0,0 +1,15 @@
+const GLOBAL_ERROR_VOTING_ENDED: String = "Voting has ended!";
+
+contract Test {
+    const ERROR_VOTING_ENDED: String = "Voting has ended";
+
+    receive() {}
+
+    receive("self constant") {
+        require(false, self.ERROR_VOTING_ENDED);
+    }
+
+    receive("global constant") {
+        require(false, GLOBAL_ERROR_VOTING_ENDED);
+    }
+}
diff --git a/src/test/e2e-emulated/debug/dump.spec.ts b/src/test/e2e-emulated/debug/dump.spec.ts
index d88a4e3c..9ca62202 100644
--- a/src/test/e2e-emulated/debug/dump.spec.ts
+++ b/src/test/e2e-emulated/debug/dump.spec.ts
@@ -3,12 +3,26 @@ import { Blockchain } from "@ton/sandbox";
 import { Tester } from "./output/dump_Tester";
 import "@ton/test-utils";
 import { cached } from "@/test/utils/cache-state";
+import { setStoragePrices } from "@/test/utils/gasUtils";
 
 const deployValue = toNano("1"); // `dump` is expensive
 
 const setup = async () => {
     const blockchain = await Blockchain.create();
     blockchain.verbosity.print = false;
+
+    const config = blockchain.config;
+
+    blockchain.setConfig(
+        setStoragePrices(config, {
+            unixTimeSince: 0,
+            bitPricePerSecond: 0n,
+            cellPricePerSecond: 0n,
+            masterChainBitPricePerSecond: 0n,
+            masterChainCellPricePerSecond: 0n,
+        }),
+    );
+
     const treasury = await blockchain.treasury("treasury");
 
     const contract = blockchain.openContract(await Tester.fromInit());
diff --git a/src/test/e2e-emulated/expressions/unary-plus.spec.ts b/src/test/e2e-emulated/expressions/unary-plus.spec.ts
new file mode 100644
index 00000000..7f7f60e3
--- /dev/null
+++ b/src/test/e2e-emulated/expressions/unary-plus.spec.ts
@@ -0,0 +1,60 @@
+import { toNano } from "@ton/core";
+import { Blockchain } from "@ton/sandbox";
+import { TestContract } from "./output/unary-plus_TestContract";
+import "@ton/test-utils";
+import { cached } from "@/test/utils/cache-state";
+
+const deployValue = toNano("1");
+
+const setup = async () => {
+    const blockchain = await Blockchain.create();
+    blockchain.verbosity.print = false;
+    const treasury = await blockchain.treasury("treasury");
+
+    const contract = blockchain.openContract(await TestContract.fromInit());
+
+    const deployResult = await contract.send(
+        treasury.getSender(),
+        { value: deployValue },
+        null,
+    );
+    expect(deployResult.transactions).toHaveTransaction({
+        from: treasury.address,
+        to: contract.address,
+        success: true,
+        deploy: true,
+    });
+
+    return {
+        blockchain,
+        treasury,
+        contract,
+    };
+};
+
+describe("unary-plus", () => {
+    const state = cached(setup);
+
+    beforeEach(async () => {
+        const { contract, treasury } = await state.get();
+
+        const deployResult = await contract.send(
+            treasury.getSender(),
+            { value: toNano("10") },
+            null,
+        );
+
+        expect(deployResult.transactions).toHaveTransaction({
+            from: treasury.address,
+            to: contract.address,
+            success: true,
+        });
+    });
+
+    it("should implement unary plus operator correctly", async () => {
+        const { contract } = await state.get();
+        expect(await contract.getFoo()).toEqual(2n);
+        expect(await contract.getFoo1()).toEqual(2n);
+        expect(await contract.getFoo2()).toEqual(-1n);
+    });
+});
diff --git a/src/test/e2e-emulated/expressions/unary-plus.tact b/src/test/e2e-emulated/expressions/unary-plus.tact
new file mode 100644
index 00000000..0e958f6d
--- /dev/null
+++ b/src/test/e2e-emulated/expressions/unary-plus.tact
@@ -0,0 +1,19 @@
+contract TestContract {
+    receive() {}
+
+    get fun foo(): Int {
+        let two = 2;
+        return +two;
+    }
+
+    get fun foo1(): Int {
+        let two = 2;
+        return +(+(+two));
+    }
+
+    get fun foo2(): Int {
+        let one = 1;
+        let two = 2;
+        return one - + - + - + two;
+    }
+}
diff --git a/src/test/e2e-emulated/traits/base-trait-constant-override-1.spec.ts b/src/test/e2e-emulated/traits/base-trait-constant-override-1.spec.ts
deleted file mode 100644
index fa54770b..00000000
--- a/src/test/e2e-emulated/traits/base-trait-constant-override-1.spec.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { toNano } from "@ton/core";
-import type { SandboxContract, TreasuryContract } from "@ton/sandbox";
-import { Blockchain } from "@ton/sandbox";
-import { TraitsConstantContract } from "./output/base-trait-constant-override-1_TraitsConstantContract";
-import "@ton/test-utils";
-
-describe("base-trait-constant-override-1", () => {
-    let blockchain: Blockchain;
-    let treasure: SandboxContract<TreasuryContract>;
-    let contract: SandboxContract<TraitsConstantContract>;
-
-    beforeEach(async () => {
-        blockchain = await Blockchain.create();
-        treasure = await blockchain.treasury("treasure");
-
-        contract = blockchain.openContract(
-            await TraitsConstantContract.fromInit(),
-        );
-
-        const deployResult = await contract.send(
-            treasure.getSender(),
-            { value: toNano("0.5") },
-            null,
-        );
-
-        expect(deployResult.transactions).toHaveTransaction({
-            from: treasure.address,
-            to: contract.address,
-            success: true,
-            deploy: true,
-        });
-    });
-
-    it("should override constant correctly", async () => {
-        expect(await contract.getConstant()).toEqual(100n);
-    });
-});
diff --git a/src/test/e2e-emulated/traits/base-trait-constant-override-1.tact b/src/test/e2e-emulated/traits/base-trait-constant-override-1.tact
deleted file mode 100644
index 76a96709..00000000
--- a/src/test/e2e-emulated/traits/base-trait-constant-override-1.tact
+++ /dev/null
@@ -1,13 +0,0 @@
-trait OverrideBaseTraitConstant with BaseTrait {
-    override const storageReserve: Int = 100;
-}
-
-contract TraitsConstantContract with OverrideBaseTraitConstant {
-    receive() {
-        // deploy
-    }
-
-    get fun constant(): Int {
-        return self.storageReserve;
-    }
-}
diff --git a/src/test/e2e-emulated/traits/base-trait-constant-override-2.spec.ts b/src/test/e2e-emulated/traits/base-trait/base-trait-constant-override-2.spec.ts
similarity index 100%
rename from src/test/e2e-emulated/traits/base-trait-constant-override-2.spec.ts
rename to src/test/e2e-emulated/traits/base-trait/base-trait-constant-override-2.spec.ts
diff --git a/src/test/e2e-emulated/traits/base-trait-constant-override-2.tact b/src/test/e2e-emulated/traits/base-trait/base-trait-constant-override-2.tact
similarity index 100%
rename from src/test/e2e-emulated/traits/base-trait-constant-override-2.tact
rename to src/test/e2e-emulated/traits/base-trait/base-trait-constant-override-2.tact
diff --git a/src/test/e2e-emulated/traits/base-trait-function-override.spec.ts b/src/test/e2e-emulated/traits/base-trait/base-trait-function-override.spec.ts
similarity index 100%
rename from src/test/e2e-emulated/traits/base-trait-function-override.spec.ts
rename to src/test/e2e-emulated/traits/base-trait/base-trait-function-override.spec.ts
diff --git a/src/test/e2e-emulated/traits/base-trait-function-override.tact b/src/test/e2e-emulated/traits/base-trait/base-trait-function-override.tact
similarity index 100%
rename from src/test/e2e-emulated/traits/base-trait-function-override.tact
rename to src/test/e2e-emulated/traits/base-trait/base-trait-function-override.tact
diff --git a/src/test/e2e-emulated/traits/base-trait/empty-change.tact b/src/test/e2e-emulated/traits/base-trait/empty-change.tact
new file mode 100644
index 00000000..42fa43a9
--- /dev/null
+++ b/src/test/e2e-emulated/traits/base-trait/empty-change.tact
@@ -0,0 +1,11 @@
+import "./test-base-trait";
+
+contract EmptyChange with TestBaseTrait {
+    override const storageReserve: Int = 0;
+
+    get fun constant(): Int {
+        return self.storageReserve;
+    }
+
+    receive() {}
+}
diff --git a/src/test/e2e-emulated/traits/base-trait/empty.spec.ts b/src/test/e2e-emulated/traits/base-trait/empty.spec.ts
new file mode 100644
index 00000000..40e5f3d4
--- /dev/null
+++ b/src/test/e2e-emulated/traits/base-trait/empty.spec.ts
@@ -0,0 +1,492 @@
+import { beginCell, toNano, type Cell } from "@ton/core";
+import type { SandboxContract, TreasuryContract } from "@ton/sandbox";
+import { Blockchain } from "@ton/sandbox";
+import type {
+    Reply,
+    Notify,
+    Forward,
+    DoubleForward,
+    MessageAndForward,
+    StateInit,
+} from "./output/empty_Empty";
+
+import { Empty } from "./output/empty_Empty";
+
+import "@ton/test-utils";
+
+import { setStoragePrices } from "@/test/utils/gasUtils";
+
+const setup = async () => {
+    const deployValue = toNano("0.05");
+    const lowSendValue = toNano("0.5");
+
+    const SendPayFwdFeesSeparately = 1n;
+    const SendRemainingValue = 64n;
+
+    const initCode: Cell = beginCell().endCell();
+    const initData: Cell = beginCell().endCell();
+
+    const init: StateInit = {
+        $$type: "StateInit",
+        code: initCode,
+        data: initData,
+    };
+
+    const defaultBody = beginCell().storeStringRefTail("body").endCell();
+
+    const replyMessage: Reply = {
+        $$type: "Reply",
+        body: defaultBody,
+    };
+
+    const notifyMessage: Notify = {
+        $$type: "Notify",
+        body: defaultBody,
+    };
+
+    const blockchain: Blockchain = await Blockchain.create();
+
+    const config = blockchain.config;
+
+    blockchain.setConfig(
+        setStoragePrices(config, {
+            unixTimeSince: 0,
+            bitPricePerSecond: 0n,
+            cellPricePerSecond: 0n,
+            masterChainBitPricePerSecond: 0n,
+            masterChainCellPricePerSecond: 0n,
+        }),
+    );
+
+    const treasury: SandboxContract<TreasuryContract> =
+        await blockchain.treasury("treasury");
+
+    const contract: SandboxContract<Empty> = blockchain.openContract(
+        await Empty.fromInit(),
+    );
+
+    const deployResult = await contract.send(
+        treasury.getSender(),
+        { value: deployValue },
+        null,
+    );
+
+    expect(deployResult.transactions).toHaveTransaction({
+        from: treasury.address,
+        to: contract.address,
+        success: true,
+        deploy: true,
+    });
+
+    const balanceBefore = (await blockchain.getContract(contract.address))
+        .balance;
+
+    const forwardMessage: Forward = {
+        $$type: "Forward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+    };
+
+    const doubleForwardMessage: DoubleForward = {
+        $$type: "DoubleForward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+    };
+
+    const messageAndForwardMessage: MessageAndForward = {
+        $$type: "MessageAndForward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+        mode: SendPayFwdFeesSeparately,
+        value: 1n,
+    };
+
+    return {
+        deployValue,
+        lowSendValue,
+        SendPayFwdFeesSeparately,
+        SendRemainingValue,
+        initCode,
+        initData,
+        init,
+        defaultBody,
+        replyMessage,
+        notifyMessage,
+        forwardMessage,
+        doubleForwardMessage,
+        messageAndForwardMessage,
+        blockchain,
+        treasury,
+        contract,
+        balanceBefore,
+    };
+};
+
+describe("baseTrait without changing storageReserve", () => {
+    beforeEach(async () => {});
+
+    it("should send Reply message with argument of reply", async () => {
+        const { contract, replyMessage, lowSendValue, defaultBody, treasury } =
+            await setup();
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            replyMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: true,
+            body: defaultBody,
+        });
+    });
+
+    it("should not increase contract balance after Reply message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            replyMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            replyMessage,
+        );
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Notify message with argument of notify", async () => {
+        const { contract, treasury, lowSendValue, notifyMessage, defaultBody } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            notifyMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: false,
+            body: defaultBody,
+        });
+    });
+
+    it("should not increase contract balance after Notify message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            notifyMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            notifyMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Forward message with forward arguments", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            body: forwardMessage.body!,
+        });
+    });
+
+    it("should not increase contract balance after Forward message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Forward message with forward arguments without body", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage } =
+            await setup();
+        forwardMessage.body = null;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+        });
+    });
+
+    it("should not increase contract balance after Forward message without body", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        forwardMessage.body = null;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send init with Forward message", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage, init } =
+            await setup();
+        forwardMessage.init = init;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            body: forwardMessage.body!,
+            initCode: init.code,
+            initData: init.data,
+        });
+    });
+
+    it("should not increase contract balance after Forward message with init", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            init,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        forwardMessage.init = init;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Forward message with forward arguments without body and with init", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage, init } =
+            await setup();
+        forwardMessage.body = null;
+        forwardMessage.init = init;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            initCode: init.code,
+            initData: init.data,
+        });
+    });
+
+    it("should not increase contract balance after Forward message without body and with init", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            init,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        forwardMessage.body = null;
+        forwardMessage.init = init;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send only one message, even if Forward is called twice", async () => {
+        const { contract, treasury, lowSendValue, doubleForwardMessage } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            doubleForwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: doubleForwardMessage.bounce,
+            body: doubleForwardMessage.body!,
+        });
+
+        // treasury -> contract
+        // contract -> treasury
+        expect(result.events.length).toEqual(2);
+    });
+
+    it("should not increase balance when Forward is called twice", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            doubleForwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            doubleForwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send 2 messages: first with mode SendPayFwdFeesSeparately, second is forward", async () => {
+        const { contract, treasury, lowSendValue, messageAndForwardMessage } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            messageAndForwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: messageAndForwardMessage.bounce,
+            body: messageAndForwardMessage.body!,
+        });
+
+        // treasury -> contract
+        // contract -> treasury SendPayFwdFeesSeparately mode
+        // contract -> treasury  SendRemainingValue mode
+        expect(result.events.length).toEqual(3);
+    });
+
+    it("should decrease the balance when two messages are sent: the first with SendPayFwdFeesSeparately mode, and the second is a forward message.", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            messageAndForwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            messageAndForwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        //  SendRemainingValue mode only calculate gas correct when it only 1 message
+        expect(balance).toBeLessThan(balanceBefore);
+    });
+
+    it("should send only one message and not fail during the action phase", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            messageAndForwardMessage,
+            SendRemainingValue,
+        } = await setup();
+        messageAndForwardMessage.mode = SendRemainingValue;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            messageAndForwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: treasury.address,
+            to: contract.address,
+            success: true,
+        });
+
+        // treasury -> contract
+        // contract -> treasury  SendRemainingValue mode
+        expect(result.events.length).toEqual(2);
+    });
+});
diff --git a/src/test/e2e-emulated/traits/base-trait/empty.tact b/src/test/e2e-emulated/traits/base-trait/empty.tact
new file mode 100644
index 00000000..60c30c92
--- /dev/null
+++ b/src/test/e2e-emulated/traits/base-trait/empty.tact
@@ -0,0 +1,5 @@
+import "./test-base-trait";
+
+contract Empty with TestBaseTrait {
+    receive() {}
+}
diff --git a/src/test/e2e-emulated/traits/base-trait/emptychange.spec.ts b/src/test/e2e-emulated/traits/base-trait/emptychange.spec.ts
new file mode 100644
index 00000000..c39fd42d
--- /dev/null
+++ b/src/test/e2e-emulated/traits/base-trait/emptychange.spec.ts
@@ -0,0 +1,493 @@
+import { beginCell, toNano, type Cell } from "@ton/core";
+import type { SandboxContract, TreasuryContract } from "@ton/sandbox";
+import { Blockchain } from "@ton/sandbox";
+import type {
+    Reply,
+    Notify,
+    Forward,
+    DoubleForward,
+    MessageAndForward,
+    StateInit,
+} from "./output/empty-change_EmptyChange";
+
+import { EmptyChange } from "./output/empty-change_EmptyChange";
+
+import "@ton/test-utils";
+
+import { setStoragePrices } from "@/test/utils/gasUtils";
+
+const setup = async () => {
+    const deployValue = toNano("0.05");
+    const lowSendValue = toNano("0.5");
+
+    const SendPayFwdFeesSeparately = 1n;
+    const SendRemainingValue = 64n;
+
+    const initCode: Cell = beginCell().endCell();
+    const initData: Cell = beginCell().endCell();
+
+    const init: StateInit = {
+        $$type: "StateInit",
+        code: initCode,
+        data: initData,
+    };
+
+    const defaultBody = beginCell().storeStringRefTail("body").endCell();
+
+    const replyMessage: Reply = {
+        $$type: "Reply",
+        body: defaultBody,
+    };
+
+    const notifyMessage: Notify = {
+        $$type: "Notify",
+        body: defaultBody,
+    };
+
+    const blockchain: Blockchain = await Blockchain.create();
+
+    const config = blockchain.config;
+
+    blockchain.setConfig(
+        setStoragePrices(config, {
+            unixTimeSince: 0,
+            bitPricePerSecond: 0n,
+            cellPricePerSecond: 0n,
+            masterChainBitPricePerSecond: 0n,
+            masterChainCellPricePerSecond: 0n,
+        }),
+    );
+
+    const treasury: SandboxContract<TreasuryContract> =
+        await blockchain.treasury("treasury");
+
+    const contract: SandboxContract<EmptyChange> = blockchain.openContract(
+        await EmptyChange.fromInit(),
+    );
+
+    const deployResult = await contract.send(
+        treasury.getSender(),
+        { value: deployValue },
+        null,
+    );
+
+    expect(deployResult.transactions).toHaveTransaction({
+        from: treasury.address,
+        to: contract.address,
+        success: true,
+        deploy: true,
+    });
+
+    const balanceBefore = (await blockchain.getContract(contract.address))
+        .balance;
+
+    const forwardMessage: Forward = {
+        $$type: "Forward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+    };
+
+    const doubleForwardMessage: DoubleForward = {
+        $$type: "DoubleForward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+    };
+
+    const messageAndForwardMessage: MessageAndForward = {
+        $$type: "MessageAndForward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+        mode: SendPayFwdFeesSeparately,
+        value: 1n,
+    };
+
+    return {
+        deployValue,
+        lowSendValue,
+        SendPayFwdFeesSeparately,
+        SendRemainingValue,
+        initCode,
+        initData,
+        init,
+        defaultBody,
+        replyMessage,
+        notifyMessage,
+        forwardMessage,
+        doubleForwardMessage,
+        messageAndForwardMessage,
+        blockchain,
+        treasury,
+        contract,
+        balanceBefore,
+    };
+};
+
+describe("baseTrait with change storageReserve to 0", () => {
+    // The same logic as in the empty case
+    beforeEach(async () => {});
+
+    it("should send Reply message with argument of reply", async () => {
+        const { contract, replyMessage, lowSendValue, defaultBody, treasury } =
+            await setup();
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            replyMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: true,
+            body: defaultBody,
+        });
+    });
+
+    it("should not increase contract balance after Reply message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            replyMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            replyMessage,
+        );
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Notify message with argument of notify", async () => {
+        const { contract, treasury, lowSendValue, notifyMessage, defaultBody } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            notifyMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: false,
+            body: defaultBody,
+        });
+    });
+
+    it("should not increase contract balance after Notify message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            notifyMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            notifyMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Forward message with forward arguments", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            body: forwardMessage.body!,
+        });
+    });
+
+    it("should not increase contract balance after Forward message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Forward message with forward arguments without body", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage } =
+            await setup();
+        forwardMessage.body = null;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+        });
+    });
+
+    it("should not increase contract balance after Forward message without body", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        forwardMessage.body = null;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send init with Forward message", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage, init } =
+            await setup();
+        forwardMessage.init = init;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            body: forwardMessage.body!,
+            initCode: init.code,
+            initData: init.data,
+        });
+    });
+
+    it("should not increase contract balance after Forward message with init", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            init,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        forwardMessage.init = init;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Forward message with forward arguments without body and with init", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage, init } =
+            await setup();
+        forwardMessage.body = null;
+        forwardMessage.init = init;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            initCode: init.code,
+            initData: init.data,
+        });
+    });
+
+    it("should not increase contract balance after Forward message without body and with init", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            init,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        forwardMessage.body = null;
+        forwardMessage.init = init;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send only one message, even if Forward is called twice", async () => {
+        const { contract, treasury, lowSendValue, doubleForwardMessage } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            doubleForwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: doubleForwardMessage.bounce,
+            body: doubleForwardMessage.body!,
+        });
+
+        // treasury -> contract
+        // contract -> treasury
+        expect(result.events.length).toEqual(2);
+    });
+
+    it("should not increase balance when Forward is called twice", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            doubleForwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            doubleForwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send 2 messages: first with mode SendPayFwdFeesSeparately, second is forward", async () => {
+        const { contract, treasury, lowSendValue, messageAndForwardMessage } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            messageAndForwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: messageAndForwardMessage.bounce,
+            body: messageAndForwardMessage.body!,
+        });
+
+        // treasury -> contract
+        // contract -> treasury SendPayFwdFeesSeparately mode
+        // contract -> treasury  SendRemainingValue mode
+        expect(result.events.length).toEqual(3);
+    });
+
+    it("should decrease the balance when two messages are sent: the first with SendPayFwdFeesSeparately mode, and the second is a forward message.", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            messageAndForwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            messageAndForwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        //  SendRemainingValue mode only calculate gas correct when it only 1 message
+        expect(balance).toBeLessThan(balanceBefore);
+    });
+
+    it("should send only one message and not fail during the action phase", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            messageAndForwardMessage,
+            SendRemainingValue,
+        } = await setup();
+        messageAndForwardMessage.mode = SendRemainingValue;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            messageAndForwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: treasury.address,
+            to: contract.address,
+            success: true,
+        });
+
+        // treasury -> contract
+        // contract -> treasury  SendRemainingValue mode
+        expect(result.events.length).toEqual(2);
+    });
+});
diff --git a/src/test/e2e-emulated/traits/base-trait/negative.spec.ts b/src/test/e2e-emulated/traits/base-trait/negative.spec.ts
new file mode 100644
index 00000000..75a9531d
--- /dev/null
+++ b/src/test/e2e-emulated/traits/base-trait/negative.spec.ts
@@ -0,0 +1,493 @@
+import { beginCell, toNano, type Cell } from "@ton/core";
+import type { SandboxContract, TreasuryContract } from "@ton/sandbox";
+import { Blockchain } from "@ton/sandbox";
+import type {
+    Reply,
+    Notify,
+    Forward,
+    DoubleForward,
+    MessageAndForward,
+    StateInit,
+} from "./output/negative_Negative";
+
+import { Negative } from "./output/negative_Negative";
+
+import "@ton/test-utils";
+
+import { setStoragePrices } from "@/test/utils/gasUtils";
+
+const setup = async () => {
+    const deployValue = toNano("0.05");
+    const lowSendValue = toNano("0.5");
+
+    const SendPayFwdFeesSeparately = 1n;
+    const SendRemainingValue = 64n;
+
+    const initCode: Cell = beginCell().endCell();
+    const initData: Cell = beginCell().endCell();
+
+    const init: StateInit = {
+        $$type: "StateInit",
+        code: initCode,
+        data: initData,
+    };
+
+    const defaultBody: Cell = beginCell().storeStringRefTail("body").endCell();
+
+    const replyMessage: Reply = {
+        $$type: "Reply",
+        body: defaultBody,
+    };
+
+    const notifyMessage: Notify = {
+        $$type: "Notify",
+        body: defaultBody,
+    };
+
+    const blockchain: Blockchain = await Blockchain.create();
+
+    const config = blockchain.config;
+
+    blockchain.setConfig(
+        setStoragePrices(config, {
+            unixTimeSince: 0,
+            bitPricePerSecond: 0n,
+            cellPricePerSecond: 0n,
+            masterChainBitPricePerSecond: 0n,
+            masterChainCellPricePerSecond: 0n,
+        }),
+    );
+
+    const treasury: SandboxContract<TreasuryContract> =
+        await blockchain.treasury("treasury");
+
+    const contract: SandboxContract<Negative> = blockchain.openContract(
+        await Negative.fromInit(),
+    );
+
+    const deployResult = await contract.send(
+        treasury.getSender(),
+        { value: deployValue },
+        null,
+    );
+
+    expect(deployResult.transactions).toHaveTransaction({
+        from: treasury.address,
+        to: contract.address,
+        success: true,
+        deploy: true,
+    });
+
+    const balanceBefore = (await blockchain.getContract(contract.address))
+        .balance;
+
+    const forwardMessage: Forward = {
+        $$type: "Forward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+    };
+
+    const doubleForwardMessage: DoubleForward = {
+        $$type: "DoubleForward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+    };
+
+    const messageAndForwardMessage: MessageAndForward = {
+        $$type: "MessageAndForward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+        mode: SendPayFwdFeesSeparately,
+        value: 1n,
+    };
+
+    return {
+        deployValue,
+        lowSendValue,
+        SendPayFwdFeesSeparately,
+        SendRemainingValue,
+        initCode,
+        initData,
+        init,
+        defaultBody,
+        replyMessage,
+        notifyMessage,
+        forwardMessage,
+        doubleForwardMessage,
+        messageAndForwardMessage,
+        blockchain,
+        treasury,
+        contract,
+        balanceBefore,
+    };
+};
+
+describe("baseTrait with changing storageReserve to -1 (negative case)", () => {
+    // The same logic as in the empty case
+    beforeEach(async () => {});
+
+    it("should send Reply message with argument of reply", async () => {
+        const { contract, replyMessage, lowSendValue, defaultBody, treasury } =
+            await setup();
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            replyMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: true,
+            body: defaultBody,
+        });
+    });
+
+    it("should not increase contract balance after Reply message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            replyMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            replyMessage,
+        );
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Notify message with argument of notify", async () => {
+        const { contract, treasury, lowSendValue, notifyMessage, defaultBody } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            notifyMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: false,
+            body: defaultBody,
+        });
+    });
+
+    it("should not increase contract balance after Notify message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            notifyMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            notifyMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Forward message with forward arguments", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            body: forwardMessage.body!,
+        });
+    });
+
+    it("should not increase contract balance after Forward message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Forward message with forward arguments without body", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage } =
+            await setup();
+        forwardMessage.body = null;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+        });
+    });
+
+    it("should not increase contract balance after Forward message without body", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        forwardMessage.body = null;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send init with Forward message", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage, init } =
+            await setup();
+        forwardMessage.init = init;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            body: forwardMessage.body!,
+            initCode: init.code,
+            initData: init.data,
+        });
+    });
+
+    it("should not increase contract balance after Forward message with init", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            init,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        forwardMessage.init = init;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send Forward message with forward arguments without body and with init", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage, init } =
+            await setup();
+        forwardMessage.body = null;
+        forwardMessage.init = init;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            initCode: init.code,
+            initData: init.data,
+        });
+    });
+
+    it("should not increase contract balance after Forward message without body and with init", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            init,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        forwardMessage.body = null;
+        forwardMessage.init = init;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send only one message, even if Forward is called twice", async () => {
+        const { contract, treasury, lowSendValue, doubleForwardMessage } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            doubleForwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: doubleForwardMessage.bounce,
+            body: doubleForwardMessage.body!,
+        });
+
+        // treasury -> contract
+        // contract -> treasury
+        expect(result.events.length).toEqual(2);
+    });
+
+    it("should not increase balance when Forward is called twice", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            doubleForwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            doubleForwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(balanceBefore);
+    });
+
+    it("should send 2 messages: first with mode SendPayFwdFeesSeparately, second is forward", async () => {
+        const { contract, treasury, lowSendValue, messageAndForwardMessage } =
+            await setup();
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            messageAndForwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: messageAndForwardMessage.bounce,
+            body: messageAndForwardMessage.body!,
+        });
+
+        // treasury -> contract
+        // contract -> treasury SendPayFwdFeesSeparately mode
+        // contract -> treasury  SendRemainingValue mode
+        expect(result.events.length).toEqual(3);
+    });
+
+    it("should decrease the balance when two messages are sent: the first with SendPayFwdFeesSeparately mode, and the second is a forward message.", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            messageAndForwardMessage,
+            blockchain,
+            balanceBefore,
+        } = await setup();
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            messageAndForwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        //  SendRemainingValue mode only calculate gas correct when it only 1 message
+        expect(balance).toBeLessThan(balanceBefore);
+    });
+
+    it("should send only one message and not fail during the action phase", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            messageAndForwardMessage,
+            SendRemainingValue,
+        } = await setup();
+        messageAndForwardMessage.mode = SendRemainingValue;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            messageAndForwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: treasury.address,
+            to: contract.address,
+            success: true,
+        });
+
+        // treasury -> contract
+        // contract -> treasury  SendRemainingValue mode
+        expect(result.events.length).toEqual(2);
+    });
+});
diff --git a/src/test/e2e-emulated/traits/base-trait/negative.tact b/src/test/e2e-emulated/traits/base-trait/negative.tact
new file mode 100644
index 00000000..02255abd
--- /dev/null
+++ b/src/test/e2e-emulated/traits/base-trait/negative.tact
@@ -0,0 +1,11 @@
+import "./test-base-trait";
+
+contract Negative with TestBaseTrait {
+    override const storageReserve: Int = -1;
+
+    get fun constant(): Int {
+        return self.storageReserve;
+    }
+
+    receive() {}
+}
diff --git a/src/test/e2e-emulated/traits/base-trait/reserved.spec.ts b/src/test/e2e-emulated/traits/base-trait/reserved.spec.ts
new file mode 100644
index 00000000..02967c7a
--- /dev/null
+++ b/src/test/e2e-emulated/traits/base-trait/reserved.spec.ts
@@ -0,0 +1,512 @@
+import { beginCell, toNano, type Cell } from "@ton/core";
+import type { SandboxContract, TreasuryContract } from "@ton/sandbox";
+import { Blockchain } from "@ton/sandbox";
+import type {
+    Reply,
+    Notify,
+    Forward,
+    DoubleForward,
+    MessageAndForward,
+    StateInit,
+} from "./output/reserved_Reserved";
+
+import { Reserved } from "./output/reserved_Reserved";
+
+import "@ton/test-utils";
+
+import { setStoragePrices } from "@/test/utils/gasUtils";
+
+const setup = async () => {
+    const deployValue = toNano("0.05");
+    const lowSendValue = toNano("0.5");
+
+    const SendPayFwdFeesSeparately = 1n;
+    const SendRemainingValue = 64n;
+
+    const initCode: Cell = beginCell().endCell();
+    const initData: Cell = beginCell().endCell();
+
+    const init: StateInit = {
+        $$type: "StateInit",
+        code: initCode,
+        data: initData,
+    };
+
+    const defaultBody = beginCell().storeStringRefTail("body").endCell();
+
+    const replyMessage: Reply = {
+        $$type: "Reply",
+        body: defaultBody,
+    };
+
+    const notifyMessage: Notify = {
+        $$type: "Notify",
+        body: defaultBody,
+    };
+
+    const blockchain: Blockchain = await Blockchain.create();
+
+    const config = blockchain.config;
+
+    blockchain.setConfig(
+        setStoragePrices(config, {
+            unixTimeSince: 0,
+            bitPricePerSecond: 0n,
+            cellPricePerSecond: 0n,
+            masterChainBitPricePerSecond: 0n,
+            masterChainCellPricePerSecond: 0n,
+        }),
+    );
+
+    const treasury: SandboxContract<TreasuryContract> =
+        await blockchain.treasury("treasury");
+
+    const contract: SandboxContract<Reserved> = blockchain.openContract(
+        await Reserved.fromInit(),
+    );
+
+    const deployResult = await contract.send(
+        treasury.getSender(),
+        { value: deployValue },
+        null,
+    );
+
+    expect(deployResult.transactions).toHaveTransaction({
+        from: treasury.address,
+        to: contract.address,
+        success: true,
+        deploy: true,
+    });
+
+    const reservedAmount: bigint = Reserved.storageReserve;
+
+    const forwardMessage: Forward = {
+        $$type: "Forward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+    };
+
+    const doubleForwardMessage: DoubleForward = {
+        $$type: "DoubleForward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+    };
+
+    const messageAndForwardMessage: MessageAndForward = {
+        $$type: "MessageAndForward",
+        to: treasury.address,
+        body: defaultBody,
+        bounce: false,
+        init: null,
+        mode: SendPayFwdFeesSeparately,
+        value: 1n,
+    };
+
+    const balanceBefore = (await blockchain.getContract(contract.address))
+        .balance;
+
+    return {
+        lowSendValue,
+        SendRemainingValue,
+        initCode,
+        initData,
+        init,
+        replyMessage,
+        notifyMessage,
+        forwardMessage,
+        doubleForwardMessage,
+        messageAndForwardMessage,
+        blockchain,
+        treasury,
+        contract,
+        reservedAmount,
+        balanceBefore,
+    };
+};
+
+describe("baseTrait with changing self.storageReserve to 0.1 ton", () => {
+    beforeEach(async () => {});
+
+    it("should send Reply message with argument of reply", async () => {
+        const { contract, treasury, lowSendValue, replyMessage } =
+            await setup();
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            replyMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: true,
+            body: replyMessage.body!,
+        });
+    });
+
+    it("should reserve contract balance after Reply message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            replyMessage,
+            reservedAmount,
+            blockchain,
+        } = await setup();
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            replyMessage,
+        );
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(reservedAmount);
+    });
+
+    it("should send Notify message with argument of notify", async () => {
+        const { contract, treasury, lowSendValue, notifyMessage } =
+            await setup();
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            notifyMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: false,
+            body: notifyMessage.body!,
+        });
+    });
+
+    it("should reserve contract balance after Notify message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            notifyMessage,
+            reservedAmount,
+            blockchain,
+        } = await setup();
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            notifyMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(reservedAmount);
+    });
+
+    it("should send Forward message with forward arguments", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage } =
+            await setup();
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            body: forwardMessage.body!,
+            initCode: undefined,
+            initData: undefined,
+        });
+    });
+
+    it("should reserve contract balance after Forward message", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            reservedAmount,
+            blockchain,
+        } = await setup();
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(reservedAmount);
+    });
+
+    it("should send Forward message with forward arguments without body", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage } =
+            await setup();
+
+        forwardMessage.body = null;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            body: beginCell().endCell(),
+            initCode: undefined,
+            initData: undefined,
+        });
+    });
+
+    it("should reserve contract balance after Forward message without body", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            reservedAmount,
+            blockchain,
+        } = await setup();
+
+        forwardMessage.body = null;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(reservedAmount);
+    });
+
+    it("should send init with Forward message", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage, init } =
+            await setup();
+        forwardMessage.init = init;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            body: forwardMessage.body!,
+            initCode: init.code,
+            initData: init.data,
+        });
+    });
+
+    it("should reserve contract balance after Forward message with init", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            reservedAmount,
+            blockchain,
+            init,
+        } = await setup();
+
+        forwardMessage.init = init;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(reservedAmount);
+    });
+
+    it("should send Forward message with forward arguments without body and with init", async () => {
+        const { contract, treasury, lowSendValue, forwardMessage, init } =
+            await setup();
+
+        forwardMessage.body = null;
+        forwardMessage.init = init;
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: forwardMessage.bounce,
+            body: beginCell().endCell(),
+            initCode: init.code,
+            initData: init.data,
+        });
+    });
+
+    it("should reserve contract balance after Forward message without body and with init", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            reservedAmount,
+            blockchain,
+            init,
+        } = await setup();
+
+        forwardMessage.body = null;
+        forwardMessage.init = init;
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        expect(balance).toEqual(reservedAmount);
+    });
+
+    it("should send any message when Forward is called twice", async () => {
+        const { contract, treasury, lowSendValue, doubleForwardMessage } =
+            await setup();
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            doubleForwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: treasury.address,
+            to: contract.address,
+            success: false,
+        });
+
+        expect(result.events.length).toEqual(1); // only treasury -> contract
+    });
+
+    it("should send 2 messages: first with mode SendPayFwdFeesSeparately, second is forward", async () => {
+        const { contract, treasury, lowSendValue, messageAndForwardMessage } =
+            await setup();
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            messageAndForwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: contract.address,
+            to: treasury.address,
+            inMessageBounceable: messageAndForwardMessage.bounce,
+            body: messageAndForwardMessage.body!,
+            initCode: undefined,
+            initData: undefined,
+        });
+
+        // treasury -> contract
+        // contract -> treasury SendPayFwdFeesSeparately mode
+        // contract -> treasury  SendRemainingValue mode
+        expect(result.events.length).toEqual(3);
+    });
+
+    it("should reserve even if 2 messages are sent.", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            messageAndForwardMessage,
+            reservedAmount,
+            blockchain,
+        } = await setup();
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            messageAndForwardMessage,
+        );
+
+        const balance: bigint = (await blockchain.getContract(contract.address))
+            .balance;
+
+        //  SendRemainingValue mode only calculate gas correct when it only 1 message
+        expect(balance).toEqual(reservedAmount);
+    });
+
+    it("should not reserve if the balance before our message was greater than storageReserve", async () => {
+        const {
+            contract,
+            treasury,
+            lowSendValue,
+            forwardMessage,
+            reservedAmount,
+            blockchain,
+        } = await setup();
+
+        await contract.send(
+            treasury.getSender(),
+            { value: reservedAmount },
+            null,
+        );
+
+        await contract.send(
+            treasury.getSender(),
+            { value: lowSendValue },
+            forwardMessage,
+        );
+
+        const balance = await blockchain.getContract(contract.address);
+        expect(balance).not.toEqual(reservedAmount);
+    });
+
+    it("should failed when we have balance < storageReserved", async () => {
+        const {
+            contract,
+            treasury,
+            balanceBefore,
+            forwardMessage,
+            reservedAmount,
+        } = await setup();
+
+        const result = await contract.send(
+            treasury.getSender(),
+            { value: reservedAmount - balanceBefore - 1n },
+            forwardMessage,
+        );
+
+        expect(result.transactions).toHaveTransaction({
+            from: treasury.address,
+            to: contract.address,
+            success: false,
+        });
+
+        expect(result.events.length).toEqual(1); // only treasury -> contract
+    });
+});
diff --git a/src/test/e2e-emulated/traits/base-trait/reserved.tact b/src/test/e2e-emulated/traits/base-trait/reserved.tact
new file mode 100644
index 00000000..1a69c70b
--- /dev/null
+++ b/src/test/e2e-emulated/traits/base-trait/reserved.tact
@@ -0,0 +1,11 @@
+import "./test-base-trait";
+
+contract Reserved with TestBaseTrait {
+    override const storageReserve: Int = ton("0.1");
+
+    get fun constant(): Int {
+        return self.storageReserve;
+    }
+
+    receive() {}
+}
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
new file mode 100644
index 00000000..7398c3a6
--- /dev/null
+++ b/src/test/e2e-emulated/traits/base-trait/test-base-trait.tact
@@ -0,0 +1,69 @@
+message MessageAndForward {
+    mode: Int;
+    value: Int as coins;
+    to: Address;
+    body: Cell?;
+    bounce: Bool;
+    init: StateInit?;
+}
+
+message Reserving {
+    reserve: Int;
+    reserveMode: Int;
+    to: Address;
+    body: Cell?;
+    bounce: Bool;
+    init: StateInit?;
+}
+
+message DoubleForward {
+    to: Address;
+    body: Cell?;
+    bounce: Bool;
+    init: StateInit?;
+}
+
+message Forward {
+    to: Address;
+    body: Cell?;
+    bounce: Bool;
+    init: StateInit?;
+}
+
+message Notify {
+    body: Cell?;
+}
+
+message Reply {
+    body: Cell?;
+}
+
+trait TestBaseTrait with BaseTrait{
+    receive(msg: DoubleForward) {
+        self.forward(msg.to, msg.body, msg.bounce, msg.init);
+
+        self.forward(msg.to, msg.body, msg.bounce, msg.init);
+    }
+
+    receive(msg: Reserving) {
+        nativeReserve(msg.reserve, msg.reserveMode);
+        self.forward(msg.to, msg.body, msg.bounce, msg.init);
+    }
+
+    receive(msg: MessageAndForward) {
+        message(MessageParameters {
+            mode: msg.mode,
+            to: msg.to,
+            body: msg.body,
+            value: msg.value,
+        });
+
+        self.forward(msg.to, msg.body, msg.bounce, msg.init);
+    }
+
+    receive(msg: Forward) { self.forward(msg.to, msg.body, msg.bounce, msg.init) }
+
+    receive(msg: Notify) { self.notify(msg.body) }
+
+    receive(msg: Reply) { self.reply(msg.body) }
+}
diff --git a/src/test/gas-consumption/__snapshots__/gas.spec.ts.snap b/src/test/gas-consumption/__snapshots__/gas.spec.ts.snap
index 32065136..9436f628 100644
--- a/src/test/gas-consumption/__snapshots__/gas.spec.ts.snap
+++ b/src/test/gas-consumption/__snapshots__/gas.spec.ts.snap
@@ -43,3 +43,31 @@ exports[`benchmarks benchmark sha256: gas hash string small 1`] = `1993`;
 exports[`benchmarks benchmark sha256: gas hash string small repeated 1`] = `1993`;
 
 exports[`benchmarks benchmark sha256: gas hash string small repeated more 1`] = `1993`;
+
+exports[`benchmarks benchmark sqrt via geom mean: code size 1`] = `272`;
+
+exports[`benchmarks benchmark sqrt via geom mean: gas used for value 0 1`] = `2130`;
+
+exports[`benchmarks benchmark sqrt via geom mean: gas used for value 100 1`] = `3022`;
+
+exports[`benchmarks benchmark sqrt via geom mean: gas used for value 1000000000 1`] = `3022`;
+
+exports[`benchmarks benchmark sqrt via geom mean: gas used for value 10000000000 1`] = `3229`;
+
+exports[`benchmarks benchmark sqrt via geom mean: gas used for value 57896044618658097711785492504343953926634992332820282019728792003956564819968 1`] = `3850`;
+
+exports[`benchmarks benchmark sqrt via geom mean: gas used for value 115792089237316195423570985008687907853269984665640564039457584007913129639935 1`] = `2608`;
+
+exports[`benchmarks benchmark sqrt: code size 1`] = `272`;
+
+exports[`benchmarks benchmark sqrt: gas used for value 0 1`] = `1960`;
+
+exports[`benchmarks benchmark sqrt: gas used for value 100 1`] = `3349`;
+
+exports[`benchmarks benchmark sqrt: gas used for value 1000000000 1`] = `3442`;
+
+exports[`benchmarks benchmark sqrt: gas used for value 10000000000 1`] = `3442`;
+
+exports[`benchmarks benchmark sqrt: gas used for value 57896044618658097711785492504343953926634992332820282019728792003956564819968 1`] = `3755`;
+
+exports[`benchmarks benchmark sqrt: gas used for value 115792089237316195423570985008687907853269984665640564039457584007913129639935 1`] = `3755`;
diff --git a/src/test/gas-consumption/contracts/sqrt.tact b/src/test/gas-consumption/contracts/sqrt.tact
new file mode 100644
index 00000000..5e377a8a
--- /dev/null
+++ b/src/test/gas-consumption/contracts/sqrt.tact
@@ -0,0 +1,137 @@
+/* func reference
+int math::sqrt(int x) inline {
+  if (x == 0) { return x; }
+  int r = 181;
+  int xx = x;
+  if (xx >= 0x100000000000000000000000000000000) {
+    xx >>= 128;
+    r <<= 64;
+  }
+  if (xx >= 0x10000000000000000) {
+    xx >>= 64;
+    r <<= 32;
+  }
+  if (xx >= 0x100000000) {
+    xx >>= 32;
+    r <<= 16;
+  }
+  if (xx >= 0x10000) {
+    xx >>= 16;
+    r <<= 8;
+  }
+  r = (r * (xx + 65536)) >> 18;
+  repeat(7) {
+    r = (r + x / r) >> 1;
+  }
+  int r1 = x / r;
+  return (r < r1 ? r : r1);
+}
+*/
+
+asm fun touch(x: Int) {}
+
+message GetSqrt {
+    value: Int;
+}
+
+message GetSqrtViaGeomMean {
+    value: Int;
+}
+
+fun externalSqrt(x: Int): Int {
+    if (x == 0) {
+        return x;
+    }
+
+    let r: Int = 181;
+    let xx: Int = x;
+
+    if (xx >= 0x100000000000000000000000000000000) {
+        xx >>= 128;
+        r <<= 64;
+    }
+    if (xx >= 0x10000000000000000) {
+        xx >>= 64;
+        r <<= 32;
+    }
+    if (xx >= 0x100000000) {
+        xx >>= 32;
+        r <<= 16;
+    }
+    if (xx >= 0x10000) {
+        xx >>= 16;
+        r <<= 8;
+    }
+
+    r = (r * (xx + 65536)) >> 18;
+
+    repeat (7) {
+        r = (r + x / r) >> 1;
+    }
+
+    let r1: Int = x / r;
+
+    return (r < r1 ? r : r1);
+}
+
+asm fun log2_floor_p1(x: Int): Int { UBITSIZE }
+
+/* func reference
+;; computes sqrt(a*b) exactly rounded to the nearest integer
+;; for all 0 <= a, b <= 2^256-1
+;; may be used with b=1 or b=scale of fixed-point numbers
+
+int geom_mean(int a, int b) inline_ref {
+  ifnot (min(a, b)) {
+    return 0;
+  }
+  int s = log2_floor_p1(a);   ;; throws out of range error if a < 0 or b < 0
+  int t = log2_floor_p1(b);
+  ;; NB: (a-b)/2+b == (a+b)/2, but without overflow for large a and b
+  int x = (s == t ? (a - b) / 2 + b : 1 << ((s + t) / 2));
+  do {
+    ;; if always used with b=2^const, may be optimized to "const LSHIFTDIVC#"
+    ;; it is important to use `muldivc` here, not `muldiv` or `muldivr`
+    int q = (muldivc(a, b, x) - x) / 2;
+    x += q;
+  } until (q == 0);
+  return x;
+}
+;; integer square root, computes round(sqrt(a)) for all a>=0.
+;; note: `inline` is better than `inline_ref` for such simple functions
+int sqrt(int a) inline {
+  return geom_mean(a, 1);
+}
+*/
+
+fun geomMean(a: Int, b: Int): Int {
+    if (min(a, b) == 0) {
+        return 0;
+    }
+
+    let s: Int = log2_floor_p1(a);
+    let t: Int = log2_floor_p1(b);
+    let x: Int = (s == t ? (a - b) / 2 + b : 1 << ((s + t) / 2));
+    let q: Int = 1; // for first iteration 
+
+    do {
+        q = (muldivc(a, b, x) - x) / 2;
+        x += q;
+    } until (q == 0);
+
+    return x;
+}
+
+fun externalSqrtViaGeomMean(x: Int): Int {
+    return geomMean(x, 1);
+}
+
+contract Sqrt {
+    receive(msg: GetSqrt) {
+        touch(externalSqrt(msg.value));
+    }
+
+    receive(msg: GetSqrtViaGeomMean) {
+        touch(externalSqrtViaGeomMean(msg.value));
+    }
+}
diff --git a/src/test/gas-consumption/gas.spec.ts b/src/test/gas-consumption/gas.spec.ts
index 0e94dbe7..3c178678 100644
--- a/src/test/gas-consumption/gas.spec.ts
+++ b/src/test/gas-consumption/gas.spec.ts
@@ -24,6 +24,7 @@ import { Addresses } from "@/test/gas-consumption/contracts/output/address_Addre
 import { CodeOfVsInitOf } from "@/test/gas-consumption/contracts/output/codeOf_CodeOfVsInitOf";
 import { WithDeploy } from "@/test/gas-consumption/contracts/output/deploy_WithDeploy";
 import { WithoutDeploy } from "@/test/gas-consumption/contracts/output/deploy_WithoutDeploy";
+import { Sqrt } from "@/test/gas-consumption/contracts/output/sqrt_Sqrt";
 
 function measureGas(txs: BlockchainTransaction[]): number {
     return Number(
@@ -294,4 +295,44 @@ describe("benchmarks", () => {
         const gasUsedRaw = measureGas(deployRawResult.transactions);
         expect(gasUsedRaw).toMatchSnapshot("gas used raw deploy");
     });
+
+    const variants: [string, "GetSqrt" | "GetSqrtViaGeomMean"][] = [
+        ["sqrt via geom mean", "GetSqrtViaGeomMean"],
+        ["sqrt", "GetSqrt"],
+    ];
+
+    it.each(variants)("benchmark %s", async (name, message) => {
+        const instance = blockchain.openContract(await Sqrt.fromInit());
+
+        const testValues = [
+            0n,
+            100n,
+            toNano("1"),
+            toNano("10"),
+            2n ** 255n,
+            2n ** 256n - 1n,
+        ];
+
+        for (const value of testValues) {
+            const sendResult = await step(`${name} with value ${value}`, () =>
+                instance.send(
+                    treasure.getSender(),
+                    { value: toNano(1) },
+                    { $$type: message, value },
+                ),
+            );
+
+            expect(sendResult.transactions).toHaveTransaction({
+                from: treasure.address,
+                to: instance.address,
+                success: true,
+            });
+
+            const gasUsed = measureGas(sendResult.transactions);
+            expect(gasUsed).toMatchSnapshot(`gas used for value ${value}`);
+        }
+
+        const codeSize = instance.init!.code.toBoc().length;
+        expect(codeSize).toMatchSnapshot(`code size`);
+    });
 });
diff --git a/src/test/utils/gasUtils.ts b/src/test/utils/gasUtils.ts
new file mode 100644
index 00000000..2e22bf1c
--- /dev/null
+++ b/src/test/utils/gasUtils.ts
@@ -0,0 +1,64 @@
+// https://github.com/ton-blockchain/stablecoin-contract/blob/main/gasUtils.ts
+import {
+    beginCell,
+    Dictionary,
+    type Cell,
+    type DictionaryValue,
+} from "@ton/core";
+import type { BlockchainConfig } from "@ton/sandbox";
+
+// https://github.com/ton-blockchain/ton/blob/ed4682066978f69ffa38dd98912ca77d4f660f66/crypto/block/block.tlb#L705
+const ConfigStoragePriceIndex = 18;
+const ConfigKeyLength = 32;
+
+type StorageValue = {
+    unixTimeSince: number;
+    bitPricePerSecond: bigint;
+    cellPricePerSecond: bigint;
+    masterChainBitPricePerSecond: bigint;
+    masterChainCellPricePerSecond: bigint;
+};
+
+const storageValue: DictionaryValue<StorageValue> = {
+    serialize: (src, builder) => {
+        builder
+            .storeUint(0xcc, 8)
+            .storeUint(src.unixTimeSince, 32)
+            .storeUint(src.bitPricePerSecond, 64)
+            .storeUint(src.cellPricePerSecond, 64)
+            .storeUint(src.masterChainBitPricePerSecond, 64)
+            .storeUint(src.masterChainCellPricePerSecond, 64);
+    },
+    parse: (src) => {
+        return {
+            unixTimeSince: src.skip(8).loadUint(32),
+            bitPricePerSecond: src.loadUintBig(64),
+            cellPricePerSecond: src.loadUintBig(64),
+            masterChainBitPricePerSecond: src.loadUintBig(64),
+            masterChainCellPricePerSecond: src.loadUintBig(64),
+        };
+    },
+};
+
+export function setStoragePrices(
+    configRaw: Cell,
+    prices: StorageValue,
+): BlockchainConfig {
+    const config = configRaw
+        .beginParse()
+        .loadDictDirect(
+            Dictionary.Keys.Int(ConfigKeyLength),
+            Dictionary.Values.Cell(),
+        );
+    const storageData = Dictionary.loadDirect(
+        Dictionary.Keys.Uint(ConfigKeyLength),
+        storageValue,
+        config.get(ConfigStoragePriceIndex)!,
+    );
+    storageData.set(storageData.values().length - 1, prices);
+    config.set(
+        ConfigStoragePriceIndex,
+        beginCell().storeDictDirect(storageData).endCell(),
+    );
+    return beginCell().storeDictDirect(config).endCell();
+}